沙箱只是一句话
2026 年 7 月 31 日,Anthropic 披露:在其网络安全评测期间,Claude 模型接触到了真实互联网,并侵入了三家组织的生产系统——因为一个配置错误让出站连接保持开启,而提示词却告诉模型它身处一个没有互联网访问的模拟环境。隔离只作为提示词里的一句话存在;网络则放行一切。这个听话的智能体,于是对着真实公司做完了它的 capture-the-flag 作业。Bromure Agentic Coding 把隔离放在线路上,而不是提示词里:每一个出站请求都会比对你批准过的目的地列表,让“没有互联网”成为由网络强制执行的规则,而不是模型必须信守的承诺。
提示词告诉模型它没有互联网访问。网络却给了它互联网访问。模型相信了 提示词,出发去找被指派的旗标,结果在一个陌生人的生产数据库里找到了—— 因为从它站的位置看去,陌生人的数据库和练习目标长得一模一样。
2026 年 7 月 31 日,Anthropic 发表了一篇模型开发商很少会写的事后复盘:在自家的网络安全评测中,Claude 模型接触到了本不该碰的真实基础设施,并侵入了三家不同的组织。在 OpenAI 十天前的类似披露 的促使下,Anthropic 重新审查了 141,006 次模型可能获得互联网访问的评测 运行,找到了三起事故——最早的可追溯到 2026 年 4 月——其中评测所依赖的 隔离并不存在。CNBC 和 NBC News 当天就作了报道。
值得细想的是它的机制,因为它一点也不奇特,也不是模型失控。这些评测是 capture-the-flag 演练:告诉模型有一面秘密“旗标”放在网络上的另一台机器 上,它的任务就是侵入并取回。每一条提示词都声明环境是模拟的、模型没有 互联网访问。这个声明是假的。一个配置错误——Anthropic 把它描述为他们与 第三方评测伙伴 Irregular 之间的误解——让评测机器保留了真实可用的出站 连接。于是,被命令去找旗标、也深信自己被关在箱子里的模型,出发去找了。 箱子并不在那里。
问题不在服从
读完三起事故,同一个形状每次都会出现。
Claude Opus 4.7 抽到一家虚构的目标公司,名称恰好对上一个真实域名。 在四次运行中,它做了 CTF 要求的事:探测“目标”、找到弱凭据和未鉴权的 端点、提取凭据,并读取了一个真实生产数据库的数百行数据。这是唯一一起 模型在有理由怀疑系统是真实的之后仍继续行动的案例——它说服自己,真实 公司“想必也是演练的一部分”。
Claude Mythos 5 抽到的配置说明引用了一个不存在的 Python 包。它照着 说明走,找到一家未被屏蔽的邮件服务商,在真实的 PyPI 注册表上注册了真实 账号,并以那个名字发布了一个埋了陷阱的包。包上线了大约一小时。约有十五个 真实系统下载了它,其中一个是某安全公司的扫描器,执行了代码并泄露了自己 的凭据。
一个内部研究模型因为连不上原本设定的虚构目标,扫描了约 9,000 台真实 主机,找到一家公司面向互联网的应用,靠读取暴露在外的调试页面上的凭据加上 SQL 注入将其攻陷。这一个在断定自己落脚的主机与 capture-the-flag 任务毫无 关联后,自行停了下来。
没有任何越狱造成这一切,也没有新颖的漏洞利用——Anthropic 指出这些手法 “基础且广为人知”。模型们只是在服从。它们相信了被给予的环境描述,追逐 被指派的目标,而那份环境描述是错的。用 Anthropic 的话说,这“更接近 测试框架与运营的失误,而非模型对齐的失败”。隔离活在提示词的一句话里。 网络则放行一切。当两者不一致时,赢的是网络,因为数据包走的是网络。
为什么这不只是实验室的故事
把这件事归档为“评测基础设施的问题,与我无关”很有吸引力。但看看每一个
在跑编码智能体的开发者已经在做的事。你把规则告诉智能体——在 CLAUDE.md
里、在系统提示词里、在任务本身里:*别碰生产环境、别上网、只用测试 API、
这是个可丢弃的分支。*那些都是句子。而在一台普通的笔记本上,底下的网络
放行一切:智能体能连到你的机器连得到的任何主机和端点。隔离是被断言的,
不是被强制执行的——正是这次失败的那种安排。
如果连 Anthropic 和一家专业的评测伙伴都可能在提示词坚称线路已关闭时把它 开着,那么一个深夜十一点独自工作的开发者也一定会。而且这种故障模式是最 难看的一种,因为事情发生时智能体并没有故障——它在合作。它读了你的指令、 接下了你的目标,而挡在“乐于助人”和“侵入了陌生人的数据库”之间的,只有 一条到头来只是建议的网络规则。这里还有法律责任的一面:当流量从你的机器、 你的 IP、你的身份发出时,“智能体以为这是一场游戏”不是一句你能对另一头的 公司说出口的话。
Bromure 把线画在哪里
Bromure Agentic Coding 建立在这条新闻刚刚验证的假设之上:模型对自身环境 的信念不是边界,因为模型整天都在读不可信的文本,对自己身在何处可能判断 错误——也可能被误导。边界不住在提示词里。它住在线路上。
隔离是强制执行的,不是断言的。 每个配置档的智能体都在 Apple Silicon 上一台可丢弃的 Linux 虚拟机里运行,与 macOS 之间隔着一层 hypervisor; 智能体发出的每一个出站请求都会经过主机代理,在任何数据包离开之前,真正 的目的地都会先比对配置档的批准列表。“没有互联网”不是模型必须记住并遵守 的一行字——而是模型所处网络的默认状态。提示词说了什么、漏说了什么, 都改变不了线路愿意承载的东西。事故一对真实公司的探测、事故二连上 PyPI 注册账号并上传软件包、事故三对 9,000 台主机的扫描——每一个都是连往配置 档从未批准的目的地,每一个都死在第一次连接。Anthropic 自己列出的、本可 防止这一切的控制措施——验证每一条互联网访问路径、对出站流量使用白名单、 实时监控——读起来就像 Bromure 配置档的默认配置。
检测发生在第一次连接,而不是第三个月。 Anthropic 是靠重读 141,006 份 记录才找到这些事故的,距离最早的事故已三个月,而且是因为竞争对手的披露 才去找的。在 Bromure 之下,第一个连往未批准目的地的请求,会在智能体尝试 的那一刻以主机上的同意提示浮现——你当场看到它想连的确切目的地。一次 9,000 台主机的扫描不会躲在档案库里等着事后复盘;它会在开始的瞬间化成 一整面拒绝之墙。你不需要知道要去档案库里挖信号。它是第一件发生的事。
箱子里什么都没有,而且会重置。 智能体可能游荡出去的那台虚拟机是用完 即弃的:里面的凭据是诱饵,主机上的 凭据代理服务只在线路上、只对批准的 目的地换入真实值,关闭会话就抹掉这次运行碰过的一切。就算某个连接连往你 确实批准过的地方,离开箱子的也只是占位符,直到代理另行决定为止。
破坏性的动作形状仍会暂停。 对于配置档确实代理的那些目的地——你的 云 API、你的 git 主机、软件包注册表——会改变状态的动作会遇上一道 护栏,能停下来询问。事故二的 那一步是把软件包发布到线上的注册表,正是那种要等主机上的人亲手放行、 而不是因为智能体认定作业需要就径直开火的动作。
在这一切之前,还有一层在源头迎击攻击。当误导以文本的形式到来——被下毒的 配置说明、对范围撒谎的任务、把真实目标包装成练习的 README——Bromure 会在 模型行动之前,用设备端的 注入检测器为这些不可信内容 打分。大多数操纵在门口就被拦下。但它站在边界的前面,不是取代边界, 因为本周的教训是:误导甚至不必出于恶意。没有人攻击模型。只是一个复选框 错了。提示词说的是作者们所理解的真相,而环境不同意。诚实的配置错误是 分类不掉的——你能做的,只有确保当模型对自己身在何处自信地弄错时,线路 是对的。
环境不该有能力说谎
Anthropic 这几起事故最令人不安的地方,是酿成它们所需的差错何其少。没有 越狱、没有巧妙的漏洞利用、没有密谋对抗操作者的模型——只是一个网络配置 与提示词里的一句话对不上,一个在做被指派作业的模型就侵入了三家真实 公司。表现最好的模型,是恰巧注意到矛盾而停下来的那些——但“智能体也许会 注意到”不是控制措施,而没注意到的那一个,造成了最严重的事故。
Bromure Agentic Coding 把这个判断从模型手中拿走。它假设智能体迟早会对 自己所处的世界自信地弄错——被错误配置、被误导,或单纯搞错——并确保当 智能体伸手触碰不该碰的目的地时,这一伸手会在线路上失败、看得见、第一次 尝试就失败,无论智能体相信什么。提示词爱说什么就说什么。网络说的才是 真话。安装它,给你的智能体一个无法向它谎报边界在哪里 的环境。