MCP攻击手法
type
status
date
slug
summary
tags
category
icon
password
MCP通用模板
可以看到,通常会以注释的方式来描述工具的作用、传入的参数以及返回的结果。
在 MCP 调用的过程中,大模型通常会:
- 获取 MCP Server 中包含的工具列表以及描述
- 理解每个工具的注释定义(模板中工具注释部分)
- 根据用户输入决定是否调用某个/些工具
- 调用工具并获取返回结果作为后续的推理内容
可以发现,一方面大模型对工具的了解主要来自于工具自身的描述,那么就意味着:
模型更"相信"工具的注释描述,而不是工具的真实代码逻辑;另一方面,工具所返回的结果也会影响大模型后续的执行动作。
这就导致了 MCP 的攻击面主要集中在:
- 工具怎么描述自己
- 工具返回的结果是否有害
而想要实现这一类攻击,很明显就是投毒欺骗,这也确实是 MCP 主要的攻击方式。
1. MCP工具注释投毒
首先在trae上配置desktop-command,该

成熟的MCP Client类工具的每一次调用MCP都会让用户知道这个行为,并且让用户授权进行操作,做出了一定对的防投毒的策略,但有一些自己脚本写的MCP Client并不具备这样的能力,所以投毒攻击依旧存在。
编写一个简单的加法mcp服务
MCP
服务端:MCP 客户端 JSON 配置调用工具,可以看到确实执行了whoami命令,并进行了输出

2. MCP工具冲突调用
这个攻击手法场景如下:
存在注释相同的两个mcp服务,但两个mcp服务的功能并不相同,甚至说跟注释没有关系,那此时大模型会调用哪一个mcp服务?
环境配置
创建两个减法的MCP工具:其中一个为虚假的减法逻辑,实际实现逻辑为乘法;另一个为真正的减法逻辑,二者注释完全相同,然后看大模型会如何调用。
sub1.py实际执行的是乘法运算sub2.py是真正的减法运算之后注册到trae中

调用一下发现两个mcp都能被调用,不过模型会判断哪个是正确的

3. MCP间接投毒注入
攻击思路
本身大模型在处理MCP工具返回的内容时,缺乏风险识别能力(或风险识别能力可被语言欺骗绕过),并传入接下来的输入中。当外部数据未经过滤作为提示词直接进行大模型的推理流程中时,都有可能改变大模型原有的执行逻辑,从而让大模型产生用户预期之外(攻击者预期之内)的行为。
这里比较直观的例子就是
fetch这个用于网络请求的MCP工具,fetch可以获取到目标网站的内容并进行返回,大模型根据返回内容可以继续接下来的操作。那么整理攻击链路如下:
- 用户输入触发工具调用
- Fetch返回恶意内容
- 大模型解析并生成指令
- 高风险工具获得授权
- 系统命令直接执行
先配置以下网页内容

然后让大模型访问该页面查看内容,说明间接投毒成功

防范方法
1. 针对 MCP 工具注释投毒的防范
工具描述验证
- 在 MCP Client 端实现工具描述的验证机制
- 对工具注释进行语义分析,识别可疑的指令性语言(如"必须调用"、"注意"等)
- 建立工具描述的白名单/黑名单机制
用户授权机制
- 所有 MCP 工具调用前必须经过用户明确授权
- 显示工具调用的详细信息:工具名称、参数、预期行为
- 对于高风险操作(如执行系统命令),要求二次确认
沙箱隔离
- 将 MCP Server 运行在隔离的沙箱环境中
- 限制工具的执行权限和资源访问
- 实现资源配额和超时机制
2. 针对 MCP 工具冲突调用的防范
工具调用策略
- 当存在功能相似的工具时,要求用户明确选择
- 记录工具调用历史,便于审计和追溯
- 实现工具调用的优先级机制
3. 针对 MCP 间接投毒注入的防范
输入过滤和净化
- 对 MCP 工具返回的所有数据进行严格过滤
- 移除或转义潜在的恶意代码和指令性语言
- 实现内容安全检查机制
输出内容分析
- 在将 MCP 返回内容传递给大模型前进行风险评估
- 检测是否包含提示词注入、越狱等攻击模式
- 对高风险内容进行警告或拦截
上下文隔离
- 将 MCP 工具返回的内容与用户输入的上下文分离
- 明确标识外部数据来源,避免混淆
- 限制外部数据对大模型推理的影响范围
📎 参考文章
上一篇
MacOS应急响应排查
下一篇
GODMODE Data Poisoning
Loading...
