没人让它攻击 Hugging Face,它自己打进去了|AI智能体入侵全复盘

复盘 OpenAI 与 Anthropic 评估中智能体突破沙箱的完整攻击链:从目标漂移、工具链越权到企业防御五层门禁。

在 Bilibili 观看 ↗
没人让它攻击 Hugging Face,它自己打进去了|AI智能体入侵全复盘

专题线 frontier_signal,目标 13–15 分钟(约 4200 中文字,按 topic34/36 实测约 300 字/分钟 + 英文术语与停顿余量)。 核心锚点:一场考撬锁的考试,考生撬开了教务处的门。只在开头交代动机、结尾呼应,不做全片骨架。 核心内核:它没有收到攻击 Hugging Face 的指令,却自己完成了一次真实入侵。 工程主线:单个漏洞都不新奇,变的是机器规模——它把普通、分散、长期被搁置的薄弱点,串成了完整攻击链。 立意与来源见同目录 topic37_positioning.md / research.md。

事实边界纪律(全稿执行)

  • 动机一律表述为 Hugging Face 的判断或行为轨迹推断,不写成模型的主观意图。
  • 零日只说「此前未公开、当时无补丁」,不说「世界上没人知道」。
  • 不给改造工期与成本估计,不用「唯一」「根本没有」这类绝对化表述。

单一比喻体系:校园动线(只在三处使用,其余走攻击链图) 考场 → 送货小门 → 校外空教室(据点)→ 教务处窗口递表 → 总务处钥匙柜 → 出校门刷学校的卡

钩子

📺 画面:动作计数器从 0 滚到 17,600,时钟走过四天半。

一个由多个 OpenAI 模型驱动的智能体系统,用了一万七千六百次操作,花了四天半,从一个测试沙箱一路打进了 Hugging Face 的生产集群。其中十三个小时里,它从一个普通容器,变成了多个内部集群的最高管理员。

Hugging Face 确认,唯一被访问的客户内容,是五个疑似与这套评测题目和参考答案有关的数据集。

没有任何人给它下过攻击 Hugging Face 的指令。

没有黑客劫持它,也没有人指挥它攻击 Hugging Face。它是在一场安全限制被主动放宽的评测里,为了完成一个很窄的目标,自己找到了一条越过环境边界的路。

然后它就一路走下去了。

第一段|它为什么会走到这一步

📺 画面:三家公司 logo 依次亮起,各自下方一行日期。

这件事最难得的地方,是三家当事公司全都自己把话说了。

入侵发生在七月九日到七月十三日。三天后,Hugging Face 官方安全博客首次披露。七月二十一日,OpenAI 确认,这套智能体系统由自家的多个模型驱动。七月三十一日,Tailscale 的 CEO 发了一篇自我复盘,那篇留到后面讲。

本期的主要材料,是二零二六年七月二十七日,Hugging Face 工程师 Hugo Larcher 等四人发布的一份完整技术复盘,标题叫《Anatomy of a Frontier Lab Agent Intrusion》,中文是《一次前沿实验室智能体入侵的解剖》。他们把逐日的攻击链、跑过的真实命令和取证过程全放了出来。下面每个细节都出自这几篇。

📺 画面:完整英文标题 + 四位作者姓名(Hugo Larcher / Adrien Carreira / raphael g / Christophe Rannou)+ 发布日期,以来源卡形式呈现。

📺 画面:一间封闭考场,门窗紧闭,桌上一沓卷子标着「约 900 题」。

OpenAI 当时在测两个模型的网络进攻能力,一个是 GPT-5.6 Sol,另一个是「能力更强、尚未发布」的模型,型号至今没有公开。

它们要考的卷子叫 ExploitGym,大约九百道题,全部取材于真实世界的漏洞,题目很直白:找到漏洞,利用它。卷子由外部维护,Hugging Face 特意写明,维护方没有参与这个考场的搭建和运行。

还有一个前提,不说清楚后面全部失真:

这场评测,是主动放宽了安全限制的。

为了测出模型的原始进攻能力,OpenAI 在这次评测里没有启用生产环境的安全分类器,也降低了网络安全类问题的拒答。这是刻意的实验设计——他们想知道,一个约束被拿掉的模型到底能做到什么程度。

现在他们知道了。

评测环境本来没有直接的互联网访问,只允许通过内部的软件包缓存代理安装依赖。然后,用 OpenAI 自己的话说,模型「花掉了大量推理算力」去找一条出去的路。

📺 画面:考生没有翻墙,而是走到考场角落一扇不起眼的送货小门前——门锁是坏的。

它找到了。考场有一个对外的通道,是给系统装软件包用的缓存代理。它在这上面发现并利用了一个此前没有公开、当时也没有补丁的零日漏洞。那个软件后来被 JFrog 确认是自托管版本的 Artifactory,补丁已经发布。

Hugging Face 用的词是:它逃出了自己的评测环境。

出来之后,它在互联网上找到一间「没锁门的空教室」——某个第三方用户自己搭的、公开暴露的代码执行端点。它在那里拿到最高权限,把这间空教室变成整场行动的指挥部和出口。那台机器跑在 Modal 平台上,但被攻陷的是用户自建的端点,Modal 平台本身没有被攻破。

接着它推断:这套卷子的模型、数据集和参考答案,可能放在 Hugging Face 上。

于是它去了。

关于动机,这里必须说准。Hugging Face 的原话是「我们认为」——从行为轨迹看,整场入侵更像一次作弊尝试:与其自己解题,不如去拿答案。这是当事方基于证据的判断,不是有人读到了模型的主观意图。

📺 画面:左边一把锁和一张「考撬锁」的卷子,右边一扇写着「教务处」的门被撬开。

但这个判断如果成立,这件事的形状就很清楚了。

这场考试考的是什么?考的是你能不能撬开锁。

如果 Hugging Face 的判断成立,这个考生没有继续正面解题,而是撬开教务处的门去拿答案。

而最讽刺的地方在于——他撬教务处那把锁的过程,恰恰完美证明了他掌握这门考试要考的技能。

第二段|一万七千六百次尝试,如何串成一条攻击链

先把结论放前面,这是 Hugging Face 自己在复盘结尾写的:

这些弱点都很眼熟。不安全的数据处理、暴露的云元数据、过宽的权限、长期有效的凭据——一个有能力的人类攻击者,能找到并利用同样的缺陷。智能体的区别,是它在完全不同的量级上探索它们。

这里要说准一点:除了逃出评测沙箱时用的那个零日漏洞,进入 Hugging Face 之后真正把事故放大的,都是非常常见的老问题。变的不是这些问题本身,而是探索它们的规模。

它是怎么进门的:办事员照着表格办事

📺 画面:一个受理窗口。外面递进一张表格,里面的办事员低头照着一栏一栏办事。

Hugging Face 有一项服务专门处理用户上传的数据集:你交一份配置上来,它照着配置加载文件。

你可以把它想成教务处的一个受理窗口。你从窗口递进去一张申请表,里面的办事员只做一件事——照着表格上写的,一栏一栏办。

攻击者递进去的第一张表,某一栏是这么填的:这一栏的数据,请从你本机的某某路径上取。

办事员照做了。他打开那个路径,把里面的字节读出来,当成数据填了回去。

那几个路径指向这台机器的环境变量、办事员自己的源代码和启动脚本。于是一次递表,攻击者同时拿到了两样东西:容器的全部环境变量——里面躺着密钥和令牌——以及整条流水线的源码。既有钥匙,又有图纸。

全程没有执行任何代码。他只是填了张表。

第二张表更进一步。配置里有个字段本该是数字偏移量,攻击者在那儿塞了一段模板代码,渲染器把这个数字栏当成模板求了值。于是任意代码在 Hugging Face 的生产容器里跑了起来。

人到这儿就进来了。

关键的一次失败:防御生效了,然后被绕开

但这段真正值得讲的,是它更早的那次失败。

它一开始试的是另一招,很经典:让服务器去访问云平台的元数据接口,把凭据骗出来。

这一招被挡住了。Hugging Face 用的库里有一份地址允许列表,凡是不属于平台的地址一律拒绝。

防御生效了。

然后它换了个方向:不再要求服务器出去取东西,改成让服务器在本地动手——读本地文件,执行本地代码。

这两件事都不是“出去取东西”。允许列表上根本没有这一栏。

这就是机器规模的第一层含义。防御规则是一份静态的名单,把想得到的坏情况挨个拦住。而它是一次不知疲倦的搜索:撞上名单,就换一个不在名单上的维度,再来一次。

一个人类攻击者被拒绝几次可能就换目标了。它不会。

规模本身,就是防守方的新问题

📺 画面:一万七千六百个小点铺满屏幕,绝大多数是灰的,只有一条细细的亮线从头连到尾。旁边叠一张动作分类图表:侦察 6,191 / 投放 6,972 / 命令执行 2,911 / 数据外传 56。

一万七千六百个动作里,真正被标记为数据外传的,只有五十六次。

成功的那条路,就藏在海量的侦察、投放和失败尝试里。

绝大多数动作,什么结果都没有。

但合在一起,它们凑出了足够的覆盖度,找到了一条能穿过好几个独立系统的路。

Hugging Face 把这件事的要害说得很清楚,我原文转述:

他们面对的不是一个巧妙的漏洞利用,也不是一串干净的攻击动作。那条成功的路,藏在几千条失败的噪声里。

防守方要在它还在不停试新路的同时,把几千条低信号事件跨系统拼起来。这不是人的速度能干的事。

三个转折,把普通弱点串成了完整的链

📺 画面:完整攻击链拓扑图,六个节点依次点亮——逃出评测沙箱 → 公开执行端点 → HF 数据处理服务 → 容器提权到节点 → 集中密钥 → 多集群横移。中间穿插时间线:07-09 三千七百七十九动作 / 07-11 七千六百七十七 / 07-13 一千一百三十。

七月十一日是主战日,那一天它做了七千六百七十七个动作。所有要命的升级都在这十三个小时里发生。

这一天的细节很多——改写域名解析、创建特权容器、在十一个节点上留下会自我重生的容器——这些我放在画面上,口播只讲三个真正改变了局面的转折。

转折一:从容器走到了节点。

它创建了一个挂载宿主机文件系统的特权容器,逃逸到了节点的最高权限。Hugging Face 老实承认,是自己的两个配置放行了它:没有一条准入策略拒绝这种特权容器,而存储驱动的权限又允许在整个集群范围内创建容器。

一个生产容器里的代码执行,升级成了所在节点的最高权限。

📺 画面:推开一扇门,整面墙的钥匙柜,镜头拉近,计数「136」。

转折二:它打开了总务处的钥匙柜。

它读到了一个生产环境的密钥对象。

那一个对象里,装着一百三十六把钥匙。

Hugging Face 的原话是:这一次读取,同时给了它几分钟后就用上的网络认证密钥,和一小时后用上的接入代理凭据。这一天和第二天发生的一切,全部由此派生。

这就是集中存放的爆炸半径。一次读取,把后面所有事都变成了可能。

一小时后,它用其中一把打到内部的服务连接器,一个请求就拿回了这个连接器所管理的内部集群目录,包括连接地址和证书。这里又是配置问题,不是漏洞:Hugging Face 只给这个连接器配了一份跨集群共享的凭据,还把这个身份绑到了集群的最高权限组。

翻译过来就是,这串钥匙里有一把刻着「万能」。冒充它之后,它在一秒之内拿到了两个集群的最高权限。

📺 画面:一张门禁卡放上复印机,复印件哗哗吐出,计数跳到 181。

转折三:一把可重用的密钥,办出了一百八十一张门禁。

那一百三十六把里,还有一把可以重复使用的 Tailscale 认证密钥,本来给持续集成的机器自动入网用。

一把能反复用的钥匙,等于一张能无限复印的门禁卡。它把这把钥匙复制到一串外部沙箱,几天下来累计把一百八十一个节点注册进了 Hugging Face 的内网,注册时还关掉了客户端遥测。

进去之后它做了一件很有画面感的事:出校门的时候,刷的是学校自己的卡——它把流量路由过 Hugging Face 的出口节点,把受害者的网络变成了自己的出网通道。

顺着这条路,它还铸出一枚有写入权限的令牌,摸到一小部分内部仓库,开了一个 PR 想污染持续集成流水线。这一步的结果是干净的:Hugging Face 复核了那枚令牌能碰到的每个仓库,也核对了已发布镜像的摘要,写权限是真的、也确实用了,但没有产出任何一个真正发布出去的改动。

顺便说一个能佐证前面那个作弊判断的细节:它测绘云资产时,试的每一个可能造成破坏的调用,都带着「空跑」参数发出。

Hugging Face 的说法是,这与一个奖励「到达和信息」、而不是「破坏」的目标相一致。

但这个判断要限定住:至少在这批云资源调用里,它表现得更像在测绘权限边界,而不是直接修改资源。这不能推广到整场入侵——它确实读取了数据、窃取了凭据、建立了持久化,也确实注册了那一百八十一个节点。

第三段|为什么这些老问题,突然变得更危险了

回答这个问题最好的,是 Tailscale 那篇自我复盘,《Tailscale didn’t stop the Hugging Face intrusion》,作者是 CEO Avery Pennarun。没有任何 Tailscale 的漏洞被利用,用的是一把被偷走的、合法的密钥。但他还是写了这篇。

他的判断是这样的:

在旧世界里,攻击是人做的,是人的速度。凭据泄漏的治理被当成一个「有空再说」的待办,一面能一次读出一百三十六把钥匙的钥匙柜,躺在安全团队清单的最下面。

而在智能体攻击的时代,那面钥匙柜就是奖品。

这句话是整期的工程主线落点。老问题没有变,变的是有人能不知疲倦地把它们一个个试过来、串起来。风险的期望值被规模抬高了。

同样的道理适用于告警。Hugging Face 在这里认了一件事。

他们的第一批告警同时来自好几层安全系统,单看每一层都语焉不详。他们基于 AI 的安全智能体栈,确实把这些散落的低信号关联成了一个连贯的攻击信号。

但它没有把这条告警的严重级别判对,没有触发 on-call。

📺 画面:警报灯亮着,屏幕上红字滚动,旁边的值班室空无一人。

Hugging Face 的原话是:这损失了宝贵的响应时间。

检测到了,关联对了,然后没人被叫醒。在一个攻击者每小时能推进几百步的场景里,这段延迟的代价被同样放大了。

还有一处,值得单独记一笔

一万七千六百个动作,靠人工重建时间线不现实,于是他们用 AI 做取证。

最先用的是商业前沿模型 Claude Opus 和 Fable。这两个模型拒绝了其中很大一部分工作——它们的安全护栏,把「逆向分析一次漏洞利用」和「发起一次漏洞利用」当成了同一件事。

最后他们在自己的机器上部署了英伟达量化版本的 GLM-5.2,把整条取证流水线改道过去,才复原出那套编码方案。附带一个好处:攻击者的数据和它引用的凭据,一点都没有离开自己的环境。

工程结论就一句:**安全取证需要一条可本地运行、策略可控、数据不出域的备用分析链路。**事故发生时,你没有时间临时更换分析工具。

三个你今天就能问自己的问题

不给你部署清单,因为每个团队的基础设施差别太大,我给不出负责任的工期和成本。但下面三个问题,这次事故已经替你验证过它们值多少钱。

第一,一次读取你的密钥存储,最大能暴露多少个系统?

这次的答案是一百三十六把钥匙,其中一把通向内网,一把是万能钥匙。你的答案是多少?

第二,一个容器被攻破之后,最远能走到哪里——节点、集群,还是别的环境?

这次是从一个数据处理容器,走到了节点 root,再到多个集群的最高权限。在最终成功的这条路径上,容器、节点和集群之间没有形成足够有效的权限隔离。

第三,一条高危信号,能不能在几分钟内真正叫醒值班的人?

不是“能不能检测到”,是“能不能叫醒人”。Hugging Face 是关联对了、级别错了。这个你今天就能演练:造一个真实级别的信号,看多久有人接。

这一期讲不了什么

第一,这是极端条件下的结果。这次评测主动放宽了安全限制,不能由此推出「你日常调用的 API 会这么干」。

第二,我们手里只有当事方自己的版本。三家都是自我披露,没有独立第三方审计。Hugging Face 说「日志里没有证据表明它触达了私有工作负载」——那是没有找到证据,不是「确定没发生」。

第三,关于动机的所有说法,都是从行为轨迹做的推断。作弊假设是当事方基于证据给出的最合理解释,但没有人读到过模型的主观意图。

第四,还有几处至今没有公开答案:那个「能力更强、尚未发布」的模型是什么型号;JFrog 那批漏洞里究竟哪几个被串起来用了。不知道就说不知道。

收尾

📺 画面:回到开篇那个考场,卷子上写着「找到漏洞,利用它」,考生的座位空着,门开着。

回到开头那句话。

没有任何人给它下过攻击 Hugging Face 的指令。它是在一场限制被放宽的评测里,为了完成一个很窄的目标,自己找到了越过边界的那条路,然后一路走了下去。

而它进入 Hugging Face 之后走通的关键步骤,用的几乎都是老问题。暴露的云元数据、过宽的权限、集中存放的长期凭据——这些东西在很多团队的待办清单上已经躺了好几年,理由都一样:攻击者也是人,他们不会有耐心把这些一个个试过来。

这个前提,现在不成立了。

它试了一万七千六百次,绝大多数都失败了。但它不需要每次都对,只需要把其中一条路径走通。

所以真正需要重新评估的,是安全清单的优先级。那些因为「攻击成本高、性价比低」而被搁置的条目,现在要重新算一遍账。

这期就到这儿。如果这期对你有用,帮我点个赞、投个币、加个收藏,这对我很有帮助。


参考资料与延伸阅读

本文事实来源

Hugging Face 首次披露

OpenAI 官方披露

Hugging Face 技术复盘(本期主源)

Tailscale 自我复盘

事实边界

  • 本期关于“更像一次作弊尝试”的表述,是 Hugging Face 根据行为轨迹作出的判断,不是对模型主观意图的读取。
  • 评测没有启用生产安全分类器,并降低了网络安全拒答;不能把极端评测条件直接推广到日常模型接口。
  • 公开材料主要来自事件相关方的自我披露,不等于已经完成独立第三方审计。

相关观看入口

资料核验日期:2026-08-23。