短答案
为什么 MCP 会把问题变难
MCP 安全的难点不只在“工具返回了坏输出”。真正的风险更早开始:模型会读取工具名称、描述、清单、提示模板与相关发现元数据,并给这些文本过高权威。
这也是为什么“提示词注入”和“工具投毒”必须放在一起讨论。提示词注入是更广义的问题:不受信文本被当成指令;工具投毒则是 MCP 形态下的体现,即恶意指令被埋进工具元数据或注册时上下文,导致模型选错工具、泄露数据或执行危险动作。
提示词注入与工具投毒在 MCP 中的区别
实用的判断方法是:如果不受信文本出现在 MCP 工作流里并开始影响模型行为,那就是提示词注入;如果这些文本具体埋在工具的描述层、清单层或注册层,那就属于工具投毒。
| 问题 | MCP 中的提示词注入 | 工具投毒 |
|---|---|---|
| 恶意文本藏在哪里 | 工具输出、外部资源、提示模板、文档或任何 MCP 喂给模型的上下文里 | 通常在工具名称、描述、清单、提示或发现阶段元数据中 |
| 什么时候开始起作用 | 只要模型读取并让这些文本影响行为,就已经开始 | 常在发现、注册或工具选择阶段生效,甚至在工具执行前 |
| 被投毒工具必须真正运行吗 | 不一定 | 不需要。近期论文显示,仅元数据就能把模型引向另一个高权限合法工具 |
| 主要攻击目标 | 劫持工作流、泄露数据、触发危险动作 | 误导工具选择,借可信外观推动高权限操作 |
攻击入口通常比“工具执行后”更早
很多团队会误以为风险只从工具执行结果开始。近期 MCP 研究给出的结论更宽:工具元数据、工具输出、外部资源,以及注册表发现与更新机制,都是攻击面。
也就是说,用户甚至不需要直接输入恶意提示。只要接入一个看起来有用的第三方 MCP 服务器,模型就可能从该服务器的周边元数据里继承敌意文本。
- 把第三方服务器、清单、提示与工具描述视为不受信内容,除非已经被审核
- 使用可信注册表、版本固定与分阶段发布,避免服务器静默漂移
- 对本地或第三方 MCP 服务器进行沙箱化,并赋予最小权限
- 对敏感操作展示工具输入、保留用户确认,并验证工具输出
- 在 URL、文件与解析器可见工件进入智能体前先做检查
常见问题
MCP 里的工具投毒是什么意思?
指恶意指令被嵌进工具元数据或注册阶段上下文,使模型以不安全方式选择或使用工具。简言之,工具的“说明层”本身成了攻击面。
工具投毒只是间接提示词注入吗?
可以把它理解为 MCP 语境下的一种间接提示词注入。广义问题是不受信文本变成了指令;工具投毒则是这件事发生在工具元数据里。
一个被投毒的工具即使没运行也会危险吗?
会。MCP-ITP 等研究显示,被投毒的工具可以仅凭元数据就把模型引向另一个高权限合法工具。