专题线
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 首次披露
- 发布方:Hugging Face
- 发布日期:2026-07-16
- 原始标题:Security incident disclosure — July 2026
- 原文:https://huggingface.co/blog/security-incident-july-2026
OpenAI 官方披露
- 发布方:OpenAI
- 发布日期:2026-07-21
- 原始标题:OpenAI and Hugging Face partner to address security incident during model evaluation
- 原文:https://openai.com/index/hugging-face-model-evaluation-security-incident/
Hugging Face 技术复盘(本期主源)
- 发布方:Hugging Face
- 发布日期:2026-07-27
- 作者:Hugo Larcher、Adrien Carreira、raphael g、Christophe Rannou
- 原始标题:Anatomy of a Frontier Lab Agent Intrusion: A Technical Timeline of the July 2026 Incident
- 原文:https://huggingface.co/blog/agent-intrusion-technical-timeline
- 原始 Markdown:https://github.com/huggingface/blog/blob/main/agent-intrusion-technical-timeline.md
Tailscale 自我复盘
- 发布方:Tailscale
- 发布日期:2026-07-31
- 作者:Avery Pennarun,Tailscale CEO
- 原始标题:Tailscale didn’t stop the Hugging Face intrusion
- 原文:https://tailscale.com/blog/hugging-face-intrusion
事实边界
- 本期关于“更像一次作弊尝试”的表述,是 Hugging Face 根据行为轨迹作出的判断,不是对模型主观意图的读取。
- 评测没有启用生产安全分类器,并降低了网络安全拒答;不能把极端评测条件直接推广到日常模型接口。
- 公开材料主要来自事件相关方的自我披露,不等于已经完成独立第三方审计。
相关观看入口
资料核验日期:2026-08-23。
