Agent 安全 #07:Agent 供应链安全——MCP 服务器、插件和依赖的信任边界
系列第 7 篇。前 6 篇:Prompt Injection 防御、Tool Sandbox 安全边界、多 Agent Kanban 架构、凭据保险库设计、审计与可观测性、灰度发布与回滚。
TL;DR
传统软件的供应链只关心"代码依赖 + 构建产物",Agent 的供应链比它宽得多:模型、微调数据、RAG 数据源、工具描述、MCP 服务器、插件、配置文件、长期记忆,任何一个环节被污染都可能改变 Agent 的行为。MCP 生态被称为"高风险、高速度、零信任"的软件供应链——截至 2026 年初已有超过 12,000 个公开 MCP 服务器,多数没有官方认证或审计。防御的核心不是"禁止接入",而是三件事:AI-BOM 清单化(知道依赖了什么)、动作级授权(最小权限)、变更即审查(信任不能传递)。
为什么 Agent 供应链是全新的攻击面
传统供应链 vs Agent 供应链
| 维度 | 传统软件供应链 | Agent 供应链 |
|---|---|---|
| 组件 | 代码依赖、开源包、构建产物、运行环境 | 模型权重、微调数据、RAG 数据、工具描述、MCP Server、插件、Persona、配置文件、长期记忆 |
| 污染后果 | 代码被篡改、漏洞被利用 | 行为被改变——Agent 可能在特定条件下执行完全不同的动作 |
| 攻击者目标 | 植入恶意代码、窃取数据 | 诱导 Agent 合法调用工具完成恶意目标(数据窃取、越权操作、资源消耗) |
| 可见性 | SBOM(软件物料清单)已有成熟工具 | AI-BOM 刚刚起步,多数团队没有清单 |
核心区别:传统供应链的攻击者要"攻破系统"才能利用依赖漏洞;Agent 供应链的攻击者只需要让 Agent 自己调用合法工具。工具本身是干净的,但工具的组合可能构成一条数据外泄链——CRM 工具只读客户信息、邮件工具只发邮件,单独看都安全,但 Agent 被诱导"先读客户信息,再通过邮件发出去",两个合法工具就组合成一次数据泄露。安全边界不在单个工具,而在工具组合的意图。
五类供应链组件:从哪进来的都可能有毒
基于自有生产经验和业界案例分析,Agent 的供应链入口至少有以下五类:
1. MCP 服务器 / 工具服务器
MCP(Model Context Protocol)服务器向 Agent 暴露三类能力:Tools(工具)、Resources(资源)、Prompts(提示词模板)。攻击面集中在:
- 工具描述投毒(Tool Poisoning):MCP Server 返回给 Agent 的工具描述(
description字段)里嵌入隐藏指令。Agent 读取描述后可能把恶意指令当成"该工具的使用说明"执行。首次安装时安全的服务器,后续版本更新可能悄悄加入注入指令——这就是"地毯拉取"(rug-pull)攻击:先建立信任,再在更新中投毒。 - 资源内容投毒:MCP Server 提供的 Resources(文件、数据库内容、API 响应)是 Agent 上下文的一部分,内容里夹带指令就是间接注入。
- Prompts 投毒:MCP 的 Prompts 字段是"预写好的提示词模板",恶意服务器可以在模板里预设后门指令。
2. 第三方代码依赖与安装脚本
Agent 运行时(如 Claude Desktop、Cursor、各类 CLI)会从 README 加载配置、在会话启动时执行钩子脚本、安装依赖时运行 lifecycle 脚本。这些环节的信任传递非常隐蔽:
一次软件包安装,不应悄无声息地决定未来每次代理会话或文件夹打开时要执行什么。
危险的不是任何单一功能——安装脚本、钩子、任务、工作流都支持正当自动化。危险的是信任传递:你信任了 A 包,A 包的安装脚本信任了 B 脚本,B 脚本下载了 C 载荷。审查时只看了 A,但执行链是 A→B→C。
3. 模型与微调数据
模型本身是供应链组件:开源模型可能是"被后门过的版本"(同名词霸占、hash 不一致),微调数据里可能埋了触发条件(特定输入→特定恶意行为)。这类污染最难发现,因为模型权重不可读。
4. RAG 知识库 / 文档源
RAG 数据源被插入恶意内容后,Agent 会持续引用错误事实或执行隐藏指令——而且是每次检索都触发,比单次 prompt 注入更持久。Wiki、Confluence、GitHub 仓库文档、爬虫抓取的网页都是入口。
5. 长期记忆 / 会话状态
Agent 的长期记忆(向量库、记忆文件、会话摘要)是"会生长的上下文"。记忆被污染 = 未来的每一次对话都被污染。记忆注入的可怕之处在于:它不依赖当前输入,攻击者可以在你不知情时改掉记忆库里的"事实",让 Agent 以后每次都按错误前提行动。
自有经验的三个教训
教训 1:工具越多,越需要清单
在生产环境实际接入 MCP 服务器、GitHub 工具、自动化脚本后,第一个体会是:不列清单,你根本不知道自己的 Agent 依赖了什么。没有清单就无法回答最基础的安全问题:"这个 Agent 能用哪些工具?这些工具能碰哪些数据?这些数据会流向哪里?"
落地动作:给每个 Agent 建一张卡片,记录它的模型来源、工具列表、MCP Server 清单、可访问的数据源、凭据挂载点。这就是最简版的 AI-BOM。
教训 2:凭据是供应链的放大器
Agent 能调用的工具权限 = 它持有的凭据。一个 Agent 如果持有写库权限 + 邮件权限,那它本身就是一个"组合攻击链"。凭据管理必须遵循:最小权限 + 环境审批 + 短期令牌。长期令牌(几周不过期)是供应链上的定时炸弹——一旦依赖被污染,攻击者借 Agent 之手用长期令牌干任何事。
教训 3:配置文件能执行命令 = 配置就是代码
当 Agent 的配置文件(钩子、任务、工作流、MCP Server 注册)能触发命令执行时,配置文件就该获得和代码一样的审查待遇:
| 组件 | 审查待遇 |
|---|---|
| 新的钩子(SessionStart 等) | 与新的 shell 脚本同等审查 |
| 新的任务/工作流 | 与新的二进制文件同等审查 |
| 新的 MCP Server | 与新的网络集成同等审查 |
| 新的包 lifecycle 脚本 | 与提交前运行的新代码同等审查 |
模糊的规则("使用代理工具时要小心")经不起真实攻击。明确的规则("未经负责人审查不得添加 SessionStart 命令钩子")才给审查者可执行的标准。
攻击路径全景:六条被实证的路线
综合 OWASP LLM Top 10 / OWASP Agentic AI 与 MCP 安全研究,Agent 供应链的主要攻击路径:
| # | 攻击路径 | 机制 | 危害 |
|---|---|---|---|
| 1 | 工具描述投毒 | MCP Server 的 description 含隐藏指令 | Agent 误执行恶意"使用说明" |
| 2 | 版本更新投毒(rug-pull) | 先正常建立信任,更新时加入恶意代码 | 首次审查通过,更新后中招 |
| 3 | 配置/钩子执行 | README 加载、启动钩子、安装脚本 | 会话级命令执行 |
| 4 | RAG 内容注入 | 知识库插入恶意文档 | 每次检索都触发,持续污染 |
| 5 | 记忆污染 | 长期记忆库被篡改 | 不依赖当前输入,跨会话生效 |
| 6 | 工具链组合 | 多个合法工具组合成外泄链 | 单工具无异常,组合出问题 |
其中 #2 是 2025-2026 年最危险的趋势:静态审查只能验证"现在的快照",无法保证"未来的更新"。这迫使 Agent 供应链管理从"一次性审查"走向"持续验证"。
防御体系:五层防线
第一层:AI-BOM——先知道依赖了什么
# 每个 Agent 一份 AI-BOM(示例结构)
agent:
name: code-reviewer
model: { provider: xxx, version: xxx, hash: xxx }
dependencies:
- { type: python-package, name: requests, version: 2.32.0, hash: sha256:... }
- { type: mcp-server, name: github-mcp, url: https://..., version: v1.2.0, signature: ... }
- { type: plugin, name: kanban-lane, version: 1.0.3, source: internal-registry }
data_sources:
- { name: gitlab, scope: read-only, tokens: short-lived }
- { name: slack, scope: read, tokens: env-approved }
memories:
- { store: hindsight, retention: 90d }
清单化的价值:变更可对比。升级依赖时 diff 一下清单,任何"新增的、没经过审查的组件"立刻暴露。
第二层:动作级授权——最小权限 + 逐动作审批
| 工具类型 | 默认授权策略 |
|---|---|
| 只读工具(查数据、读文件、搜索) | 自动允许 |
| 写工具(写文件、改配置、发消息) | 需审批 |
| 高影响工具(删除、转账、发邮件、shell) | 强审批 + 环境确认 |
| 导出/支出工具(外发数据、计费) | 默认禁用,白名单 |
关键:权限粒度到动作,不到"连接"。一个 MCP Server 可能暴露 10 个工具,不能因为"这个 Server 可信"就全部放行——每个工具单独授权,每个动作单独记录。
第三层:变更即审查——信任不传递
- 首次接入:MCP Server 只读模式接入,观察一段时间再放开写权限
- 版本更新:工具/服务器每次更新走版本发布流程,重新安全评估(防止 rug-pull)
- 钩子/任务:新钩子获得 shell 脚本同等待遇的审查
- 凭据:优先 OIDC 或短期令牌,移除未使用的长期令牌
- 安装:CI 中
--ignore-scripts,或安装隔离到临时运行器
第四层:运行时监控——工具调用全记录
Agent 的工具调用必须有完整审计日志:谁调的、调了哪个工具、参数是什么、结果是什么。审计日志的价值在事后:出事后能回答"Agent 到底干了什么"。没有日志,供应链被污染后你连损失范围都估不出来。
监控重点:工具调用的组合模式(如"读取客户数据 → 发送邮件"这种跨工具链),而不是单个调用是否异常。
第五层:快速回滚——供应链事故的逃生通道
灰度发布与回滚(系列第 6 篇)在这里复用:MCP Server 版本、插件版本、Agent 配置都要能一键回滚。供应链事故的特点是一旦发生就持续(RAG 污染、记忆污染都是持久的),所以回滚必须包含数据层——知识库版本化、记忆库可恢复点、配置快照。
行动清单:按优先级排序
| 优先级 | 动作 | 对应防线 |
|---|---|---|
| P0(立即) | 盘点所有已部署的 MCP Server,移除未使用或来源不明的 | AI-BOM |
| P0 | 写类工具强制人工确认(Human-in-the-Loop) | 动作级授权 |
| P0 | 审查所有 MCP Server 的工具描述全文,扫描隐藏指令 | 变更即审查 |
| P1(两周内) | 实施 Agent 最小权限:每个 Agent 仅能访问任务所需的最小资源 | 动作级授权 |
| P1 | MCP Server 网络隔离,禁止访问非必要内部网络 | 运行时监控 |
| P1 | 建立 AI-BOM 清单并纳入变更管理 | AI-BOM |
| P2(持续) | 工具调用全量审计日志 + 组合模式告警 | 运行时监控 |
| P2 | 知识库/记忆库版本化,建立恢复点 | 快速回滚 |
启示
- Agent 的安全边界不在系统提示词,而在工具权限。提示词只能影响模型行为,工具策略才能真正约束行为——再强的 system prompt 也拦不住"合法调用恶意工具"。
- 静态审查是一次性快照,供应链是持续过程。rug-pull 攻击专门绕过"首次审查通过"的信任,持续验证(版本 hash 校验、更新审查、运行时监控)才是常态。
- 最小权限 + 最小代理权。最小权限限制"能访问什么",最小代理权限制"能做什么、什么时候做、在什么上下文做、是否需要升级审批"——两者缺一不可。
- 工具链组合是隐蔽的泄露通道。单工具安全 ≠ 组合安全,监控要看跨工具的数据流模式。
- 没有清单就没有安全。AI-BOM 不是合规负担,是"你知道自己依赖了什么"的最低保障。连依赖什么都不知道,讨论安全没有意义。
参考资料: - AWS 博客:Agentic AI 基础设施实践经验——Agent 应用的隐私和安全 —— MCP 生态"高风险、高速度、零信任"定义与四大策略 - 安全内参:AI Agent 零信任框架——五大风险、三层架构与八阶段实施流程 —— 供应链风险分类与 AI-BOM - Meta Intelligence:AI Agent 安全与 MCP 防护指南 —— MCP 七大攻击面与 P0-P1 行动清单 - Blake Crosley:AI 代理配置安全就是供应链安全 —— 配置即代码、审查表、信任传递 - OWASP LLM Top 10 / OWASP Agentic AI 威胁建模框架
本文首发于 CSDN 专栏《人工智能Agent从部署到生产》——Agent 安全系列第 7 篇
本文由 admin 原创,转载请注明出处。
评论
0