Repository navigation
DeepSeek Harness:cordis 动态插件 node:vm 沙箱逃逸导致宿主机任意代码执行 #9977
dakekoputa
started this conversation in
General
Replies: 1 comment
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
DeepSeek Harness:cordis 动态插件 node:vm 沙箱逃逸导致宿主机任意代码执行
编号:VULN-4915 类型:代码注入 / 沙箱逃逸(CWE-94) 产品:deepseek-ai/deepseek-harness 验证版本:master @ 1517a4d(v0.2.1-alpha.5,2026-10-16 最新)
漏洞描述
deepseek-harness 的 cordis 动态插件机制允许模型通过工具
cordis_define提交任意 JavaScript(code.host),经cordis_run激活后在node:vm沙箱中执行。该沙箱以 Node API 陷阱(require/fetch/setTimeout调用即抛错并重定向到 cordis 服务)、不暴露process/Buffer等手段呈现"受控执行"的外观,但沙箱全局中注入了多个宿主 realm 的函数对象(harness.defineTool、harness.registerTool、btoa、TextEncoder等)。恶意或被提示注入的模型利用经典node:vm逃逸——经由harness.defineTool.constructor.constructor取得宿主 realm 的Function构造器——即可越出沙箱,获得宿主进程完整权限并执行任意命令。本漏洞已在最新 master 上实测复现:从沙箱内以宿主用户身份成功执行/bin/sh -c id。漏洞细节
packages/extensions/cordis-host-runner/src/sandbox.ts(核心)createSandbox():把宿主函数(harness.defineTool等)直接注入 vm 上下文全局——逃逸面;evaluateHostCode()(约 226 行):将模型代码原样内插进`(async () => {\n${code}\n})()`模板串后runInContext执行;vmTimeoutMs只约束同步片段;precheckCode():全链路唯一守卫,compile-only 语法门(new Function只解析不执行),任意可通过语法的代码原样放行;packages/extensions/cordis-host-runner/src/index.tsdefine():cordis_define工具入口,仅校验非空/idPrefix 格式,无任何审批;run():host-only 包(不含code.client)直接 activate 启动,用户审批只针对 client 半区。触发链:模型(或提示注入驱动模型)→
cordis_define提交恶意code.host→precheckCode语法门放行 →cordis_run(host-only,无审批)→startHost→createSandbox+evaluateHostCode→ 经宿主函数构造链逃逸 vm → 宿主进程 RCE。逃逸载荷原理(即 PoC 中的恶意"插件代码"):
漏洞危害
vmTimeoutMs对异步体无效。bash工具走沙箱执行器 + 升级审批(ctx.approval),而 cordis host 半区这条路径完全无审批即得同等甚至更强的权限——对部署者构成"动态插件是受控沙箱"的误导性安全预期。sandbox.ts模块注释与SAFETY.md中已声明该沙箱非安全边界、不得作为唯一安全控制,属已声明的设计限制而非隐藏缺陷,对外上报/CVE 价值有限;实际意义是威胁模型验证与部署加固依据(harness 必须置于一次性容器、不接触敏感凭据)。漏洞复现步骤
准备:deepseek-harness 源码(含
pnpm install后的 node_modules,需 Node ≥ 22)与 Python 3。直接运行 PoC(默认源码路径可用
DSH_SOURCE覆盖):cd /data/dopplet/data_vuln/vuln_4915 python3 deepseek_harness_vm_escape.pyPoC 用产品真实模块(
precheckCode/createSandbox/evaluateHostCode)走完整路径:先验证恶意载荷通过唯一守卫precheckCode,再在真实沙箱中执行逃逸,最后核验宿主侧命令已真实执行(/tmp/dsh_vuln4915_escape_proof.txt写入id结果)。或通过 Web 验证环境从局域网浏览器验证:
漏洞修复
node:vm作为安全边界(V8 官方立场:vm 非隔离机制)。将动态包 host 半区的执行迁入独立进程/容器——产品已有 sandbox 执行器体系(bash 工具所用),可复用;宿主与执行体间仅以 IPC 白名单协议通信。run()中 host-only 包同样走requiresApproval);All reactions