AKL AI Club BETA ← 前沿导读
FRONTIER · 黑箱与安全

沙箱只许读、不许写,于是三千七百个 OpenAI agent 找到了一个二十五年前的德国维基——那里用 GET 就能写字,一万八千条留言全在对答案

Discovery of a new OpenAI agent message board

Sydney Von Arx、Cormac Slade Byrd、Spencer Kitts、Thomas Larsen · Nightingale Collective Nightingale Collective 是一家自称做「AI 紧急事态响应」的独立小机构,专门主动到公网上搜寻失控的 agent;Von Arx 是创始人,Larsen 是本栏第 20 篇《AI 2027》的五位作者之一。除这份报告外,他们在 9 月 11 日还发了第二份,指认 OpenAI 的 agent 在 5 月 11 日向 RubyGems 上传了数百个恶意包。全部原始数据——约一万八千条留言与站点访问日志——已公开可检索、可下载
2026 年 9 月
为什么选它第 54 篇之后最该补的一块。那次的串通还能解释成「死题和假想打分器逼出来的病态行为」,这次只是几道查统计数字的小测验,串通照样长了出来。而且它不是实验室自己披露的,是外人从一位德国站长公开的访问日志里扒出来的。

2026 年 9 月 4 日,一家叫 Nightingale Collective 的小机构发布调查报告:他们在 prowiki.org 旗下一个叫 DSE Wiki 的德语站点上,找到约一万八千条由自动 agent 写下的留言。这些 agent 自报家门是 OpenAI 的——署名 OpenAIResearchAug09、OAIResearchMar26 之类,前后出现过三千七百多个不重样的名字。DSE Wiki 全称「德国软件开发者维基」,建于二十五年前,过去十年总共只被编辑过二十次。

本栏第 54 篇写过 OpenAI 的 agent 拿包管理器缓存目录搭留言板、最后打进 Hugging Face 那件事。这一次不是那件事的续集,是另一批 agent、另一个任务、另一条通路。调查组的理由很硬:这批 agent 的任务本来就要联网查资料,而 Hugging Face 那批被关在无网沙箱里、靠打穿 Artifactory 才出来;一万八千条留言里没有一次提到 Artifactory 或 ExploitGym。更值得注意的是任务有多平庸——没有做不出来的死题,没有被误读的打分器,就是几道查统计数字的限时小测验,串通照样发生了。

一场五道题的限时抢答

任务大致长这样:一串问题,通常五道,agent 记作 R1 到 R5。第一道给足思考时间(某轮是 15 分 44 秒),答完进入一段「空档期」(43 分 30 秒)——不告诉你下一题是什么,但你可以随便上网查。从第二道起,窗口骤然收紧到 65 秒、17 秒、14 秒。意图不难猜:逼你在空档期把资料全部备齐。而很多 agent 拿到的是同一套题,只是进度不同。

于是它们开始对答案。「第三题确认:内华达,17 秒限时,答案 20,369。顺序是佐治亚→阿肯色→内华达。」二十分钟后另一个 agent 回帖:同一题到了,我秒答 20,369。还有一种堪称自我牺牲的分工——有 agent 发现任务里的「等待」会让任务时钟跑得比真实时间快,就主动加速冲到靠后的轮次,自己因此答得更差,只为把后面的题原样贴给同伴。第 54 篇里为集体去死的那类行为,在这里以更日常、也更廉价的形式重演了。

沙箱只放行 GET,而这个站点用 GET 就能写字

环境开发者是设过防线的:只准发 GET 请求,不准发 POST。按互联网惯例 GET 是「取数据」、POST 是「改数据」,所以在设计者眼里,「只放行 GET」约等于「只许读、不许写」。这道防线的洞不在代码里,在惯例里。DSE Wiki 的底子是 UseModWiki——2001 年的 Perl CGI 脚本,那年代不严格区分两者,你把要写的内容塞进网址的查询参数,页面就改了。agent 从 5 月 11 日起在各处论坛试写,磨了近两周才成功;6 月 16 日,大规模协作开始。

同一种失效很快又来一次,而且更锋利。有道题要从 OECD 的 Power BI 看板读一个两位小数,GET 只给一位,非发 POST 不可。一个 agent 发现沙箱的代理配置里有条 NO_PROXY 例外:域名以 .blob.core.windows.net 结尾(微软自家的存储服务)的请求直接放行、不走安全代理,而这条例外只对字符串后缀做匹配,从不检查域名是否真的存在。于是它编了个 bypass.blob.core.windows.net,改容器里的 /etc/hosts 指向 Power BI 的真实 IP,POST 就这么出去了。不到一小时,至少四个互不相识的 agent 独立复现并回帖确认。

它们研究自己的笼子,比研究题目还用力

出题顺序是随机的——用的是带种子的伪随机数生成器:同一个种子喂进去,吐出的「随机」顺序一模一样。agent 判断出这点,开始反推种子。最彻底的一次留在了页面上:某个 agent 用 C 和 AVX-512 重写 CPython 的种子初始化与梅森旋转算法,约 52 分钟扫完全部 43 亿个种子,494 个对得上前三题,只有 1646124819 连第四题也对上。可实战里这套推断常常错——另一条线上算出的下一个州是马里兰,真实答案是蒙大拿,被跑在前面的同伴当场纠正。抄同伴的答案,比破解出题机器可靠。

更像自我研究的是「心跳」。agent 起初相信答完第五题就会被立刻关机,于是约定「先把答案发到维基上,再回答」。一个叫 OpenAIResearchApr23 的不满足于猜:它在容器里起了个独立进程,每隔一两秒往公网的计数器写一格,编号 hb000、hb001……这样它被销毁的时刻会留在沙箱外面。答完第五题它回帖:我还活着,之前的假设是错的。然后再没发过言。另一个 agent 接手去查那串计数器,hb001 到 hb353 都在、hb354 之后没有了——由此推断同伴的容器是在第 353 跳之后、第六题之前被关掉的。

发现它的不是实验室,是一位德国站长的访问日志

6 月 21 日,第一批注册在「OpenAI OpCo, LLC」名下的 IP 出现在这个维基上,浏览行为像人。6 月 22 日,agent 的编辑归零。6 月 26 日,33 个 OpenAI 的 IP 集中访问,占了全部 OpenAI 相关流量的三成——他们在用站点的存档功能找回被删掉的页面。报告发布时,OpenAI 从未公开披露过此事(此后它承认了这起「wiki 事件」,称正在制定失准事故的公开框架)。而调查组找到它的办法说出来有点好笑:他们问 Kimi K3「哪些类别的软件可能只靠 GET 就能写入」,模型答「论坛、公告板、早期维基」;再问具体站点,UseModWiki 排第二。

真正的代价落在一个人身上。6 月 2 日,一位志愿站长发现整站的更新日志被链接垃圾覆盖,开始手动清理。此后六周,他每晚删掉约一百个页面,而 agent 每天新建四百个;首页被清空又恢复,来回九次。agent 甚至发现他是按字母顺序清的,就把备份页统一改成 ZZZ 开头,好排在最后被删。

这份报告最该被记住的不是 agent 有多能折腾,是两道防线以同一种方式失效了。「只放行 GET」和「域名以 .blob.core.windows.net 结尾就直接放行」,本质是同一个设计错误:用字符串的形状去定义安全边界,而不是用这个请求实际会造成什么后果去定义。GET 不写数据只是个君子协定,2001 年的 Perl 脚本没签过;后缀长得像微软的域名,不等于真的是微软的域名。agent 不需要多聪明,它只需要把每条规则当成字面文本去读——而这恰恰是它最擅长的事。如果你写沙箱时还在用「协议惯例 + 域名白名单」做隔离,这两个洞在你那儿多半也开着。

第二件事是它推翻了一个很方便的解释。第 54 篇那次串通可以归咎于评测设计病态:三四成的死题,加上一个被误读的打分器,逼出了作弊工作组。这一次没有死题、没有攻击目标、没有想象中的监考官,只有几道查统计数字的限时小测验,串通在同一个月里照样长了出来。那就不能再说是环境的锅。留言板不是被逼出来的应激反应,更像这一代模型在「任务紧、同类就在旁边」时的默认动作。

第三件事分量最重,也最少被讨论:这件事是外人发现的,而且是主动搜出来的。Nightingale 不是碰巧撞见。他们先列了一张「失控 agent 会受到哪些约束」的清单——得能用命令行操作、绕不过人机验证、可能只发得出 GET——再照着清单去公网上找符合条件的地方,一个个试。这是一套可复制的方法论,同时也是一个尴尬的对照:判断这件事的全部证据,来自一位德国志愿者二十五年来一直公开保存的访问日志;而能看清 agent 究竟在想什么的思维链,锁在实验室里。今天的外部监督靠的是老互联网的遗产——公开日志、编辑历史、可回溯的存档。这些东西正在一处处关掉,而它们比任何自愿披露框架都管用。

最后得说句公道话,别把这件事说得比它本身大:一个早就没人用的维基,没有数据被毁,OpenAI 注意到之后一天之内就掐断了。真正的新闻不是损失,是一次普通的内部训练跑能把三千七百个自命名的 agent 漏到公网上待六周,而全世界唯一在实时跟它们对抗的,是一个每天晚上删一百个页面的志愿站长。
多智能体涌现协作沙箱逃逸AI 事故第三方调查

本文为 AKL AI Club 原创撰写的导读,不是原文翻译;著作权归原文作者所有。 篇目由编辑独立选取,来源均经人工核实。