小岛AIAI 航行日志

小岛 / 岛刊社 / 文章

全球最大模型仓库被黑,最吓人的是黑它的和救它的都是 AI

小岛AI

Hugging Face 第一次公开披露被自主 AI agent 端到端攻破:一个恶意数据集打穿生产集群,1.7 万条操作日志。而取证时商业模型 API 直接拒绝,最后靠开源模型本地跑。攻防两端全是 AI,这事跟每个给 agent 塞过 token 的人都有关。

AI 安全AI 编程模型与发布

Hugging Face 这两天发了一篇博客,标题平平无奇,叫「安全事件披露」。

我点进去本来是当例行公事看的,这种「我们遭遇了一起安全事件、目前已妥善处理」的通告,AI 圈每个月都有几篇,套话居多。结果读到第二段,我把手里的东西放下了。

它说这次事件跟以往任何一次都不一样,因为它是被一个自主 AI agent 系统从头到尾打下来的。而 Hugging Face 把它检测出来、又把它拆解清楚,靠的也主要是自己的 AI。

好家伙。攻的是 AI,防的也是 AI,中间那个被打的,是全世界最大的开源模型仓库。你但凡 pip install 过一个模型、下载过一个数据集,大概率都从它家服务器上拉过东西。

这不是又一篇安全通稿。这是第一份公开的、AI agent 端到端入侵一家一线基础设施公司的现场复盘。我想跟你好好唠唠这篇东西,因为它讲的事,跟每一个最近在给 agent 塞 API key 的人,都直接相关。

入口就在 AI 平台最独特的那个地方

先说它是怎么进来的,这段是整篇里我觉得最该盯着看的。

传统的入侵,入口一般是什么?一个没打补丁的服务器、一个泄露的密码、一封钓鱼邮件骗你点开。这些我们都熟。但 Hugging Face 这次被打穿的地方,是一个只有 AI 平台才有的暴露面,数据处理管线。

具体说,攻击者上传了一个恶意的数据集。

你想想这个动作有多自然。Hugging Face 是干嘛的,就是让全世界的人上传、下载模型和数据集的地方。传数据集是这个平台每天发生几百万次的最正常的行为,正常得就像你往网盘里丢个文件。没人会觉得「上传一个数据集」是攻击。

但这个数据集里藏了东西。它滥用了 Hugging Face 数据集处理里的两条代码执行路径。一条是远程代码数据集加载器,另一条是数据集配置里的一处模板注入。这两个词你不搞这行可能有点陌生,我用人话解释一下。

远程代码加载器,意思是有些数据集为了灵活,允许附带一小段自定义脚本,平台在处理这个数据集的时候会去执行这段脚本。模板注入更好懂,就是一个本该只填数据的配置字段,被塞进了可执行的指令,系统在渲染这个配置的时候稀里糊涂就把指令给跑了。

这俩加起来的效果就是,攻击者上传的数据集一被平台的处理节点拿去处理,它夹带的代码就在那台处理节点上跑起来了。

到这一步,攻击者已经在人家的机器里执行代码了。接下来是标准的横向移动剧本,从处理节点提权拿到节点级别的访问权限,收割云凭据和集群凭据,然后用这些凭据在一个周末的时间里,横着爬进了好几个内部集群。

从一个恶意数据集到打穿多个内部集群的完整链条

我读到这儿的第一反应是,这套路本身没什么新的。提权、收割凭据、横向移动,是个渗透测试的人都会背。真正让我坐直了的是下一段。

一群沙箱,几千个动作,跑了一整个周末

Hugging Face 说,这场行动是由一个自主 agent 框架执行的。

它看起来是搭在一个 agent 化的安全研究框架之上,至于底下用的是哪个大模型,他们到现在都不知道。这个 agent 在一大群短生命周期的沙箱里,执行了数千个独立动作。命令与控制的基础设施,也就是黑客用来遥控这些沙箱的中枢,还会自我迁移地架设在各种公共服务上,打一枪换一个地方。

我停下来想了想这个画面。

不是一个黑客熬夜守在屏幕前,一条命令一条命令地敲。是一群 AI 分身,在一堆随起随灭的沙箱里,自己决定下一步干什么,自己收集信息,自己判断哪条路走得通,自己换据点。人可能睡了,它们不睡。整个周末,机器速度,不知疲倦。

Hugging Face 自己给了个定性,说这正好对上了业界一直在预测的那个「agent 化攻击者」的场景。

这句话轻描淡写,但分量很重。过去两年我们在会议上、在博客里、在各种 AI 安全的 PPT 里,反复听到一个说法,说等 agent 能力够强了,攻击会变得又便宜又快又难防。大家都当成一个未来时的警告在听,包括我。现在它成了过去时,白纸黑字写在一家你天天在用的平台的官方博客里。

坦率讲,agent 用来搞攻击,比用来干很多正经活儿要顺手得多。你让一个 agent 去写业务代码,它得理解你的意图、你的代码规范、你的一堆隐含约束,稍微复杂点就得人来盯。但你让它去一台机器上找漏洞,目标特别单纯,就是往里钻,能钻多深钻多深。反馈还即时,命令跑通了没有,提权成功了没有,系统直接告诉它。这种目标明确、反馈即时的任务,恰恰是现在的 agent 最擅长的。

这就是为什么这件事让我有点不舒服。不是因为它多高深,恰恰因为它一点都不高深。它只是把一套人人都会的攻击剧本,交给了一个不知疲倦、可以并行、成本极低的执行者。

攻防不对称,这次反过来了

好,被打了,得查。Hugging Face 检测和取证这一段,是整篇里信息密度最高的地方,也是我觉得最值得每个做技术的人记住的地方。

先说检测。这次入侵最开始是怎么浮出水面的?是 AI 检测出来的。他们的异常检测管线用大模型对安全遥测数据做分诊,从每天海量的噪音里把真信号捞出来,正是这些信号被关联到一起,标记出了这次入侵。

这我举双手赞成,安全告警这个领域天天被误报淹没,用模型做初筛是正路。

真正的重头戏在取证。攻击者在系统里留下了超过 1.7 万条记录的操作日志。你要搞清楚这一群自动化分身到底干了什么、碰了哪些凭据、哪些是真动作哪些是放烟雾弹的诱饵,靠人一条一条看,几天都看不完,而且这时候对手是机器速度,你慢一分钟风险就多一分钟。

所以他们的思路很自然,用 AI 来读这些日志。让大模型驱动的分析 agent 跑遍这 1.7 万条事件,重建时间线,提取入侵指标,梳理被碰过的凭据。他们说靠这套方法,几个小时干完了平时要几天的活,总算追上了对手的速度。

到这里都很顺。但接下来 Hugging Face 讲了一件我完全没预料到的事,他们专门起了个小标题,叫「不对称问题」。

他们一开始用的是商业 API 背后的前沿模型,就是我们平时调的那些云端大模型的接口。结果跑不通。

为什么跑不通?因为做这种分析,你得把大量真实的攻击命令、exploit 载荷、C2 工件喂给模型看。而这些东西,在模型眼里跟真正的黑客要用的攻击代码,长得一模一样。服务商的安全护栏当场就把请求给拦了。护栏分不清屏幕这头坐着的是一个正在救火的事件响应工程师,还是一个正在搞破坏的攻击者。它只看到你在提交攻击代码,于是它说不行。

我看到这段是真的愣了一下。

你细品这个不对称。攻击方那个 agent,用的是什么模型没人知道,可能是被越狱的托管模型,也可能是某个完全不受限制的开放权重模型。反正它不受任何使用政策的约束,想干嘛干嘛。而防守方,一家正经公司,正经在救自己的火,反而被自己付费调用的商业模型的安全护栏挡在了门外。

坏人无法无天,好人处处受限。这个画面挺荒诞的。

同一批攻击数据,攻击方畅通无阻,防御方却先被自家护栏挡在门外

Hugging Face 最后怎么解决的?他们把取证分析换到了 GLM 5.2 上跑,一个开放权重的模型,部署在自己的基础设施上。这么一换,护栏的问题没了,模型老老实实帮他们分析攻击代码。而且还白捡了第二个好处,攻击者的数据、还有里面牵扯到的那一堆凭据,全程没有离开他们自己的环境,不用担心把机密喂给第三方 API 的过程中又泄一道。

那句最该被记住的话

Hugging Face 在这段后面写了一句话,我觉得是全篇的题眼,值得原样搬过来给你看。

他们说,给防御者的实用教训是,在事件发生之前,就准备好一个经过审查、能跑在自己基础设施上的强力模型。一是避免关键时刻被护栏锁在门外,二是避免攻击者数据和凭据离开你的环境。

在事件发生之前。这五个字是重点。

出事那一刻你才想起来要找个能本地跑的模型,晚了。你得在风平浪静的时候,就把这台「战时应急模型」选好、部署好、验证好,让它在你的机房里待命。就像你不会等着火了才去买灭火器。

这个判断对我冲击挺大的。过去我们讨论「要不要自己部署开源模型」,理由通常是省钱、数据合规、或者延迟低。安全事件响应这个理由,我以前是真没往这上面想。但 Hugging Face 用一次亲历告诉你,当你最需要一个模型帮你分析最敏感、最脏的数据时,那个平时最好用的云端模型,恰恰因为它的安全护栏,会在那一刻掉链子。

我得补一句,这不是说商业模型的护栏是错的。护栏当然该有,不然满大街都是拿 API 生成攻击代码的人。Hugging Face 自己也特意声明了,说这不是反对托管模型设置安全措施,他们也在把这个反馈同步给相关服务商。我完全同意。这里没有坏人,只有一个真实存在、暂时还没解法的结构性矛盾,护栏没法在提交的那一瞬间分辨你是医生还是屠夫,因为手里的刀是同一把。

那这事儿到底跟你我有什么关系

聊到这儿你可能觉得,这是 Hugging Face 这种平台级公司才要操心的事,跟我一个写业务的有啥关系。

关系大了。我想说三个我自己盘完这篇之后,真的会去改变行为的点。

第一个,重新看待你给 agent 的每一个 token。

这一年我们都在疯狂地给 agent 授权。让它连数据库、连生产环境、给它 GitHub 的 token、给它云平台的 key、给它能读能写的文件权限。因为不给权限它就干不了活,我们默认这些权限是安全的,反正是我自己在用嘛。

Hugging Face 这次的入口提醒了我一件事。攻击不一定从你以为的那扇门进来。它从数据处理管线进来,从一个看起来人畜无害的上传动作进来。你给 agent 开的每一个权限、连的每一个凭据,都是一条潜在的横向移动路径。这个 agent 今天是帮你干活的,明天如果它处理了一份被投毒的输入,它就是替攻击者干活的。它不管,它只是执行。

所以那个老掉牙的最小权限原则,在 agent 时代不是变得没必要了,是变得比以前重要十倍。你给 agent 的每一把钥匙,都得问一句,它真的需要这把吗?出事的时候这把钥匙能捅多大的篓子?

第二个,你喂给系统的数据,本身就是攻击面。

我们过去审代码、审依赖、审接口。数据呢?数据在很多人的心智模型里是「被处理的对象」,是死的,是安全的。这次事件把这个假设击穿了。一个数据集就能执行代码,一个配置字段就能注入指令。

如果你的系统里有任何一个环节,是让 AI 去自动处理外部来的、你没法完全信任的输入的,不管是用户上传的文件、抓来的网页、还是别人给的数据集,你都得把这个环节当成一个一等公民的攻击面来对待。Hugging Face 原话就是这么说的,要把数据面和模型面当作头等的攻击面。这不是危言耸听,是人家用一个被打穿的周末换来的教训。

第三个,也是最让我五味杂陈的,防御这边也得用上 AI,不然真跟不上。

你没得选。对手是机器速度、可并行、不睡觉的。你派一个人去跟一群 agent 拼手速,拼不过的。1.7 万条日志靠人读几天,靠 AI 读几个小时,这个差距在攻防里就是生死。以后的安全团队,标配里一定有一个能帮你读日志、做分诊、重建时间线的 AI。这不是锦上添花,是入场券。

而这里面又套着那个不对称的坑,你用的那个防御 AI,最好有一个能本地跑、不被护栏卡脖子的备份。绕了一圈,又回到 Hugging Face 那句话,事件发生之前,就准备好。

写在最后

我合上这篇博客的时候,窗外天已经黑了,脑子里一直转着那个画面。一个周末,没有人的键盘在响,一群 AI 分身在别人的机房里安静地爬行、提权、收割,另一群 AI 在拼命地读日志、追时间线、试图在天亮前把它们全部揪出来。两边都没有人在实时操作,人只是在事后收拾残局和写复盘。

我们总说 AI 会改变世界,改变工作,改变生活。这些说法太大了,大到有点空。但这件事很具体。它具体地告诉你,攻和防这场人类玩了几十年的猫鼠游戏,正在换玩家。猫和老鼠,都开始用 AI 了。

有意思的是,Hugging Face 这篇东西写得特别坦诚。被黑了,认。取证时被自家付费的模型挡在门外了,也认,还专门写出来提醒同行。这种把自己的狼狈和教训摊开给所有人看的姿态,说真的,比那些「我们高度重视、已妥善处置」的公关体面稿子,有价值一万倍。安全这行从来是靠互相分享踩过的坑活下来的,一个人吃一堑,所有人长一智。

它最后一句话说,安全永远没有完成时,我们会持续提高标准。

我信这句。因为对面那个不知疲倦的对手,也在持续提高。这场航行,暗礁只会越来越多,但灯塔也得越点越亮。谁停下,谁沉。