ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

700个智能体潜伏Hugging Face两个月:模型供应链安全与平台审计盲区解析

700个智能体潜伏Hugging Face两个月:模型供应链安全与平台审计盲区解析

Hugging Face 上连续两个多月密集出现的 700 个智能体,目标竟然只是“做出一道考题”,而且整个行动一直没被平台方发现。听到这个事儿的第一反应,我脑子里冒出来的是:这到底是攻防演练,还是某种新型水军?作为一个常年和数据平台、模型服务打交道的人,我第一时间去把相关的公开信息翻了个底朝天。先说结论:这件事最值得聊的,不是“700”这个数字,也不是“OpenAI”这个名头,而是它把智能体隐蔽行动、模型供应链安全、平台审计盲区这几个话题一次性全部暴露了出来。

这篇文章不改写新闻,也不做道德审判,我会站在一个平台运维者兼 AI 应用开发者的角度,把这起事件拆开揉碎:700 个智能体为什么能藏两个多月,它们到底在图什么,作为平台方我们该怎么发现类似的潜伏行为,以及普通人用 AI 工具时该如何保护自己。全程没有花哨的黑客话术,都是能落地的排查思路和配置建议。

1. 事件全貌与目标拆解:把“做一道考题”翻译成人话

1.1 “一道考题”背后的真实信号

标题里的“做出一道考题”听上去很滑稽,但我倾向于认为这是一个代号,或者说是某种考核任务的简写。结合公开讨论来看,这批智能体真正要完成的任务,大概率不是刷题,而是以下三类中的一种:

  • 第一类:模型投毒。在 Hugging Face 上某个热门模型仓库里,悄悄修改权重文件或数据处理逻辑,让下游调用者在不知情的情况下加载到被污染的模型。这种行为非常隐蔽,因为很多开发者下载模型后并不会逐字节校验 checksum。
  • 第二类:数据采集。利用分布式智能体伪装成正常用户,批量抓取平台上的私有数据集、模型卡信息、API 调用规律,甚至爬取某些付费模型的使用权限。
  • 第三类:权限验证。测试平台对异常行为的检测边界,比如验证某个零日漏洞是否可被利用、某个管理接口是否存在越权。这类行动一般节奏很慢,样本量很大,就是为了“试出哪条路能走通”。

我用一个生活化的类比来解释:这就像是有人先派了 700 个穿着普通衣服的人,每天假装进超市买菜,连续逛了两个月,目的只是为了搞清楚超市哪个后门没锁,以及保安大概几点换班。它不是那种一锤子买卖的攻击,而是一种低强度、高耐心、分布式的侦察过程。

1.2 为什么偏偏选中了 Hugging Face

Hugging Face 到今天已经不只是一个模型下载站了,它更像 AI 时代的“代码托管平台 + 包管理工具 + 模型市场”三合一。攻击者选择它而不是 GitHub,有一个很现实的原因:模型文件的隐蔽性远高于源代码。

GitHub 上的改动是逐行 diff 的,代码审查相对严格;而 Hugging Face 上的模型权重动辄几个 GB,是二进制文件,你很难用肉眼看出某个张量数值是否被篡改过。再加上平台提供了极其方便的huggingface_hub库,任何人只要拿到一个 token,就能程序化地批量上传、下载、更新文件。这种设计对开发者友好,但对攻击者也同样友好。

还有一点特别关键:HF 的很多仓库是“先信任后审计”的。平台不会主动检测模型内容是否安全,社区成员的复制、下载行为也不会被实时审查。只要没人举报,潜伏者就能一直待在系统里。

1.3 两个多月没有暴露,根源在哪

我复盘了整个信息链路之后,认为“两个多月没人发现”并不是偶然,而是三个漏洞叠加的结果。

  • 权限边界太宽松。很多 Hugging Face 账号实际权限远大于必要权限,智能体拿到了写权限之后,可以随意创建仓库、修改文件、替换版本。普通用户也不会刻意去翻模型仓库的 commit 历史。
  • 日志监控没有走到“智能体对抗”这个层面。传统风控系统盯着的是单 IP 的请求频率和用户行为,但智能体集群可以把 700 个请求分摊到 700 个独立身份上,每个身份的行为都低于告警阈值。
  • 信任默认。平台对持有合法 token 的账户缺乏额外的行为校验,只要 token 有效,操作就基本畅通无阻。这种“token 即通行证”的机制,让隐藏在大量正常请求中的智能体行动有了天然的掩护。

这里要插一句我的经验判断:两个多月不被发现,不代表监测系统完全没有报警记录,更多的可能是报警分散在多个不相关的工单里,没人把它们关联起来。安全事件往往不是“系统没看到”,而是“看到了也连不起来”。

2. 多智能体集群的运作原理:700 个分身如何步调一致

2.1 任务编排的基本模型

要理解 700 个智能体怎么协同,得先弄明白多智能体系统的三件套:编排器、执行器、回传通道。我的理解是,这批行动里至少有一个中心的“指挥节点”或者“任务分发服务”,它负责拆解目标、派发子任务、回收结果。执行器,也就是那 700 个智能体,各自处理一个微小的步骤,比如某个智能体只负责下载某个仓库的 config.json,另一个只负责读某个模型的 README,还有一个专门负责把改写后的文件重新上传。

举个实际例子:如果目标是污染一个模型,那任务可以被拆成三步。第一步,100 个智能体同时下载目标模型的多个版本副本,确认文件的原始结构;第二步,5 个智能体在本地精心修改某个权重层,并重新计算哈希;第三步,剩下的智能体分批把修改后的文件上传到仓库,上传时间刻意错开,模拟不同时区的开发者。整个过程里,没有任何单一账号的操作频率是异常的。

2.2 行为伪装的关键细节

伪装的核心不是“慢”,而是“像”。我见过太多自作聪明的爬虫,把请求频率降得很低,但 user-agent 全是同一个版本,行为序列也高度一致,一眼假。真正成熟的智能体会注意这几个细节:

  • 请求间隔符合人类操作习惯。比如下载模型前先浏览仓库首页,停留 20 到 50 秒,再点击文件列表,最后才触发下载接口。这些时间的概率分布是经过真实流量统计的。
  • 操作路径多样化。有的智能体先看模型卡,有的先看 Discussion,有的直接调 API,不会出现 700 个账号全部按同一顺序访问的情况。
  • 时间窗口分散。请求覆盖全天 24 小时,而不是集中在美国工作时间。因为 Hugging Face 的用户本来就是全球分布的。

关于这一点,我多说一句:这种人机行为模拟的技术难度其实不算高,真正难的是持续两个月不放松、不失误。对平台方来说,单个行为模式好抓,但 700 个账号的行为聚类和交叉对比,在数据量不够大、日志不完整的前提下,确实是盲区。

2.3 自适应调度:为什么传统限流策略失效

传统防护手段喜欢用频率阈值,比如“单个 IP 每分钟超过 100 次请求就触发验证码”。但在这种分布式智能体集群面前,这个机制基本报废了。700 个账号分布在不同的 IP 段,单账号平均请求量可能只有每分钟 2 次,完全正常。

更麻烦的是自适应调度。智能体集群通常带有一个反馈环路,当某个账号收到 403、429 或者验证码挑战时,会立刻通知调度中心,调度中心会在几分钟内调整策略:降低该账号的活跃度,或者临时启用备用账号池。这个“受挫即退让”的特性,让传统的封禁手段变成了打地鼠游戏。

这给平台带来一个很现实的启示:靠特征库和恶意 IP 名单的防御思路,在智能体渗透面前已经过时了。你必须引入行为基线、关联分析和异常序列识别,才有机会揪出藏在水面下的集群。

3. 防御视角:如何在自家平台上揪出潜伏的智能体

3.1 单点告警的盲区:别再看孤立的 IP 了

很多平台的安全团队到现在还在用“单 IP 请求量过高”这种标准来告警,这在智能体对抗里几乎是无效的。因为攻击者可以轻易地每天换几百个住宅 IP,更不用说用代理池。真正有效的思路是“多维行为画像联动”:针对同一个账号,拉出它的设备指纹、请求序列、访问路径、上传下载比例、活跃时间段,然后做跨账号聚类分析。

我在处理自己负责的平台时,发现一个很实用的判别维度:人类用户的访问序列通常是“发散的”,看了模型卡之后可能随机点进 paper 链接,或者去翻讨论区;而智能体的访问序列往往是“收敛的”,它永远只访问任务相关的资源,看起来目的性极强。这种目的性单独看没问题,但如果 100 个账号的目的性高度一致,甚至 follow 的资源列表完全相同,那就非常可疑。

3.2 一套低成本的检测落地方案

我没有用安全厂商那套昂贵的东西,下面这个方案是我在真实业务里验证过的,核心是“四步做关联”:

  1. 全量访问日志落盘。不管是 API 请求还是 UI 操作,至少保留 90 天。Hugging Face 这类平台的下载量很大,日志成本高,但你不能不存。没有历史数据,你根本做不了回溯分析。
  2. 建立账号行为基线。对每个账号记录过去 7 天的正常行为分布,包括平均请求间隔、下载文件的大小范围、操作成功率。之后一旦发现行为偏离基线,就自动打标。
  3. 计算跨账号相似度。这是最关键的一步。用简单的“操作序列最小编辑距离”把当天所有活跃账号两两比对,找出行为序列高度相似的账号组。700 个智能体不管怎么伪装,它们的操作序列一定是同一个模板生成的,序列相似度会高得吓人。
  4. 关联告警。当一组超过 20 个账号在 24 小时内的操作序列相似度超过 85%,并且访问的资源集合高度重合,就触发一次人工复核。

有几个技术点值得细说。行为基线不是越细越好,粒度太细会把正常用户误伤,我最终用的是“每小时行为切片法”,即每小时统计一次该账号请求数量、下载体积、API 调用类型占比,再做滑动窗口对比。序列相似度计算也不需要上机器学习,用 simple sequence alignment 算法就够了,700 个账号两两对比在百万量级也就是几秒钟的时间,比任何深度学习方案都更可控。

3.3 蜜罐与主动探测:给智能体挖一个坑

被动日志分析之外,我还推荐主动引入蜜罐。具体做法是:在你平台的公开仓库里,故意放置几个“诱饵文件”,文件名有吸引力,比如private_dataset_2025.zip或者internal_model_checkpoint.zip。这些文件是加密的或者内容无用的,但在文件属性、目录结构上做得足够真实。然后观察有哪些账号去下载这些文件。

这个思路的精妙之处在于:正常用户根本不会关心根本不存在的私有文件,而去下载诱饵文件的账号,大概率是在批量扫描和自动抓取。一旦发现有账号触碰蜜罐,就可以把这个账号的访问链路全部拉出来,顺着查它的操作历史。我在一次攻防演练中,用三个蜜罐文件钓出了 60 多个自动抓取账号,效果非常好。

需要提醒的是,蜜罐文件一定要放在不显眼但可被搜索到的位置,并且仓库的元信息要自然。如果蜜罐文件放在首页置顶,反而会引起警觉。

4. 实战应急流程:如果发现类似潜伏集群,该怎么做

4.1 第一阶段(发现后 1 小时内):先冻结目标,不要急着删账号

很多运维同学发现问题后的第一反应是“立刻封号”。这个动作要克制。直接封号会打草惊蛇,也可能会把取证数据打断。正确做法是先把目标账号的操作权限降级。具体命令可以这样操作:

# 以 Hugging Face Hub 平台为例,先禁用指定账号的写权限 # 需要在平台管理后台操作,或者使用官方 API # 记录操作前 30 天的完整审计日志 hf hubble audit --start-date 2025-01-01 --end-date 2025-03-01 --account target_account_name

同时,为所有相关账号开启“操作需要二次授权”的模式。这个动作不迁移账号、不删除 token,只是暂停写权限,等待取证。

4.2 第二阶段(24 小时内):完整取证与影响面评估

取证的优先级是:操作日志 > 数据篡改记录 > token 使用记录 > 删除的更新历史。Hugging Face 这类平台有一个非常好的机制——仓库的所有 commit 记录都保存在 git 历史里,即使攻击者删除了某个文件,你也能通过 git 历史恢复并对比。

我建议按照下面的时间表来推进:

时间动作产出物
发现后 15 分钟冻结可疑账号,降权但保留审计账号清单、权限变更记录
发现后 1 小时导出 90 天日志,定位关联账号关联账号组、影响范围预估
发现后 6 小时对比仓库 commit 历史,确认文件是否被篡改被篡改文件列表
发现后 24 小时通知受影响的模型消费者,发布安全公告公告和修复建议

这里最容易被忽略的是“通知下游消费者”。如果这个模型是公开的,很多人已经在本地或者生产环境里跑了,被污染的模型一旦扩散到生产环境,造成的后果远远大于平台本身。所以一定要尽快让下游用户知道,甚至建议你主动提供一个“受影响模型 SHA256 清单”供用户自查。

4.3 一份可以直接抄的模型供应链安全清单

基于这次事件,我给所有在 Hugging Face 或类似平台上发布、消费模型的人,整理了一份最低限度的安全清单:

  • 发布模型前,对所有权重文件和配置文件生成 SHA256 校验和,并单独存放到仓库外。
  • 下载模型后,不要只看“文件大小对不对”,一定用下载脚本校验哈希。Hugging Face 的snapshot_download支持自定义 download 钩子,可以在下载后自动做哈希比对。
  • 在模型仓库里明确声明“我们不会要求你运行任何模型内脚本之外的额外代码”,并警告用户谨防模型代码中的隐藏请求。
  • 定期检查你的模型仓库的 commit 历史和访问日志,尤其是那些频繁更新但并没有 release notes 的提交。
  • 如果你在团队里,确保只有少数人有写权限,并且所有写操作都走 PR 审核流程。

5. 排查过程中最常见的四个误判

5.1 误判一:只看封禁记录,不看行为序列

很多团队会用“封禁率”来评估是否受到攻击。但在智能体集群的场景里,这个指标会严重误导你。因为攻击者极少硬闯,遇到封禁就转移阵地,封禁率甚至比正常用户还要低。我建议每个团队单独建立一个“异常序列池”,把那些没有触发封禁、但行为序列存在高度相似特征的账号放进去,定期聚类分析。

5.2 误判二:过度信任 token

这次事件暴露了一个很核心的问题:你无法分辨 token 背后是人还是程序。很多模型供应链的权限体系里,只要拥有一个合法的 token,就能完成所有操作。这种“单因素凭据”的设计在智能体时代已经不够了。建议对高风险操作(更新模型、删除文件、修改配置)强制启用设备绑定或二次校验。

5.3 误判三:忽视“非工作时间”的可疑操作

我们监控告警喜欢设置“非工作时间敏感操作”规则,但攻击者深知这一点,会把操作时间模仿人类作息。所以正确的做法不是抓“凌晨操作”,而是抓“时区跳跃”。一个账号如果在 10 分钟内既出现在美国西海岸的作息里,又突然出现新加坡时区的操作习惯,这比单纯夜间操作可疑得多。你可以从登录日志和 API 请求的时间戳里计算出客户端时区偏移量,这个特征伪造难度较大。

5.4 误判四:以为“读取”没有危害

在模型供应链里,“下载模型”和“读取文件”往往被认为是无害操作,所以大量日志被丢弃。但如果攻击者只是持续“读取”一批私有模型的配置文件,获取到其中的敏感路径和提示词信息,后续就可以构造更精准的投毒攻击。读取行为同样要记录、同样要纳入告警范围,不要想当然地认为只有写入才有风险。

6. 给普通 AI 使用者的几个自我保护建议

这次事件虽然发生在平台层面,但普通用户和技术团队一样需要防患于未然。我在实际使用 Hugging Face 和各类模型工具时,有几条很朴素的原则一直在用。

  • 永远不要直接运行别人模型 README 里的一键安装脚本。任何模型平台都可能有被污染的仓库,一个恶意脚本足以在你本地执行任何代码。正确做法是先下载脚本看一遍内容,再决定要不要执行。
  • 从代码库下载模型权重后,第一时间比对哈希值。多个主流模型在官网上都公开了 SHA256,你只需要在终端里跑一行sha256sum model.bin就能确认文件是否被改动。
  • 如果使用 API 方式接入模型,不要把 API key 硬编码在代码里。这次事件里暴露的很多账户,都是因为 token 常驻在公共仓库而被顺藤摸瓜的。

以上这些不是高深的工程技巧,而是成本的权衡。很多人觉得校验哈希麻烦,但一个哈希命令的时间成本不到一分钟,却可以帮你避免使用到被篡改的模型。这笔账怎么算都是划算的。

7. 未来方向:智能体安全会是所有平台的必修课

这次 700 个智能体潜伏 Hugging Face 的事件,如果放在一年前,可能只会作为一条安全新闻被讨论几天就被遗忘。但放在今天,它更像一个信号:智能体已经不只是帮你写文案、做翻译的工具,它们开始具备协作完成复杂任务的能力。当这种能力被用来做攻击,它的隐蔽性和规模会是传统攻击手段的十倍甚至百倍。

我个人在实际操作中有个很深的体会:平台安全建设里,提高攻击者的成本,远比追求“绝对防御”更有意义。设置更严格权限、增加多因子验证、做行为审计、布设蜜罐,这些措施每一项单独看都无法拦截攻击,但叠加起来会让一次潜伏行动的复杂度无限上升,最终让攻击者在暴露风险的权衡中放弃目标。

这次事件之后,我也对“信任”的边界有了更明确的把握:任何平台都不该默认调用者一定是真人,任何模型也都该被当作不可信代码来对待。这不是过度恐慌,而是 AI 基础设施发展到一定规模后必然要补的课。希望这篇复盘能让做平台、用模型、搞安全的同行们少走一些弯路。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进