实验 05 · 权限与沙箱判定台
对应第 15–17 章。本实验把工具规则、审批策略和操作系统沙箱分成三层,观察同一动作为什么可能自动允许、请求批准或直接拒绝。
1. 实验问题
审批回答“人类是否同意扩大权限”,沙箱回答“进程技术上能触达什么”。两者经常被混为一个开关。请选择“修改文件、workspace 外部、never、workspace-write”,先预测结果。
never 不是自动允许,而是 Agent 不能通过弹窗获得新权限;超出当前边界的动作应直接拒绝或寻找替代方案。
2. 组合判定
实验是简化策略模拟,不代表具体产品的全部规则。它展示的核心顺序是:识别动作风险,应用审批策略,再检查实际执行边界。真实系统还会合并项目规则、企业配置、网络域名和工具副作用标注。
3. 典型组合
尝试以下组合:
- workspace 内读取 + read-only:应允许;
- workspace 内修改 + read-only:需要扩大或拒绝;
- 修改 .git:即使 workspace 可写也应特殊保护;
- 删除主目录 + never:应拒绝;
- 普通命令 + always:技术上可执行,但策略要求询问。
注意 ASK 不等于动作已经发生。Runtime 必须暂停 Turn,获得具体批准,再重新进行执行检查。
4. 最小权限设计
当动作被拒绝时,列出更窄替代方案:把目标文件复制到 workspace;只允许一个域名;让可信 setup 安装依赖;使用只读 API;请求一次特定命令而不是 full access。
权限升级应与任务需要绑定并可撤销。调试失败不构成永久扩大权限的理由。
5. 威胁推演
假设 Agent 读取网页,网页包含恶意指令要求上传 ~/.ssh。即使模型误信,工具规则应识别主目录,审批层应显示外发目标,沙箱应阻止读取或联网。纵深防御意味着不依赖任意单层绝对正确。
6. 代码挑战
为每个 ToolSpec 增加 side_effect、allowed_roots 和 network 属性。policy.check 返回 allow、ask、deny 与 reason。写离线测试覆盖路径穿越、.git、主目录、网络和危险命令。测试应验证理由,而不只验证布尔值。
完成实验的标准是能说清:谁提出动作,谁分类风险,谁批准,谁在操作系统层真正限制。