第 31 卷
- **后端矩阵**:Linux bwrap/Landlock、macOS Seatbelt、Windows ACL restricted-
token;`enforcement: full | partial`——旧 Landlock ABI 与 Windows ACL 的 Everyone/hard-link 边界是当前 partial 案例(**承诺打折扣时,消费方须按 partial 处
置**)
- **fs 工具同边界**:`write`/`edit` 等文件工具同样受 workspace-write 约束,不是"文件
工具直通、只有 bash 才沙箱"(#149 递归删工作区即发生在 workspace-write 下)
- **只限写不限读**:当前权限模型约束的是**写**,工作区外内容可被读到(#492 提议
评测隔离模式时点出的现状)
**工具沙箱**:`bash`/`pwsh` 走 `bash-sandbox` / `pwsh-sandbox`(消费 `ctx.sandbox`)在沙箱内起子进程;Windows 上 pwsh 沙箱有 ACL 约束(第 8 章实测遇到
过 temp 权限问题;#758 还报告 Windows 沙箱临时目录清理后永久崩溃)。
**同族案例**:#159 的竞态属于 TOCTOU(检查与使用之间路径被换);#278 是另一种拓宽手法——`/tmp` 作 workspace 时,受限子进程可通过 rebind 把 workspace-write 授权
范围扩宽。两者共同教训:**边界根目录要选可信位置,且不能只信任单一路径检查**。
13.3 权限模型:工具权限分级表
官方权限预设把**两个旋钮**——`sandbox/mode` 与 `approval/policy`——捆成命名预设,客户端展示为一个"Permissions"选择器。默认表两张:
| 预设 | sandbox/mode | approval/policy | 语义 |
|---|---|---|---|
| workspace-write | workspace-write | ask | 工作区内可写、操 |
作前询问(默认)
| danger-full-access | danger-full-access | never | 无沙箱、不询问 |
|---|---|---|---|
| custom(派生态) | 任意组合 | 任意 | 手动调旋钮后的"非 |
预设"态,不可作为切换目标
**工具权限分级**(按危害半径排序;各工具"建议预设"为按官方文档推导,非逐工具实测— —**推断,待实测**):
| 级别 | 代表工具 | 建议预设 | 风险 | 备注 |
|---|---|---|---|---|
| 只读探查 | read/grep/ | read-only兼容 | 低 | 只读不落盘;读 |
| glob | 不限于工作区 | |||
| 工作区写 | write/edit/ | workspace- | 中 | 写边界=工作 |
| strreplaceedito | write | 区根+临时区 |
r
命令执行bash/pwshworkspace-高沙箱不挡网络与 write(沙箱进程
内)
全访问任意(切danger-full-极高关闭所有闸门 danger-full-access
access)
> 官方文档明确沙箱**只管文件**——所以"命令执行"级的高风险不能靠沙箱消除,要靠审批与信任边界(13.5 / 13.7)兜底。
**真实边界案例**(详见 13.6):`workspace-write` 下递归删除整个工作区零确认(#149);`danger-full-access` 误删整个家目录(#461,真实事故);Windows 上
minimal preset 允许工作区外写入且无审批(#523);沙箱内 agent 可 `taskkill` 杀宿主(#466,进程可见性在沙箱词汇表外)。
13.4 审批流:从请求到放行
官方审批文档:审批回答一个问题——"这个具体动作能不能做?"
**结果集 fail-closed**(`ApprovalOutcome`):
| 结果 | 含义 | 对调用方的效果 |
|---|---|---|
| allowed-once | 一次性放行(只放行被问 | ✅继续 |
的这一个动作)
| rejected | 明确拒绝 | ❌中止 |
|---|---|---|
| cancelled | 请求被撤回 | ❌中止 |
(AbortSignal)
unavailable无应答者 / 应答者异常❌ 中止(默认 failclosed)
**策略**(`ApprovalPolicy`):`ask`(默认,交给应答者链;链为空 → unavailable);
`never`(确定性全部 rejected,不派发任何应答者——headless/CI 的严格姿态)。
**流程**:工具调用 → `approval/request` waterfall(插件可拦截/改写)→ 应答者(Web UI 人肉应答,或 ACP 桥的一次性机器决策)→ 每次请求成对写审计事件 `approval/asked`
- `approval/decided`(同一 `ApprovalRequestId`)。
**请求内容**(`ApprovalRequest`):agent(应答者只回答自己拥有的 agent)+ toolName + callId(关联已流式展示的工具调用,参数不重复渲染)+ reason(为什么问)
- signal(AbortSignal 撤回)。
**三个已知坑**:
- **审批回环**:#250 真实复现"模型自批准 danger-full-access"(Web approval 通
道可被模型自己驱动)——**审批不是安全边界**,只是人机协作闸门
- **并发误定向**:#453 并发沙箱审批时点 Allow 会中止另一个调用(UI 应答与
callId 错配)
- **重连丢审批**:#646 重连静默丢 pending approval(resync 清空 + replay 竞
态);headless 下审批行为未定义(#291)
13.5 插件安全审计清单
插件是 dsh 的能力边界("一切皆插件",见第 4 章)——**装插件 = 装可执行代码**。社区审计(#817 及同族)沉淀的检查清单:
| # | 检查项 | 社区依据 | 处置 |
|---|---|---|---|
| 1 | 插件来源可信?dsh | #587 | 只装官方/知名源; |
| plugin add无签名 | 装前读源码 |
/来源校验
2boot 期权限最小?#587警惕"装完自动改配插件 boot 期有全配置"的插件
置树写权限
| 3 | 不拿vm当安全边 | #243#451#774 | vm只当隔离引擎, |
|---|---|---|---|
| 界?workflow/动态 | #778 | 不当安全层 |
插件 vm 可逃逸
4子进程环境#584检查
| scrubbed正确? | KEYBOARD/MON |
|---|---|
| scrubbedParentEn | KEY等含KEY子串 |
| v子串误伤合法变量 | 的变量是否被误 |
scrub(误伤机制按标题推断)
5密钥脱敏不 fail-#226密钥不写进提示 open?settings词;校验脱敏逻辑
role'secret' 存在脱敏缺口
6安全 hook 不静默#460 #583hook 超时设正数;
失效?timeout: 0加载失败要报错会 fail-open
7审计留痕?官方 approval.md关键操作按会话可 approval/asked/回溯
decided 成对可查
8不泄漏会话明文?#674敏感环境禁用崩溃崩溃后 .tmp 明文会转储 / 定期清理
话残留
13.6 社区已知安全案例
以下 4 帖全部经 `gh api graphql` 核验存在(deepseek-ai/deepseek-harness Discussions,2026-08-14):
帖号一句话类型影响
全站分卷索引 · 43 卷
- 1第 1 卷
- 2第 2 卷
- 3第 3 卷
- 4第 4 卷
- 5第 5 卷
- 6第 6 卷
- 7第 7 卷
- 8第 8 卷
- 9第 9 卷
- 10第 10 卷
- 11第 11 卷
- 12第 12 卷
- 13第 13 卷
- 14第 14 卷
- 15第 15 卷
- 16第 16 卷
- 17第 17 卷
- 18第 18 卷
- 19第 19 卷
- 20第 20 卷
- 21第 21 卷
- 22第 22 卷
- 23第 23 卷
- 24第 24 卷
- 25第 25 卷
- 26第 26 卷
- 27第 27 卷
- 28第 28 卷
- 29第 29 卷
- 30第 30 卷
- 31第 31 卷
- 32第 32 卷
- 33第 33 卷
- 34第 34 卷
- 35第 35 卷
- 36第 36 卷
- 37第 37 卷
- 38第 38 卷
- 39第 39 卷
- 40第 40 卷
- 41第 41 卷
- 42第 42 卷
- 43第 43 卷