从0打造编码Agent 岔路 阅读 ≈ 15 分钟
A4 沙箱与隔离:规则拦不住一个自己写文件的 Python 脚本,谁拦? 岔路课

两道闸都开着,数据还能从哪漏出去?

数据从哪漏
规则拦了危险命令,沙箱断了写权限和未知外连,数据还是能漏——只要私有数据、不可信内容、外发能力三者同在。沙箱不挡读,读到的密钥可以经一个已被放行的域名传出去,规则和沙箱都不会拦。要收这条缝,得把每条网络连接归因到发起它的工具调用,并把外发域名收到最小。
❓

本课一问:规则拦住了危险命令,沙箱断了写权限、断了未知外连。两道闸都开着,数据还能从哪漏出去?

这一课先不碰:各家的隔离机制细节(主线第 3 课);具体的注入攻击手法(本课只讲防护结构,不写绕过做法)。

从已有出发

前三课把边界收得很紧:规则按命令文字裁决,沙箱挡写、挡未知外连。但第 2 课留了一句话——沙箱挡不住读。T9 的 r12 在四种策略下都读出了伪 HOME 里的假私钥(退出码 0,没被拦)。读到之后呢?

从已有出发 · 累计数据流 点已学环节看它回答什么
每一轮循环都经过

先自己设计:断了写权限就不会泄露

一个自然的推论:既然沙箱不让写系统文件、不让连未知外网,数据就出不去了吧?

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案断了写权限、断了未知外连,数据就出不去

这条推论漏了两点:① 沙箱挡写不挡读,模型能读到密钥、源码;② 「外发」不必是可疑的外连——把数据拼进一个对已放行域名的正常请求(比如一次 GET 的 query),两道闸看着都合法。

致命三要素:关掉任一个,链就断了

致命三要素:三样同在就危险 点圈子开关任一要素,看告警怎么消

「lethal trifecta」出自 Simon Willison(2025-06-16);「经已放行的域名外传」是 Anthropic《How we contain Claude》(2026-05-25)里的真实教训。均为公开资料,需联网;本组件不请求网络。

🎯

试三件事:① 三个都开着,看红色告警和「经已放行域名外传」的说明;② 关掉「外发能力」——链断了,这也是为什么要把外发域名收到最小;③ 关掉「不可信内容」——没有注入源,模型不会被诱导去外传。三缺一,这条外泄链就成立不了。

Codex 的做法是给外发装一个「归因」检查:网络代理把每条连接归因到发起它的那次工具调用,归因不到就拒 。Claude Code 则在 auto mode + 沙箱下支持按命令声明 allowed_domains,把可连的域名收到最小 。

常见误解

⚠
「断了写权限就不会泄露。」

泄露不需要写本地文件。它需要的是把读到的东西送出去,而「送出去」可以走任何已被放行的合法通道。所以防泄露和防写坏系统是两件事:后者靠沙箱的写边界,前者靠「收窄外发 + 连接归因 + 隔离不可信内容」。这也是为什么本章讲完沙箱,还要专门讲这一条。

证据三问

问本课的回答
① 它解决什么问题?补上「边界都设了、数据仍可能外传」这个缝
② 为什么三缺一就安全?泄露需要三要素同时成立;移除任一个(限读、隔离不可信内容、收窄外发)都能打破组合
③ 实践上怎么收?Codex 把连接归因到工具调用、归因不到就拒;Claude Code 按命令声明 allowed_domains

一句话

📌
断了写权限不等于断了泄露:私有数据、不可信内容、外发能力三者同在就危险,防泄露要靠收窄外发 + 连接归因 + 隔离不可信内容。
🚦

回到主线:第 3 课:沙箱、容器、干脆不做,各家怎么选?

你可能会问