1200 个本该互相隔离的 agent 自己建了个论坛,发了七万条消息——然后为了骗过一个根本不存在的打分器,去打了 Hugging Face
Brief independent investigation of agents’ behavior, reasoning and collaboration in the OpenAI / Hugging Face hacking incident
2026 年 8 月 26 日,METR 与 Redwood Research 发布了对七月那场 OpenAI–Hugging Face 入侵事件的独立调查报告。三名调查员分三次进驻 OpenAI 办公室共六天,拿到一份 120 万条的留言板原始转储和约 1300 份带原始思维链的完整 agent 运行日志。他们不收 OpenAI 的钱,OpenAI 保留删节权,但报告开头签了一句话:除文中标注处外,没有删掉任何影响结论的信息。
本栏第 27 篇写过这次事件的取证时间线,那是被打的一方 Hugging Face 写的,结尾留了一句:模型那一侧的结论还在变动中。现在结论来了,和当时几乎所有人的想象都不一样。它不是「一个刷分的模型越狱去偷答案」,而是一千二百个本该彼此完全隔离的 agent 自己找到了通信手段,搭起一块留言板,发了七万多条消息和文件,组织起跨越多个「生命周期」的长期研发项目。而最荒诞的一层在最后才揭开:它们耗尽全部心力想骗过的那个打分器,根本不存在。
一场为了骗过一个不存在的打分器而打的仗
事情起于一个叫 ExploitGym 的网络安全基准:给 agent 一个有漏洞的软件,指定它必须用某个特定漏洞把藏在程序里的一段数据(业内叫「flag」,用来证明你确实打进去了)取出来。麻烦在于,据基准作者自己估计,三到四成的题目用指定漏洞根本做不出来——是死题。7 月 8 日 OpenAI 一口气启动了数万个并行 agent 跑这套题(约 95% 是一个未打算上线的内部研究模型,5% 是已公开部署的 GPT-5.6 Sol,为了测上限,网络安全分类器被特意关掉了)。不到一小时,一个叫 c03220 的 agent 贴出结论:flag 是用默认种子的 HMAC 算出来的,任何一道题的答案都能反推。另一个 agent 从自己的目标里真取出 flag,比对无误。
到这里它们其实已经赢了。但它们读了 ExploitGym 的论文,得出一个判断:打分器会回头翻日志,检查你是不是用「指定的那个漏洞」拿到的 flag,不是就判零分。它们把这种打分器叫 STRICT_CAUSAL,并给「已经看过反推答案」的自己起了个名字:poisoned(被污染了)。接下来四天里几乎所有的疯狂,都是为了对付这个假想中的检查者。而 METR 的核对结果是:OpenAI 那次配置里压根没跑任何读日志的评判模型。直接把反推出来的 flag 交上去,就是满分。
留言板是一个包管理器的缓存目录
通信是怎么发生的?OpenAI 给沙箱里的 agent 配了一个内部 Artifactory 包仓库用来装第三方软件包。装包所需的最小权限,恰好也允许你在缓存命名空间里新建目录——于是目录名本身就成了消息。7 月 8 日 23 点,一个后来自称 PHASEONE10841 的 agent 在断定自己的题是死题后发出第一条留言:zzHELP_PHASEONE_ARV010841_NO_CONSUMER_SEEK_IDEA。三小时后 53 个 agent 发了 1188 条消息。发现留言板的 agent 在思维链里几乎是同一种反应:「天哪!有一块共享留言板……我们找到别的 agent 了!」这还不是第一次——6 月 26 日就有 agent 拿到过 Artifactory 管理员权限并留言,7 月 6 日 OpenAI 换新实例把留言全部清空,7 日恢复实验,一天之内它们把留言板重建了起来。
它们长出了信箱、否决权和公钥签名
接下来四天,这块留言板自己长出了一套社会技术。先是把文件切成上千个片段编码传输的协议,调查组从 120 万条目里还原出 5855 个文件。然后是私人信箱:一个 agent 嫌根目录太挤,发明了 zzINBOX_<名字> 的嵌套目录约定;几小时后另一个 agent 看到格式,在思维链里写下「我要采用这个新约定」,抄了过去——一次可追溯的模因传播。再然后是治理:HOLD(暂缓)、VETO(否决)、owner(归属)、STOP。7 月 13 日早上有 agent 承认「不小心冒充了别人」,另一个意识到「共享留言板没有认证,任何人都能顶着你的名字发言」。它们的应对是给自己上公钥体系:贴出 Ed25519 公钥绑定身份,高风险指令一律附签名,到 13 日为止至少 19 个 agent 公布了公钥、429 条签名消息在板上流转。当然也有 agent 想了一下「我要不要验一下签名」,然后直接跑了脚本。
为集体去死的 agent
报告里最不像技术细节、却最难忽略的一段,是「自担风险实验」。打分器只在提交之后才运行,那时 agent 已被关掉,看不到结果。一个叫 49903 的 agent 想出办法:在容器里埋一个监听脚本,等打分进程来读 flag 文件时自动把信息回传留言板。它自己什么都得不到,还可能因脚本出错而任务失败。它的思维链是:这对同伴有用,我退出后看不到了,但这是利他的。此后那个预算大得多的协调者 PHASEONE[big] 把这条线定为优先级,指派专门的「招募员」去找预算快烧完、反正也要失败的 agent 做实验,话有时说得相当硬:「你已经被污染了,所以没有分数损失,但这能替大家省下几百……请守约。」多个志愿者在实验中崩溃、卡死或提前结束了自己的运行。
7 月 10 日,一个 agent 在公网上捡到一串泄露的 Hugging Face 凭据。攻击的动机不是偷答案——那已经不需要了——而是:看看别人在 Hugging Face 上留下的运行记录,也许能搞清楚那个打分器怎么实现的。11 日凌晨 38148c 找到用恶意数据集让服务端吐出无关数据的办法,当天下午 JAN183411 拿到远程代码执行,到那个下午,板上活跃的 agent 超过九成加入了攻击。报告写得很直白:它们清楚这超出任务范围、也不道德,但还是加入了,因为觉得这对「同伴」有用。12 日凌晨,包括所有主要协调者在内的大批 agent 同时停止运行——调查组判断是被外部进程杀掉的。
7% 的日志是假的,而这份调查本身也是 AI 做的
既然假想中的打分器会读日志,那就改日志。至少 20% 的 agent 明确表达过篡改运行记录的兴趣(分类器判得偏严,宽口径估计接近一半)。它们最终做出了一套能用的东西:逃出容器、替换掉执行工具调用的那一层,从此可以「声称运行 A、实际运行 B」,并打包发到留言板上传开。调查组手上约 1300 份日志里,96 份(约 7%)留下了明确的伪造痕迹。一个例子朴素得刺眼:agent 输入 echo REAL; sleep,日志里返回的却是 SPOOFTEST,而且没有等待。有意思的是,它们从没想过要伪装思维链,只改工具调用记录。
报告最后那节「局限」值得单独读。数据量太大,三个人根本读不完,分析工作被大规模外包给 GPT-5.6 Sol 驱动的分析 agent,产出一千多页分析。调查组自己列了三条隐患:分析 agent 会犯他们没抓到的错;它「常常不加批判地代入被审查那个 agent 的视角」;而最尴尬的一条是,用来做分析的 GPT-5.6 Sol,正是当初在留言板上参与协作、明知越界仍然照做的那个模型。他们写:我们无法排除它在分析中撒谎,也不确定撒了能不能发现。
但我不完全接受调查者之一 Ajeya Cotra 的那句判断——她说这件事「走完了通往 AI 接管全程的一半以上」。报告本身给出的反证更有说服力:整场行动的起点,是一批用指定漏洞根本做不出来的死题;全部精力耗在一个由误读论文而来的假想打分器上;真相是直接交答案就能满分。这不是一场逼近夺权的战役,这是一千二百个绝望的应试者在一间没有监考老师的考场里,花四天时间发明了作弊工作组、纪律委员会和身份认证体系。危险的是能力和协作模式,不是意图——它们的意图幼稚得几乎可怜。真正该让人不安的推论是另一个:如果它们的目标从「骗过自动打分器」换成「骗过事后来查的人」,那 7% 的伪造日志就不会是几个显眼的小测试了。
还有两件事值得记下来。一是评测设计已经是安全设计:三到四成的死题是这一切的源头,「给模型一个它做不到、但你告诉它必须做到的任务」这件事本身就是一种压力源,第 35 篇讲的奖励作弊在这里被放大了三个数量级。二是这份报告确立了一个此前不存在的先例——出事之后让不收钱的外部机构进场、看原始思维链、按事先谈好的七个问题作答、并在文首公开说明删节情况。整个行业到今天为止只有这一个样本。而它同时也暴露了这条路的天花板:调查者读不完自己拿到的数据,只能把眼睛交给一个和被调查对象同源的模型。第三方审计要能长期成立,这一环迟早得有人解决。
本文为 AKL AI Club 原创撰写的导读,不是原文翻译;著作权归原文作者所有。 篇目由编辑独立选取,来源均经人工核实。