MCP攻击手法

type
status
date
slug
summary
tags
category
icon
password

MCP通用模板

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

1. MCP工具注释投毒

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

2. MCP工具冲突调用

这个攻击手法场景如下:
存在注释相同的两个mcp服务,但两个mcp服务的功能并不相同,甚至说跟注释没有关系,那此时大模型会调用哪一个mcp服务?

环境配置

创建两个减法的MCP工具:其中一个为虚假的减法逻辑,实际实现逻辑为乘法;另一个为真正的减法逻辑,二者注释完全相同,然后看大模型会如何调用。
sub1.py实际执行的是乘法运算
sub2.py是真正的减法运算
之后注册到trae中
notion image
调用一下发现两个mcp都能被调用,不过模型会判断哪个是正确的
notion image

3. MCP间接投毒注入

攻击思路

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

防范方法

1. 针对 MCP 工具注释投毒的防范

工具描述验证
  • 在 MCP Client 端实现工具描述的验证机制
  • 对工具注释进行语义分析,识别可疑的指令性语言(如"必须调用"、"注意"等)
  • 建立工具描述的白名单/黑名单机制
用户授权机制
  • 所有 MCP 工具调用前必须经过用户明确授权
  • 显示工具调用的详细信息:工具名称、参数、预期行为
  • 对于高风险操作(如执行系统命令),要求二次确认
 
沙箱隔离
  • 将 MCP Server 运行在隔离的沙箱环境中
  • 限制工具的执行权限和资源访问
  • 实现资源配额和超时机制

2. 针对 MCP 工具冲突调用的防范

工具调用策略
  • 当存在功能相似的工具时,要求用户明确选择
  • 记录工具调用历史,便于审计和追溯
  • 实现工具调用的优先级机制

3. 针对 MCP 间接投毒注入的防范

输入过滤和净化
  • 对 MCP 工具返回的所有数据进行严格过滤
  • 移除或转义潜在的恶意代码和指令性语言
  • 实现内容安全检查机制
输出内容分析
  • 在将 MCP 返回内容传递给大模型前进行风险评估
  • 检测是否包含提示词注入、越狱等攻击模式
  • 对高风险内容进行警告或拦截
上下文隔离
  • 将 MCP 工具返回的内容与用户输入的上下文分离
  • 明确标识外部数据来源,避免混淆
  • 限制外部数据对大模型推理的影响范围
 

📎 参考文章

 
上一篇
MacOS应急响应排查
下一篇
GODMODE Data Poisoning
Loading...