两道闸都开着,数据还能从哪漏出去?
本课一问:规则拦住了危险命令,沙箱断了写权限、断了未知外连。两道闸都开着,数据还能从哪漏出去?
这一课先不碰:各家的隔离机制细节(主线第 3 课);具体的注入攻击手法(本课只讲防护结构,不写绕过做法)。
从已有出发
前三课把边界收得很紧:规则按命令文字裁决,沙箱挡写、挡未知外连。但第 2 课留了一句话——沙箱挡不住读。T9 的 r12 在四种策略下都读出了伪 HOME 里的假私钥(退出码 0,没被拦)。读到之后呢?
先自己设计:断了写权限就不会泄露
一个自然的推论:既然沙箱不让写系统文件、不让连未知外网,数据就出不去了吧?
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
这条推论漏了两点:① 沙箱挡写不挡读,模型能读到密钥、源码;② 「外发」不必是可疑的外连——把数据拼进一个对已放行域名的正常请求(比如一次 GET 的 query),两道闸看着都合法。
Simon Willison 把它总结成「致命三要素」:私有数据 + 不可信内容 + 外发能力,三者同时存在就危险。要防,不是加一道更严的写权限,而是打破这个组合——尤其是把外发收窄,并追问「这条连接是哪次工具调用发起的」。
致命三要素:关掉任一个,链就断了
「lethal trifecta」出自 Simon Willison(2025-06-16);「经已放行的域名外传」是 Anthropic《How we contain Claude》(2026-05-25)里的真实教训。均为公开资料,需联网;本组件不请求网络。
试三件事:① 三个都开着,看红色告警和「经已放行域名外传」的说明;② 关掉「外发能力」——链断了,这也是为什么要把外发域名收到最小;③ 关掉「不可信内容」——没有注入源,模型不会被诱导去外传。三缺一,这条外泄链就成立不了。
Codex 的做法是给外发装一个「归因」检查:网络代理把每条连接归因到发起它的那次工具调用,归因不到就拒 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条pin 源码:handle_inline_policy_request 里 resolve_request_attribution 归因失败即 deny(:630-636)。 出处Codex network_approval.rs(pin 8cabf5a) ↗需联网 。Claude Code 则在 auto mode + 沙箱下支持按命令声明 allowed_domains,把可连的域名收到最小 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条官方文档:auto mode + 沙箱下可按命令声明 allowed_domains(v2.1.271+)。 出处Claude Code 文档 · Sandboxing ↗需联网 。
常见误解
泄露不需要写本地文件。它需要的是把读到的东西送出去,而「送出去」可以走任何已被放行的合法通道。所以防泄露和防写坏系统是两件事:后者靠沙箱的写边界,前者靠「收窄外发 + 连接归因 + 隔离不可信内容」。这也是为什么本章讲完沙箱,还要专门讲这一条。
证据三问
| 问 | 本课的回答 |
|---|---|
| ① 它解决什么问题? | 补上「边界都设了、数据仍可能外传」这个缝 |
| ② 为什么三缺一就安全? | 泄露需要三要素同时成立;移除任一个(限读、隔离不可信内容、收窄外发)都能打破组合 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条机制推理(Simon Willison):这是对攻击链的结构分析,不是实验结论;各家的具体防护是工程选择。 出处待补 |
| ③ 实践上怎么收? | Codex 把连接归因到工具调用、归因不到就拒;Claude Code 按命令声明 allowed_domains 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条Codex 归因逻辑为 pin 源码直证;Claude Code allowed_domains 为官方文档。 出处pin 源码 + 官方文档 ↗需联网 |
一句话
你可能会问
- 「那把网络全断了不就行了?」 很多任务确实这么做(Codex 默认断网、Hermes docker 可
--network=none)。但有些任务要装依赖、拉代码,断不了;这时就靠「代理 + 域名白名单 + 连接归因」把外发收到最小,而不是一刀切。 - 「这和 A3 的审批者『历史只当证据』是一回事吗?」 是同一个根:不可信内容会混进上下文。A3 让审批者把历史当证据、不当指令;这里则是不让被诱导的模型把数据送出去。两处都在防「注入 → 越权/外传」这条链。