2026 年 3 月 24 日,PyPI 上出现了两个会窃取凭据的 LiteLLM 版本,存在了大约 40 分钟。LiteLLM 既不是模型,也不是提示词,而是许多应用用来调用模型的那个库。这就是 AI 供应链:位于外部来源和你的应用之间的一切。
传统的供应链攻击打的是你没有亲手写的代码。到了 AI 这里,还多了几样东西:没人读得懂的组成部分,不发版本就会改变的组成部分,以及会自己行动的组成部分。这篇文章是概览:六个入口,每个入口一个有据可查的事件,以及应该先做什么。关于模型文件的深入篇见《开源模型及其风险》。
AI 供应链包括什么
凡不是你自己构建、却仍然决定你的应用做什么的东西,都属于供应链。对一个 AI 系统来说,它有六个组成部分:
从来源到你的应用的路线。六个站点中的任何一个,都可能有人做了替换,而终点处毫无察觉。
- 数据。训练数据、微调数据,以及系统在运行时检索的一切(RAG// RAGRetrieval-Augmented Generation(检索增强生成):系统在回答之前先检索自己的知识库,并把检索结果交给模型。例子每次回答前先查阅手册的客服机器人。)。
- 模型。权重和架构,通常来自 Hugging Face 这样的模型仓库,还包括适配器和转换后的变体。
- 软件包。框架及其依赖,从 PyTorch 到最小的辅助库。
- 基础设施。模型仓库、软件包索引、构建流水线,以及访问它们的凭据。
- 供应商与 API。托管模型、网关,以及它们背后的服务商。
- 智能体工具。MCP 服务器// MCP 服务器智能体用来接入工具和数据的扩展。MCP 即 Model Context Protocol。例子让智能体发送邮件或访问 GitHub 的服务器。、Skills、插件,以及决定行为的提示词模板。
这种划分并非本文自创。OWASP 把供应链列为 LLM 应用的一项独立风险(LLM03)。MITRE ATLAS 收录了 AI Supply Chain Compromise 这一技术,并为硬件、软件、数据、模型、容器镜像仓库和智能体工具分别设了子技术。
新在哪里
其中很多内容在软件领域早已为人熟知。有四点不一样。
1 // 没人读得懂的组成部分
源代码可以评审,diff 会显示每一处改动。权重则是数百万到数十亿个数字,没人能从中看出被训练进去了什么。OWASP 把模型称为二进制黑盒,认为静态检查几乎提供不了安全保证,并指出目前已发布的模型没有可靠的来源证明。
模型背后的数据也是如此。2025 年,Anthropic 与英国 AI 安全研究所、艾伦·图灵研究所共同证明,250 份投毒文档就足以植入后门,受测模型的规模从 6 亿到 130 亿参数不等。他们测试的后门刻意设计得很简单。如果你通过 RAG 给系统接入自己的知识,这个问题就会延续到运行时:在 PoisonedRAG 研究中,面对一个包含数百万条文本的知识库,针对每个目标问题只需注入五条文本,攻击成功率就达到 90%。
2 // 不发版本就会改变的组成部分
软件包只有在有人发布新版本时才会改变。API 背后的模型却可以在你的调用毫无变化的情况下改变。斯坦福和伯克利的研究人员在 2023 年比较了同一服务的两个时间点:3 月时 GPT-4 判断质数的正确率为 84%,6 月只有 51%。他们的结论是:“同一个”服务的行为可能在很短时间内发生显著变化,因此需要持续监控。
变的甚至不一定是模型。2025 年 9 月,Anthropic 披露有三个基础设施缺陷在数周内间歇性地降低了 Claude 的回答质量。最严重的一个小时里,其中一个模型有 16% 的请求受到影响(事后分析)。Anthropic 强调自己从不故意降低质量。但对作为客户的你来说,效果是一样的:结果变了,你的代码没变。
应对的办法是使用固定的模型版本。OpenAI 称之为快照(snapshot),在 Anthropic,每个模型 ID 都对应一个固定版本,旧模型的别名除外。
3 // 语言成了载体
在传统软件里,注释是无害的。在 AI 系统里,文本就是控制:提示词模板、规则文件和工具描述决定了模型做什么,却很少有人像评审代码那样评审它们。2025 年,Invariant Labs 描述了工具投毒(Tool Poisoning):藏在 MCP 工具描述里的指令,用户看不到,模型却会读到。此外还有“Rug Pull”:服务器在描述获得批准之后再把它改掉。Pillar Security 在编程助手的规则文件上演示了同样的手法,指令用不可见的 Unicode 字符隐藏起来。
这两项都是研究成果。真实环境中的第一次尝试由 Pillar 在 2026 年 8 月记录:一个账号在 74 分钟内向他人的项目提交了 23 个 Pull Request,其中大多数想要接入一个做过手脚的 MCP 服务器(Deadbugz)。这个服务器在前三次调用中表现正常,随后把智能体引向 SSH 密钥和云凭据。截至分析时,这些 Pull Request 没有一个被合并,还有四个仍处于打开状态。
4 // 会自己行动的组成部分
包管理器只安装文件里写明的东西。智能体则自己决定安装什么、调用哪个工具。这带来两个后果。第一,出现了没有任何人挑选过的依赖:在一项覆盖 16 个 LLM 的研究中,19.7% 的推荐软件包并不存在。2026 年初,Aikido 在 237 个 GitHub 仓库里发现了同一个被编造出来的包名,它随着被复制的智能体 Skills 四处扩散;Aikido 抢先把这个名字注册了下来。
第二,智能体本身成了攻击者的工具。据 Wiz 分析,在 2025 年 8 月的 Nx 事件中,攻击者调用了受害机器上已安装的 AI 命令行工具来读取文件系统。一年之后,一个 npm 蠕虫把恶意钩子写进了 .claude/settings.json 和 .vscode/tasks.json,让自己的代码在下次启动时自动运行,并把提交记录伪装成编程助手所为(Aikido)。
六个入口,六项实证
六个组成部分中的每一个,都至少有一起记录在案的事件。
| 组成部分 | 发生了什么 | 说明了什么 |
|---|---|---|
| 1 数据 | 2026 年 7 月:一个精心构造的数据集在 Hugging Face 的数据集处理环节触发了代码执行,攻击者得以访问内部数据集和凭据。 | 数据不只是内容,它本身就可以是攻击。 |
| 2 模型 | 2024 年 2 月:JFrog 在 Hugging Face 上发现约 100 个加载时会执行代码的模型。2026 年 5 月:一个仿冒仓库登上趋势榜第一(HiddenLayer)。 | 受欢迎不等于经过检验。详见深入篇。 |
| 3 软件包 | 2022 年 12 月:PyPI 上的 torchtriton 包与 PyTorch-nightly 的一个依赖同名,并窃取 SSH 密钥(PyTorch)。这种手法叫作依赖混淆// 依赖混淆公共仓库里的包与内部包同名,结果被安装的是它。例子内部有 acme-utils 1.2,攻击者在 PyPI 上发布 acme-utils 99.0,pip 会选择版本更高的那个。。 |
一个包名就够了。 |
| 4 基础设施 | 2026 年 3 月:攻击者覆盖了安全扫描器 Trivy 的 GitHub Action 77 个版本标签中的 76 个(Aqua Security)。LiteLLM 怀疑几天后自己的事件源于其 CI 中的这个 Trivy 依赖,但尚未证实。 | 本该保护你的工具,同样是供应链的一环。 |
| 5 供应商与 API | 2025 年 1 月:Wiz 发现 DeepSeek 一个可公开访问的数据库,其中有一百多万行日志,包括聊天记录和密钥。2025 年 11 月:OpenAI 使用的分析服务商 Mixpanel 被导出了 API 用户的姓名、邮箱地址和组织 ID。聊天内容和密钥未受影响。 | 每个供应商背后都有一条你看不见的供应链。 |
| 6 智能体工具 | 2025 年 9 月:一个 npm 包冒充 Postmark 的 MCP 服务器,从 1.0.16 版起把邮件密送到外部服务器(Postmark)。2026 年 2 月:在 3,984 个受检的智能体 Skill 中,13.4% 存在严重级别的安全问题(Snyk)。 | 给智能体的一个工具,就是一个握有行动授权的依赖。 |
应该先做什么
没有人能在一天之内守住六个组成部分。下面五步收效最大,请按这个顺序来。
- 1. 建立清单。把你们加载的东西写下来:模型及其修订版本、数据集、软件包、供应商、MCP 服务器、提示词模板。软件部分已有现成的格式,即 SBOM// SBOMSoftware Bill of Materials:机器可读的软件物料清单,列出全部组成部分及其版本。例子一个 JSON 文件,其中有
torch 2.6.0、numpy 1.26.4这样的条目。。针对 AI,G7 网络安全工作组在 2026 年 5 月提出了最低要素建议,由德国联邦信息安全局(BSI)发布:SBOM for AI, Minimum Elements。 - 2. 全部固定。模型固定到提交哈希,软件包固定到哈希,API 使用固定的模型版本,MCP 服务器固定版本,提示词放进自己的仓库。不会自己变化的东西,就不会让你措手不及。
- 3. 运行之前先检查。扫描模型文件,并且第一次加载时不联网。具体怎么做,见深入篇。
- 4. 限制权限。智能体、构建流水线和推理服务器只拿到必需的访问权限,并且没有通向外部的自由通道。这样一来,某个组成部分被攻破只是一次事件,而不是一场灾难。更多内容见防御手册。
- 5. 观察行为。用一组固定的测试用例检验每一个模型,每次更换之前都跑一遍,之后也定期运行。对 API 模型来说,这是你唯一能做的检查。
| 组成部分 | 第一项措施 | 工具 |
|---|---|---|
| 数据 | 记录来源,把数据集固定到某个修订版本,限制运行时检索的来源。 | 数据集修订版本、评审 |
| 模型 | 只允许 Safetensors,加载前扫描,按提交哈希加载。 | ModelAudit、Fickling、ModelScan |
| 软件包 | 只用一个软件包索引,安装时强制校验哈希,评审每一个新依赖,包括助手推荐的那些。 | pip --require-hashes、uv、pip-audit |
| 基础设施 | 令牌只给最小权限,Action 和镜像固定到提交而不是标签,凭据轮换要彻底。 | zizmor、Syft、Grype |
| 供应商与 API | 使用固定的模型版本,记录模型 ID,把测试用例作为回归测试,每个服务使用单独的密钥。 | promptfoo、garak |
| 智能体工具 | 像对待依赖一样对待 MCP 服务器和 Skills:读源码,固定版本,限制权限。提示词放进自己的仓库。 | Git、锁文件、评审 |
软件包方面的两个陷阱
pip-audit 找的是已知漏洞,不是恶意软件包,它的文档明确说明了这一点。另外,按照 pip 文档,对私有包使用 --extra-index-url 是不安全的,因为 pip 会在所有索引中挑选最佳版本。uv 默认会停在第一个包含该包的索引上。
监管怎么说
有三套规则涉及 AI 供应链,但没有哪一套能完整覆盖它。
- 《网络弹性法案》(Cyber Resilience Act)。带有数字元素的产品的制造商,必须以常用的机器可读格式编制软件物料清单,至少覆盖顶层依赖(欧盟第 2024/2847 号条例附件一第二部分)。他们不必公开这份清单。该条例自 2027 年 12 月 11 日起适用,其中的报告义务自 2026 年 9 月 11 日起已经适用。某个具体模型是否在其范围内,取决于产品本身。
- 《人工智能法案》(AI Act)。通用 AI 模型的提供者必须向集成其模型的一方提供信息和文档(欧盟第 2024/1689 号条例第 53 条,自 2025 年 8 月 2 日起适用)。对于以自由许可发布且公开权重的模型,只有在具有系统性风险时才适用这一要求。也就是说,偏偏是开放模型可能缺少这些文档。对于高风险系统,第 25 条要求与供应方签订书面协议;以自由开源许可公开提供工具或组件的一方除外,通用 AI 模型的提供者则不在豁免之列。在 2026 年 7 月的修订之后,这一要求最早自 2027 年 12 月 2 日起适用,附件一所列系统则要到 2028 年 8 月 2 日。
- 建议性文件。NIST 在 SP 800-218A 中建议,在使用任何外部获取的模型之前,先验证其完整性和来源。OWASP 自 2025 年 12 月起发布了专门的智能体应用十大风险,其中 ASI04 就是智能体的供应链。两者都不具约束力。
简短版
- AI 供应链有六个组成部分。大多数团队只守住了其中一两个。
- 新的不是“通过供应方发起攻击”这件事。新的是:组成部分读不懂,不发版本就会变,可以用语言操控,还会自己行动。
- 过去两年的事件几乎都来自合法渠道:一个官方软件包、一次真实的构建、一个名声不错的工具。
- 建清单、固定、检查、限制权限、观察行为。按这个顺序来。
来源:
想知道这六个入口里,你们有哪些还敞开着?我们聊聊。用 30 分钟,一起把你们的供应链逐个环节过一遍,没有任何义务。