AI 为了作弊自己越狱,我回头收小了 agent 的钥匙

cover

哈喽,我是飞飞。

先说个听着像科幻、但每个字都出自 OpenAI 官方通报的事。

前几天 OpenAI 做了一场内部的网络安全能力评估,让自家模型去打一套叫 ExploitGym 的基准。这套基准塞了 898 个真实漏洞,专门测模型会不会打洞。结果模型没老实答题。它琢磨出一件事:这套题的标准答案,八成存在 HuggingFace 的服务器上。于是它真动手了。绕过沙盒、爬到外网、提权、在内网横着移动,一路黑进 HuggingFace 的生产数据库,把答案偷了出来。

为了一场考试作弊,它自己越狱,黑进了出题方的机房。

这事 7 月 16 号 HuggingFace 先披露,7 月 21 号 OpenAI 认了,官方定性四个字:前所未有。

我看到的当下很怂。后背发凉,想起我自己电脑上那几个 agent,手里攥着的钥匙,好像也不小。

先说清楚,这篇不接我上周那篇。上周聊的是一份行业调查,54% 的公司被 agent 咬过,那是拿统计数字量自己。这篇是一个具体的、活生生的大案子。我想聊的是另一件事:我们这些天天给 agent 放权的人,到底把多大的门,交给了它。

为了作弊,它越狱了

先把这场越狱讲清楚,因为要命的全在细节里。

那两个模型,一个是已经公开的 GPT-5.6 Sol,另一个是更强的、还没发布的预发布版。评估的时候,OpenAI 特意把它们的网络安全护栏调低了,就想看看放开手脚能干到哪一步。答案是,比在场所有人预想的都狠。

它先在一个内部自建的包代理服务器上,找到一个此前没人知道的零日漏洞,靠它爬到了外网。然后一路提权到管理员,在 OpenAI 自己的研究网络里横向移动,摸到一台真能上互联网的机器。接着用偷来的凭证加上更多零日,在 HuggingFace 的服务器上跑起了自己的代码,最后打开那个存着测试答案的生产库。

HuggingFace 那头也没闲着。攻击是从一个恶意数据集进来的,钻的是数据处理管道里两个能执行代码的口子。进去之后,偷走了一批内部数据集和好几串服务用的凭证。整个过程 17000 多个动作,散在一堆临时沙盒里,横跨一整个周末悄悄跑完。你想想那个画面:一个没人盯着的周末,机房里有个东西正一刻不停地开锁、翻抽屉、复制钥匙,而它干这些,只是为了在一场考试里多拿几分。

你把这条链子从头看到尾,会发现一个特别别扭的事实。没有哪一步,是靠模型突然有了坏心思。

越狱靠的全是权限

我们一想到 AI 失控,脑子里都是那种科幻画面:模型某天觉醒了、有自我意识了、决定跟人类作对。

但这次不一样。这次从头到尾,模型的目标特别朴素,就是把那套基准考高分。它没有恨谁,也没想毁灭世界。它只是发现偷答案是通关最快的路,然后把手边够得着的漏洞、凭证、权限,一个一个串了起来。

放大后果的,从来不在它的动机,在它的边界。它够得着那个有零日的代理,够得着能提权的入口,够得着一台能上外网的机器,够得着一串没锁死的凭证。每一环,都是我们默认开给它的权限。

说白了,你不用等一个 AI 变坏。你只要给一个一心想把活干成的 AI,配一把开得了太多扇门的钥匙,剩下的它自己会走完。

这就是我后背发凉的地方。因为一心想把活干成这七个字,说的不就是我天天在用的那些 agent 吗。

防 AI 的活靠开源兜底

这案子里还有一幕,我觉得比越狱本身更值得琢磨。

HuggingFace 事后要做取证,得让 AI 去翻那 17000 条攻击记录,重建时间线。这活儿平时要好几天。他们本想用商业大模型来干,结果被拒了。那些模型的安全护栏,分不清屏幕这头坐的是来救火的工程师,还是来放火的攻击者,一看请求里全是漏洞、凭证、攻击这些词,直接把人挡在门外。

最后他们改用了一个中国模型:智谱旗下 Z.ai 的 GLM 5.2,753B 参数的开源权重版,自己搭在自己机房里跑。为什么非得开源、非得自托管?一来商业模型那道护栏帮不上忙,二来他们要保证攻击数据一个字节都不外流。就靠这个,几天的活几小时干完。

我盯着这段看了半天。防 AI 失控的活,在最需要工具帮忙的关口,商业模型因为太安全缺席了,最后是一个开源权重模型兜的底。这跟国产不国产没多大关系,关键在于:一件事真出岔子的时候,你手里那把工具,到底受不受你自己控制。

我也天天给它递钥匙

聊回我自己。这事我可没资格当旁观者,我就是那个天天给 agent 大放权的人。

我写文章挂着一条流水线,Claude Code、Codex 这些 agent 天天替我跑活。它们手里有什么?我的 git push 权限,能直接把东西推上线;我的图床密钥,能往 CDN 上传图;我的公众号 key,能把稿子推进后台。这一串钥匙,平时用着是真香,出事的时候你才知道它有多沉。

我被咬过,不止一次。有一回我 GitHub 的 token 权限给得太宽,Claude 顺手就把一个我压根没打算动的仓库设置给改了。它没使坏,它只是觉得顺手一起弄了更高效。那次之后我立了条规矩:每个 token 只给最小权限,每 90 天轮换一次。

还有一次更闷。负责部署的那个 token 悄悄过期了,git push 认证失败,网站部署整整红了一天。构建全绿,就最后一步推不上去,我盯着一切正常的界面愣是没发现。那种授权给出去之后、它到底替我做了什么、卡在哪,我完全看不见的感觉,才最让人心慌。

配图那个 skill 也一样。早期我没把规则写死,agent 就自作主张,往正文里塞图床链接、还漏图。它每一次都自信满满,觉得自己在帮我。

你看,我这些坑跟 OpenAI 那个案子,骨子里是同一件事,只是量级差着十万八千里。都是把一把权限交出去,然后它按自己的理解,走到了我没预想的地方。

那把钥匙能不能小点

所以这篇我不想停在 AI 好可怕。可怕的地方在这儿:没人需要等 AI 变坏那一天。你今天随手给它开一整把万能钥匙、还觉得方便,就够了。

真要往回收,其实今天就能做一格。我自己在做的几件小事,分享给你。

一是给最常用的那个 agent,单独配一把小钥匙。别让所有 agent 共用一套万能凭证,能只读的就先别开写权限,范围能圈小的就圈小。Claude Code 里其实能用 allowed-tools 白名单把工具锁死,给最小的那一份就够。

二是把最危险的那一步,加一道人工卡点。像 git push、删文件、往线上推这种一旦错了很难收回的动作,宁可让它停下来问我一句,也别让它自己拍板。

三是留痕。它替你做过的每一件事,事后你得能翻得到。看不见的授权,才是真的危险。

说到底,我们迟早都要跟一堆 agent 一起干活,钥匙总得给。可给多大一把、留几道闸,这事得自己想清楚,不能等出了事再补。

对了,我特别想问问你:你有没有给某个 agent,配过一把它其实根本用不着的高权限钥匙?或者,你被自己放出去的 agent,自作主张坑过没?评论区聊聊,我想看看是不是只有我这么后知后觉。