Sandbox:文件边界、失败关闭与一次性升权
工具流水线管「怎么执行」,还不回答「能不能写 /etc/passwd」。DeepSeek-Harness(dsh)用 ctx.sandbox 做同世界隔离:子进程仍在宿主机内核上,但按模式限制文件效果。强制不了就失败关闭,绝不悄悄裸奔;被拒后可带理由申请一次性升权,且必须经用户批准。
三种模式与同世界
| 模式 | 文件效果 |
|---|---|
read-only |
禁止写入(除必需的下水道路径) |
workspace-write |
只写工作区根与后端定义的临时区 |
danger-full-access |
不限制,跑原始命令 |
这是门禁卡,不是容器或微虚拟机。需要「另一个世界」时应替换 ctx.shell / ctx.fs 整套能力,而不是在 sandbox 上硬加一层假远程。
1 | - id: sandbox |
策略随调用携带:同一时刻不同消费者可用不同模式;升权重试是一次更宽策略的新调用。
拒绝、升权与 fail-closed
工作区外写入会返回统一的面向模型拒绝标记;若组合宣传了升权,还会提示带 sandbox_permissions + 非空 justification 重试。阶梯封闭:read-only → workspace-write / danger-full-access;workspace-write → danger-full-access;已是最宽则不能再升。非更宽请求不弹批准框。用户选 allowed-once 只放行这一次。
后端不可用时抛 SANDBOX_UNAVAILABLE,不会静默透传。enforcement 可为 full 或 partial(如 Windows ACL、老 Landlock);需要绝对边界的消费者应显式处理 partial。拒绝签名按后端方言匹配;运行器失败(命令没跑)与策略拒绝(命令被拦)用结构化签名区分。
策略服务 dsh-sandbox-policy 管部署默认、会话级 sandbox/mode 仅日志事件,以及每次请求前写入运行时上下文的模型可见文案。解析优先级:批准的显式模式 > 会话最后模式事件 > 部署默认。
核心在 packages/sandbox/sandbox/:confine() 要么返回强制 argv,要么失败关闭;escalation.ts 编排升权校验与批准。到此 dsh 的八块骨架——插件、配置叠层、日志、seam、Loop、LLM、工具流水线、沙箱——可以串成一条可读的运行时路径。
Sandbox:文件边界、失败关闭与一次性升权