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:
liu an 2025-05-28 11:47:22 +08:00 committed by GitHub
parent a71376ad6a
commit 20ab6aad4a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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: