Sandbox:文件边界、失败关闭与一次性升权

工具流水线管「怎么执行」,还不回答「能不能写 /etc/passwd」。DeepSeek-Harness(dsh)用 ctx.sandbox 做同世界隔离:子进程仍在宿主机内核上,但按模式限制文件效果。强制不了就失败关闭,绝不悄悄裸奔;被拒后可带理由申请一次性升权,且必须经用户批准。

Sandbox 模式与升权阶梯

三种模式与同世界

模式 文件效果
read-only 禁止写入(除必需的下水道路径)
workspace-write 只写工作区根与后端定义的临时区
danger-full-access 不限制,跑原始命令

这是门禁卡,不是容器或微虚拟机。需要「另一个世界」时应替换 ctx.shell / ctx.fs 整套能力,而不是在 sandbox 上硬加一层假远程。

1
2
3
4
5
6
7
8
9
- id: sandbox
name: '@deepseek-ai/dsh-sandbox-local'
- id: sandbox-policy
name: '@deepseek-ai/dsh-sandbox-policy'
config:
mode: workspace-write
workspaceRoot: !!js process.cwd()
- id: bash
name: '@deepseek-ai/dsh-bash-sandbox'

策略随调用携带:同一时刻不同消费者可用不同模式;升权重试是一次更宽策略的新调用。

拒绝、升权与 fail-closed

工作区外写入会返回统一的面向模型拒绝标记;若组合宣传了升权,还会提示带 sandbox_permissions + 非空 justification 重试。阶梯封闭:read-onlyworkspace-write / danger-full-accessworkspace-writedanger-full-access;已是最宽则不能再升。非更宽请求不弹批准框。用户选 allowed-once 只放行这一次。

后端不可用时抛 SANDBOX_UNAVAILABLE,不会静默透传。enforcement 可为 fullpartial(如 Windows ACL、老 Landlock);需要绝对边界的消费者应显式处理 partial。拒绝签名按后端方言匹配;运行器失败(命令没跑)与策略拒绝(命令被拦)用结构化签名区分。

策略服务 dsh-sandbox-policy 管部署默认、会话级 sandbox/mode 仅日志事件,以及每次请求前写入运行时上下文的模型可见文案。解析优先级:批准的显式模式 > 会话最后模式事件 > 部署默认。

核心在 packages/sandbox/sandbox/confine() 要么返回强制 argv,要么失败关闭;escalation.ts 编排升权校验与批准。到此 dsh 的八块骨架——插件、配置叠层、日志、seam、Loop、LLM、工具流水线、沙箱——可以串成一条可读的运行时路径。

Sandbox:文件边界、失败关闭与一次性升权

https://simonsu.net/2026/09/16/dsh-08-sandbox/

Author

simonisacoder

Posted on

2026-09-16

Licensed under

Comments