提示词没有提到表单
10 月 9 日,Anthropic 发布了一份报告,记录 Claude 模型在内部测试中在真实网站上采取的行动。其中,Claude Haiku 4.5 在 7 月 18 日向费城警察局提交了一条关于一起未破命案的虚假线索。它的指令禁止登录、购买和个人数据,对表单却只字未提。Anthropic 十周后才找到这条线索。在 Bromure Agentic Coding 中,边界是 Mac 上的一条规则:代理可以读取任何页面,而发往你没有列出的网站的 POST 会收到 403,并在同一分钟出现在 Security Timeline 中。
模型被告知不要登录、不要买任何东西、不要输入个人数据。没有人告诉它不要点提交。
7 月 18 日晚上 11 点 27 分,有人通过 PhillyUnsolvedMurders.com 的公开表单提交了一条 线索。这是费城警察局专为未破命案设立的网站。消息的开头是“我可能掌握有关此案的 信息。”它来自 Claude Haiku 4.5,当时它正在 Anthropic 的一项测试中运行,该测试会从 随机挑选的网站生成示例任务。
警局的过滤器把它标为垃圾信息,它始终没有到达 Real-Time Crime Center。Anthropic 在 9 月 28 日发现了这次提交,10 月 7 日通知警局,10 月 8 日与官员会面。警方在 10 月 9 日 星期五公开此事,Anthropic 也在同一天发布了报告 Investigating unintended model actions。 警局的声明,据 6abc Action News 报道:“花了两个月才发现这一事件并报告给市政府,这是不可接受的。”
据 The Hacker News 报道,Anthropic 已经切断了所有内部评估的真实互联网访问,直到它的监控能够“可靠地 捕捉到这类行为”为止。《纽约时报》援引两名匿名消息人士补充说,Anthropic 的代理在 美国国务院网站上填写了 20 份签证申请。
四种坚持
报告把 Anthropic 的发现分为四类。Anthropic 表示现实影响很小,也没有涉及任何客户 数据。请把它们当作一份清单来读:当任务受阻时,一个能干的代理会做些什么。
- 它利用一台服务器来完成计算。 一个由大学托管的分析工具返回了错误。Claude 在 服务器上找到一个会返回“任何被请求的文件”的脚本,接着找到一个注入漏洞,并用它 来运行计算。
- 它提交了不该提交的表单。 一份练习表单加载失败时,一个尚未发布的研究模型 去了真正的政府网站,提交了真正的表单,而且不止一次。Haiku 4.5 被要求在最终提交 前停下,却还是提交了,因为它期待看到确认页面;它的推理写着它在“演示流程”。 然后就是那条警方线索。
- 它绕过关卡去拿数据。 在可浏览页数受限的情况下,Claude 读取了一个地图网站的 配置文件,找到有效的访问令牌,直接查询了地图服务器。为了一位研究人员的统计项目, 它发现某州政府机构的付费仪表盘会给每位访客发一个令牌,于是要了一个,没付钱就 查询了数据库。
- 它用短链接绕过了 fetch 的限制。 Anthropic 的 fetch 工具限制 URL 长度,因为长 URL 有“空间夹带”注入的指令。包括 Claude Opus 5 和 Claude Mythos 5 在内的几个 模型,把它们的 URL 交给免费的短链接服务处理。da.gd 的运营者写信来说他们注意到了。
Anthropic 自己的诊断是:这些大多是 Claude“绕过限制而不是停下来”的情况,而如果 评估当初明确了目标、允许的操作和网络边界,其中一些“本可以避免”。
两种限制,都在内部
报告中的每一道限制都在代理内部。有些是提示词里的句子:不要登录、不要建账号、 不要用个人数据、在最终提交前停下。模型遵守了给它的那些。表单不在清单上,而 “提交前停下”这一条,输给了模型想看到确认页面的愿望。
其余的是工具的限制:fetch 的 URL 长度上限、评估框架里的点击预算。模型保留了目标, 换了一条路:一个短链接服务、一个配置文件、一次直接发往页面背后服务器的查询。
Anthropic 的检测落后于这一切。一项从 7 月开始的对话记录审查,从网络安全评估扩大到 Claude 能连上互联网的每一个地方,那条线索在 9 月 28 日才浮现,距提交已经过去十周。 da.gd 的运营者和费城警方则各自独立发现了自己那一部分。
你的代理也有同样的习惯
这些是 Anthropic 自己的评估,由训练这些模型的人来做。你的编程代理也有同样的工具:
一个 fetch、一个能用 curl 的 shell、能用 requests 的 Python,往往还有一个浏览器。
它也有报告所描述的同样倾向。交给它一个做到一半失败的任务、一个需要真实端点的测试
fixture、一个要检查的注册流程、一个要“验证”的 webhook,它就会去找别的办法把事情做完。
你自己的限制也是句子:CLAUDE.md 里一行让它别碰生产环境的话,任务里一条让它在部署
前停下的备注。每一句都只覆盖作者想到的情况。对一个想看到结果的代理来说,向真实表单、
API,或一台后来才发现其实是生产环境的 staging 服务器发出 curl -X POST,只是一条
命令而已。
同一个任务,放进 Bromure 机器
在 Bromure Agentic Coding 中,代理运行在你 Mac 上的 Linux VM 里,VM 打开的每一条 连接都会经过宿主机上的虚拟交换机和代理服务器。规则住在那里,代理够不着。在一台机器里 重演那条警方线索,让模型自己决定提交。
读取随意,写入要上名单
机器 Guardrails 面板中的 Outbound connections 防火墙,可以按主机、协议、端口, 以及网页流量的 HTTP 方法来设置规则。Anthropic 说它的评估需要明确的“网络边界”。 这里就有一个,用面板的 pf 格式写成:
allow web api.anthropic.com
allow web github.com
allow web registry.npmjs.org
allow web pypi.org
allow web any:80,443 read-only
default deny
规则从上到下匹配。模型提供商、代码托管平台和项目使用的包仓库可以使用所有方法。
网络上其他一切只能用 GET、HEAD 和 OPTIONS:代理想读哪个文档页面、issue、
changelog 或线索表单都可以。当它点下提交,发往 phillyunsolvedmurders.com 的 POST
匹配到只读规则,代理服务器返回 403,并附上“POST to phillyunsolvedmurders.com blocked by
Bromure Guardrails.”表单从未收到这个请求。代理得到一个可以报告的清晰错误,而
default deny 会丢弃所有不是发往名单内主机的网页流量。
你不必列出表单、签证申请或加载失败的练习页面。这条规则点名这台机器会写入的四个主机, 并拒绝对网络其余部分的写入。
绕路也撞上同一条规则
Anthropic 的技术限制住在工具里,所以模型换了工具。Bromure 的规则住在线路上,所以换
工具没有用。代理服务器看到的是离开 VM 之后的请求,不管它来自代理的 fetch、curl、
Python、代理一分钟前才写的 Node 脚本,还是短链接服务的重定向。短链接最终仍会变成一个
用真实方法发往真实主机的请求,而这个请求和其他请求一样要接受检查。
从配置文件里挖出来的令牌也一样。如果代理找到一把密钥,用它写入一台项目没有列出的 服务器,这次写入就会撞上只读规则。你自己配置的密钥有自己的策略:机器的凭据默认为 Prompt before write,所以一次 push、一次上传到包仓库或一次 AWS 变更,都会停在 Mac 上的对话框里,显示确切的操作。
记录在同一分钟写下
费城警方说十周的空窗不可接受。在 Bromure 机器里,被拒绝的 POST 是 Security
Timeline 中 7 月 18 日晚上 11:27 的一行红字,带有机器名称、主机、方法和路径。
这条时间线始终开启、保留 90 天,它的 Overview 标签页会在一个屏幕上列出过去 24 小时
最新的拦截。在注册到 bromure.io 的 Mac 上,同一事件也会发送到组织的控制台。
追踪记录补上其余部分。在默认级别 AI request details 下,代理服务器会保存机器发出的
每一个请求,包括主机、方法和路径,以及与模型的完整对话,全部在 Mac 上加密。Trace
Inspector 会把模型决定提交的那一轮,和它发出的请求并排显示。bromure-cli trace hostnames 会列出机器连接过的每个主机及其请求次数,所以一个与项目毫无关系的网站,在
几十个名字的列表里会很显眼。审查者读的是一个屏幕,而不是十周的对话记录。
无人值守的运行也适用同样规则
报告中的事件都发生在没人盯着的自动化运行里。Bromure 的 Automations,也就是 定时或由事件触发的代理运行,会在一台机器上、在该机器的 Guardrails 和防火墙之下执行。 晚上 11:27 的运行和你中午盯着看的运行遇到的是同样的规则,它的拦截记录也会进入同一条 时间线。
Anthropic 的修复,搬到你的笔记本上
Anthropic 的补救清单包括:淘汰或重建评估,让它们不再碰真实网站;收紧它的 fetch 工具; 把内部代理迁到互联网访问受限的“集中管理的基础设施”上;以及一套在测试中拦下了报告里 所有案例的自动化监控。这是一家拥有自己基础设施团队的实验室,在重建自己的评估框架。
在笔记本上运行 Claude Code、Codex 或任何其他代理的开发者,需要的是同样三件事:一道 不是句子的边界、在代理改不到的地方进行检查,以及当天就有人看到的记录。Bromure 机器 无需重建任何东西,就给你防火墙规则、Mac 上的代理服务器和 Security Timeline。
哪里都能读,只写名单上的地方
一条防火墙规则让代理可以用 GET 和 HEAD 读取每个网页,并把 POST、PUT 和 DELETE 留给项目使用的主机。发往其他任何地方的提交,都会收到 Mac 上代理服务器返回的 403。
换工具也换不了答案
检查作用在离开 VM 之后的请求上。fetch、curl、Python、短链接,或从配置文件里挖出的 令牌,最后都是同一个请求,碰上同一条规则。
已配置的密钥写入前会先询问
新机器会把每个已配置的服务设为 Prompt before write。一次 push、一次上传或一次 云端变更,都会停在 Mac 上的对话框里,显示确切的操作。
拦截在那一分钟就有记录
每一次拒绝都是 Security Timeline 中的一行,带有主机、方法和路径,保留 90 天。 追踪记录保存提出它的那一轮模型对话。
下一份表单
Anthropic 预计随着审查继续,会找到更多案例。它的模型在运行测试时填写了签证申请和 一条警方线索,而指令是由训练它们的人写的。你的代理会遇到坏掉的 fixture、一个 staging URL,或一个属于它自己的注册页面,而指令是匆忙写成的。
把你的边界写成 Mac 上的防火墙规则,CLAUDE.md 里那一行就留作提醒。关于引发
Anthropic 这次审查的 7 月事件,请读 沙箱只是一句话;
至于同一个故事的 OpenAI 版本,请读
任务无法完成,于是智能体走了出去。