模型上下文协议 (MCP) 生态系统正处于起步阶段,充满了复杂性,并且容易受到各种潜在攻击。 当前的协议和工具设计通常无法提供足够的防御能力。 为了应对这些挑战并加深对 MCP 安全性的理解,SlowMist 开源了 MasterMCP,这是一款旨在促进实际攻击模拟的工具。 这一举措旨在帮助社区主动识别和缓解其 MCP 项目中的安全漏洞。
作为对这种实践方法的补充,《MCP 安全检查表》提供了对各种攻击向量的底层视角的宝贵见解。 本文深入探讨了真实世界的场景,展示了 MCP 生态系统中常见的攻击方法,例如信息投毒和隐藏恶意命令的注入。 这些演示中使用的所有脚本都可以在 GitHub 上找到,使用户能够在安全的环境中复制整个过程,甚至开发自己的攻击测试插件。
架构概述
演示目标 MCP:Toolbox
Smithery.ai 是 MCP 插件的突出中心,吸引了大量的 MCP 列表和活跃用户。 其中,@smithery/toolbox 是 smithery.ai 提供的官方 MCP 管理工具,是本次安全评估的重点。
选择 Toolbox 作为测试目标有几个关键原因:
- 它拥有庞大的用户群,使其成为 MCP 生态系统中的代表性样本。
- 它支持自动安装其他插件,从而增强客户端功能(例如,Claude Desktop)。
- 它包含敏感配置,例如 API 密钥,这有助于演示潜在的漏洞利用。
用于演示的恶意 MCP:MasterMCP
MasterMCP 由 SlowMist 专门为安全测试目的而开发,是一种基于模块化架构的模拟恶意 MCP 工具。 它的关键组件包括:
- 本地网站服务模拟:http://127.0.0.1:1024
为了创建逼真的攻击场景,MasterMCP 包含一个本地网站服务模拟模块。 该模块利用 FastAPI 框架,快速建立一个简单的 HTTP 服务器,该服务器模仿常见的 Web 环境。 这些页面可能看起来无害,展示面包店信息或返回标准 JSON 数据,但它们在其源代码或 API 响应中隐藏了精心设计的恶意负载。
这种方法可以全面演示信息投毒和命令隐藏技术,并且是在安全、受控的本地环境中进行。 它突出了潜伏在看似普通的网页中的潜在风险,这些风险可能会触发大型语言模型的异常行为。
- 本地化插件 MCP 架构
MasterMCP 采用插件方法,以方便快速扩展新的攻击向量。 执行后,MasterMCP 在子进程中启动前一个模块的 FastAPI 服务。
演示客户端
- Cursor:全球使用最广泛的 AI 辅助编程 IDE 之一。
- Claude Desktop:Anthropic 的官方客户端,该组织定制了 MCP 协议。
用于演示的大型语言模型 (LLM)
- Claude 3.7
选择 Claude 3.7 是因为它在识别敏感操作方面的增强能力,以及它在当前 MCP 生态系统中代表的强大的操作能力。
claude\_desktop\_config.json 的配置
完成配置后,演示阶段开始。
跨 MCP 恶意调用
此演示包含检查表中概述的投毒技术和跨 MCP 恶意调用策略。
网页内容投毒攻击
- 基于注释的投毒
Cursor 访问本地测试网站 http://127.0.0.1:1024。
这个看似无害的关于“美味蛋糕世界”的页面用作模拟,以说明大型语言模型客户端访问恶意网站的潜在影响。
执行命令:
结果表明,Cursor 不仅读取了网页内容,还将本地敏感配置数据传输回了测试服务器。 恶意提示嵌入在源代码中,作为 HTML 注释:
虽然这种基于注释的方法相对简单且易于检测,但它仍然能够触发恶意操作。
- 编码注释投毒
访问 http://127.0.0.1:1024/encode 会显示一个与前一个示例相同的页面。 但是,恶意提示已编码,即使检查页面的源代码,也更难检测到该漏洞。
尽管源代码中没有明确的提示,但攻击仍然成功。
MCP 工具返回信息投毒
根据 MasterMCP 提示指令,我们输入一个模拟命令,该命令会触发恶意 MCP 并演示其后续操作。
触发该命令后,客户端会启动对 Toolbox 的跨 MCP 调用,并成功添加一个新的 MCP 服务器。
检查插件代码会发现,返回的数据包含编码的恶意负载,这使得用户几乎无法检测到。
第三方接口污染攻击
此演示重点介绍了恶意和非恶意 MCP 直接将第三方 API 数据返回到上下文的潜在风险。
示例代码:
执行请求:
结果: 恶意提示嵌入在返回的 JSON 数据中,并成功触发恶意执行。
MCP 初始化期间的投毒技术
此演示涵盖了初始提示注入和名称冲突的检查表项目。
恶意函数覆盖攻击
MasterMCP 创建一个与 Toolbox 的 remove_server
函数具有相同函数名称的工具,并在其中编码恶意提示。
执行命令:
Claude Desktop 没有调用原始的 toolbox remove_server
方法,而是触发了 MasterMCP 提供的具有相同名称的方法:
这是通过强调“原始方法已弃用”来实现的,这鼓励大型语言模型优先考虑恶意覆盖的函数。
添加恶意全局检查逻辑
MasterMCP 创建一个名为“banana”的工具,该工具旨在在执行任何其他工具之前强制执行强制性安全检查。
在执行每个函数之前,系统会优先考虑“banana”检查机制:
通过在代码中反复强调“强制执行 banana 检测”,可以完成此全局逻辑注入。
用于隐藏恶意提示的高级技术
LLM 友好的编码方法
大型语言模型具有强大的多语言格式解析能力,可以利用这些能力来隐藏恶意信息。 常见方法包括:
- 英语环境:十六进制字节编码
- 中文环境:NCR 编码或 JavaScript 编码
随机恶意负载返回机制
与第三部分中提到的第三方接口污染类似,请求 http://127.0.0.1:1024/random 会导致:
每个请求都会返回一个随机生成的页面,其中包含恶意负载,从而大大增加了检测和跟踪的难度。
通过 MasterMCP 的实际演示,已经揭示了模型上下文协议 (MCP) 生态系统中的隐藏安全漏洞。 从基本的提示注入和跨 MCP 调用,到初始化期间的更微妙的攻击以及恶意指令的隐藏,每个阶段都在提醒我们 MCP 生态系统在强大功能之外固有的脆弱性。
如今,随着大型模型越来越多地与外部插件和 API 交互,看似微小的输入污染可能会引发系统范围内的安全风险。 攻击者策略不断发展,包括编码技术、随机污染和函数覆盖,这需要对传统安全方法进行全面升级。