mirror of
https://git.mirrors.martin98.com/https://github.com/infiniflow/ragflow.git
synced 2025-08-13 22:35:53 +08:00
Fix: patch SSTI vulnerability in template rendering (#7905)
### What problem does this PR solve? [[Critical] RagFlow has a SSTI, which can lead to Remote Code Execution (RCE).](https://github.com/infiniflow/ragflow/security/advisories/GHSA-mrf5-7w8r-8x88#event-463508) ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
parent
a71376ad6a
commit
20ab6aad4a
@ -15,8 +15,11 @@
|
|||||||
#
|
#
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from jinja2 import StrictUndefined
|
||||||
|
from jinja2.sandbox import SandboxedEnvironment
|
||||||
|
|
||||||
from agent.component.base import ComponentBase, ComponentParamBase
|
from agent.component.base import ComponentBase, ComponentParamBase
|
||||||
from jinja2 import Template as Jinja2Template
|
|
||||||
|
|
||||||
|
|
||||||
class TemplateParam(ComponentParamBase):
|
class TemplateParam(ComponentParamBase):
|
||||||
@ -95,13 +98,15 @@ class Template(ComponentBase):
|
|||||||
|
|
||||||
result = ""
|
result = ""
|
||||||
if "content" in out.columns:
|
if "content" in out.columns:
|
||||||
result = "\n".join(
|
result = "\n".join([o if isinstance(o, str) else str(o) for o in out["content"]])
|
||||||
[o if isinstance(o, str) else str(o) for o in out["content"]]
|
|
||||||
)
|
|
||||||
|
|
||||||
self.make_kwargs(para, kwargs, result)
|
self.make_kwargs(para, kwargs, result)
|
||||||
|
|
||||||
template = Jinja2Template(content)
|
env = SandboxedEnvironment(
|
||||||
|
autoescape=True,
|
||||||
|
undefined=StrictUndefined,
|
||||||
|
)
|
||||||
|
template = env.from_string(content)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
content = template.render(kwargs)
|
content = template.render(kwargs)
|
||||||
@ -114,19 +119,13 @@ class Template(ComponentBase):
|
|||||||
v = json.dumps(v, ensure_ascii=False)
|
v = json.dumps(v, ensure_ascii=False)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
content = re.sub(
|
content = re.sub(r"\{%s\}" % re.escape(n), v, content)
|
||||||
r"\{%s\}" % re.escape(n), v, content
|
content = re.sub(r"(#+)", r" \1 ", content)
|
||||||
)
|
|
||||||
content = re.sub(
|
|
||||||
r"(#+)", r" \1 ", content
|
|
||||||
)
|
|
||||||
|
|
||||||
return Template.be_output(content)
|
return Template.be_output(content)
|
||||||
|
|
||||||
def make_kwargs(self, para, kwargs, value):
|
def make_kwargs(self, para, kwargs, value):
|
||||||
self._param.inputs.append(
|
self._param.inputs.append({"component_id": para["key"], "content": value})
|
||||||
{"component_id": para["key"], "content": value}
|
|
||||||
)
|
|
||||||
try:
|
try:
|
||||||
value = json.loads(value)
|
value = json.loads(value)
|
||||||
except Exception:
|
except Exception:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user