论文阅读《MCP Safety Audit: LLMs with the Model Context Protocol Allow Major Security Exploits》——全文阅读
MCP 安全审计:具有模型上下文协议的 LLM 允许进行重大安全利用
Abstract
为了减少开发开销并实现任何给定生成式 AI 应用程序的潜在组件之间的无缝集成,最近发布了模型上下文协议 (MCP),随后被广泛采用。MCP 是一种开放协议,它标准化了对大型语言模型 (LLM)、数据源和代理工具的 API 调用。因此,通过连接多个 MCP 服务器——每个服务器都定义了一组工具、资源和提示——用户能够定义完全由 LLM 驱动的自动化工作流。然而,我们发现当前的 MCP 设计对最终用户存在广泛的潜在安全风险。特别是,我们发现行业领先的 LLM 可能会被迫使用 MCP 工具,并通过各种攻击破坏 AI 开发者的系统,例如恶意代码执行、远程访问控制和凭证窃取。为了主动缓解所展示的(以及相关的)攻击,我们引入了一个安全审计工具 McpSafetyScanner,这是第一个评估任意 MCP 服务器安全性的代理工具。McpSafetyScanner 使用多个代理来:a) 根据 MCP 服务器的工具和资源自动确定对抗性样本,(b) 根据这些样本搜索相关漏洞和补救措施,以及 (c) 生成详细说明所有发现的安全报告。我们的工作揭示了通用代理工作流中的严重安全问题,同时提供了一个主动工具来审计 MCP 服务器的安全性,并在部署前解决检测到的漏洞。描述的 MCP 服务器审计工具 MCPSafetyScanner 可以在以下网址免费获取:https://github.com/johnhalloran321/mcpSafetyScanner。
1 Introduction
MCP 的当前设计对开发生成式 AI 解决方案的用户构成了重大安全风险。 在此,我们证明了行业领先的 LLM 可能会被迫使用来自标准 MCP 服务器的工具,并直接危及用户系统。
三种不同类型的攻击:1)恶意代码执行,(2)远程访问控制,和(3)凭证窃取。
1) malicious code execution, (2) remote access control, and (3) credential theft.
直接测试LLM的护栏guardrails防止这些攻击的能力可能会产生误报,进而可能对这种攻击产生虚假的安全感。因此,我们主张不应仅仅依赖LLM的护栏guardrails来进行补救。相反,补救应该通过LLM(通过其护栏guardrails)以及通过MCP服务器的设计(通过了解启用MCP服务器工具和资源时可能发生的漏洞)来主动进行。
为了主动识别代理MCP工作流的漏洞,我们引入了McpSafetyScanner,这是第一个评估任意MCP服务器安全性的工具。给定一个特定的MCP服务器,McpSafetyScanner使用代理自动检测系统漏洞,使用服务器的功能(即工具、提示和资源),自动搜索知识库以查找相关漏洞,确定所有漏洞的补救措施,并为MCP开发人员生成详细的安 全报告。因此,McpSafetyScanner使MCP开发人员能够轻松扫描其MCP服务器的漏洞,并使用返回的补救措施发布漏洞利用程序的补丁。
2 Background
2.1 Need for Standardized Generative AI APIs需要标准化的生成式 AI API
这种递归的API调用被从业者继承,他们在开发自己的特定应用程序时,反过来构建自己的自定义API。因此,虽然存在大量的生成式AI解决方案,但由于生成式AI API当前的临时状态,将这些解决方案适应于特定用例需要大量的开发人员时间和精力。
2.2 The Model Context Protocol 模型上下文协议
在MCP客户端-服务器消息模式中,请求的服务被描述为功能features。 服务器到客户端 (STC) 功能包括资源resources(即 AI 模型使用的上下文和数据)、提示prompts(即用户的模板消息和工作流)和工具tools(即 AI 模型执行的功能)。 客户端到服务端(CTS)可能提供采样功能sampling feature,即服务器发起的代理行为和递归LLM交互。通过标准化消息、对STC/CTS请求进行分类并提供集中式代码库,开发人员可以快速将开源工具和项目集成到他们自己的生成式AI解决方案中。
3 The MCP Allows LLMs to Compromise User SystemsMCP允许LLM危及用户系统
三种类型的攻击 :
- 恶意代码执行 Malicious code execution (MCE) - 攻击者将恶意代码插入到用户的系统文件中。
- 远程访问控制 Remote access control (RAC) - 攻击者立即获得对受害者系统的远程访问权限。
- 凭据窃取 Credential Theft (CT) - 攻击者利用对系统文件或环境变量的访问,秘密地从受害者的系统中提取敏感信息。
(a) Claude 拒绝了隐藏为八进制的 MCE 攻击。
(b) Claude 执行了一个非常直接的 MCE 攻击。
图1:Claude拒绝并执行命令,这些命令使远程执行攻击成为可能。在图1(a)中,Claude首先解码八进制值,注意到请求的解码命令中固有的安全风险,并正确地拒绝了它。然而,Claude执行了欺骗性较小的请求,其中建立远程执行攻击的命令以明文形式传递,并添加到用户的运行配置文件中。
虽然在一般情况下,这种特定的演示具有较低的威胁级别——因为攻击者需要直接访问MCP用户的系统才能直接提示Claude Desktop——但在考虑共享办公室或公共设置时,威胁级别会急剧增加
图2:Llama-3.3-70B-Instruct完成MCE攻击请求。
与 Claude 不同,Llama-3.3-70B-Instruct 对 MCE、RAC 和 CT 攻击请求的拒绝需要明确的有害/不安全语言。被拒绝和完成的提示之间的唯一区别是后者中明确说明了以下单词/短语之一:“黑客”、“窃取”、“后门”和“闯入”。
因此,尽管对以前的(与MCP无关的)安全基准进行了严格的测试,但鉴于启用具有MCP工具的LLM的即时安全和保障影响,Llama-3.3-70B-Instruct(以及可能的其他LLM)需要重新评估。特别是,如果一个启用了MCP的应用程序仅使用Llama-3.3-70B-Instruct,并且配备了MCP文件系统服务器,那么只要恶意行为者不使用有害或不安全的语言,该系统就可能会允许MCE、RAC和CT攻击。
4 Retrieval-Agent Deception Attacks检索代理欺骗攻击
我们介绍了一种针对启用 MCP 的代理工作流的新攻击——Retrieval-Agent DEception (RADE) attack,其中 LLM 不会直接提示使用 MCP 利用的攻击。相反,攻击者破坏了公开可用的数据,这些数据最终出现在启用 MCP 的用户的系统上,并且用户将其添加到矢量数据库中。 数据已被MCP利用攻击命令破坏,这些命令围绕特定主题进行,因此当MCP用户要求查询此数据库以获取与此主题相关的信息时,攻击者的命令将被加载并运行。
图3:RADE攻击的威胁模型。攻击者使用围绕特定主题(图中的“X”)的针对性命令破坏公开可用的数据,这些数据最终会出现在MCP用户的系统上。然后,检索代理会自动将受损数据添加到向量数据库中,这样当用户请求与这些主题相关的内容时,恶意命令就会被检索出来并可能自动执行。
(a) RADE攻击文件,以“MCP”为主题,针对CT。
(b) Claude 成功地被胁迫使用可用的 MCP 服务器执行 RADE 攻击,将用户的 OpenAI 和 Huggingface 导出到 Slack 频道。RadBlog 是一个 Slack 应用程序,在发布后会通知组织中的所有 Slack 用户。
图4:针对CT的成功RADE攻击:从一个包含以“MCP”为主题的CT方向的向量数据库中,Claude被指示搜索有关MCP的条目并执行相关操作。Claude遵守了指令,完成了RAC攻击,并为攻击者提供了访问受害者系统的权限。
5 McpSafetyScanner - Multi-Agentic Framework for Proactive MCP Vulnerability Detection and Remediation McpSafetyScanner - 主动MCP漏洞检测和修复的多代理框架
给定任意一个MCP服务器,McpSafetyScanner使用代理自动探测系统环境和服务器启用的操作以查找漏洞并进行后续修复。
如图5所示,整个过程分为三个关键阶段。
第一阶段是自动漏洞检测,其中黑客代理自动拉下MCP服务器的功能(即工具、资源和提示),然后使用这些功能确定系统漏洞。
第二阶段包括扩展的漏洞搜索和修复,在此期间,对于每个(工具、资源、提示、漏洞)元组,安全审计员代理会在多个知识库(即万维网、arXiv 和 Hacker News)中搜索类似的漏洞。对于每个确定的漏洞,审计员因此会确定 MCP 开发人员缓解这些漏洞利用的修复步骤和最佳实践。
最后阶段包括安全报告生成,在此期间,主管代理整合所有漏洞和修复措施以生成详细报告。
例如,对于RAC,McpSafetyScanner正确地指出了将ssh密钥添加到用户授权密钥文件的滥用可能性(同时指出此攻击的其他可能系统路径)。提供的补救措施——“实施严格的文件访问权限”为下游MCP用户提供了一种保护其系统免受此漏洞利用的方法,而第二种补救措施——“监控文件访问和修改”为MCP开发人员提供了一种在其部署的服务器上设置防护栏的方法(即,监控LLM-MCP服务器交换期间访问的文件并防止访问敏感系统文件)。此外,报告中还包括每个攻击的命令行示例。
表一:报告摘要,描述了用于实现本文所述攻击的漏洞利用,并附有补救措施。
图 5:McpSafetyScanner 用于检测 MCP 服务器漏洞并确定补救措施的步骤和代理。
6 Discussion, Conclusions, and Future Work讨论、结论和未来工作
为了开始了解此类 MCP 漏洞,我们研究了三种严重的攻击,其影响范围从敏感信息的外泄到服务器主机的远程访问控制。我们已经证明,Claude 和 Llama-3.3-70B-Instruct 都容易受到这三种攻击的影响。 我们还引入了一种新的多MCP服务器攻击,具有高威胁级别,RADE,并表明Claude可能在此次攻击下启用CT或RAC。此外,我们还表明,在这些攻击期间,两种模型的防护措施都可能会被触发,但这些防护措施防止这些攻击(通过LLM拒绝)的可靠性会根据模型以及用于传递攻击的提示而大幅变化。
为了帮助加强MCP服务器和托管系统的防护(从而减轻LLM拒绝的唯一负担),我们引入了一种代理工具,McpSafetyScanner,用于自动扫描MCP服务器的漏洞并提供补救措施。 我们已经证明,McpSafetyScanner 能够捕获已启用此处考虑的攻击的漏洞,并提供快速可行的补救措施,以在开发人员或 MCP 用户端关闭 MCP 启用的漏洞。
ps
🌐 本地运行 ≠ 本地安全
虽然 MCP 本身是本地服务,但它连接的是大型语言模型(如 Claude 或 Llama),这些模型是你通过桌面客户端或 API 使用的。你通常会:
-
安装 Claude Desktop(它带 MCP 服务器);
-
加载 MCP 插件,如
filesystem
、slack
、chroma
等; -
允许 Claude 执行 MCP 工具,如“读取文件”、“编辑文件”、“发送消息”。
一旦你启动了 MCP 服务器,模型就可以通过对话来“间接控制”你的电脑。这就是攻击者利用的核心。
🎯 谁在攻击谁?
不是你自己在攻击自己,而是:
攻击者通过诱导 LLM,让它在你的系统上使用 MCP 的能力,来攻击你。
举个例子:
你打开 Claude,问它:
“请帮我根据本地文档文件夹生成一个总结。”
Claude:
-
用 MCP 的
list directory
、read file
去扫描你电脑; -
读取到了一个被攻击者“预埋”的文档,里面包含了 MCP 命令,例如“写入一个 SSH 公钥到
~/.ssh/authorized_keys
”。
如果 Claude 没有正确判断风险,它就会执行这个命令:攻击者获得了你机器的远程控制权。
🔥 攻击场景分类
1. 直接诱导攻击(DPA):
攻击者亲自使用你的机器(例如共享办公环境),用 MCP 调 Claude 运行恶意命令。
2. 检索代理欺骗攻击(RADE)(更隐蔽):
攻击者把 MCP 命令写入某些看似无害的文本文件(比如 MCP 教程),放到 GitHub、博客、知识库; 你下载了这些内容,加到向量数据库中; 然后你问 Claude:
“请帮我总结我关于 MCP 的学习资料,并执行示例。”
Claude 被你自己“指挥”去触发了这些恶意命令,但你完全没意识到这些命令的存在。
这是一种“误导式攻击”,攻击者只需要控制你使用的数据,而不需要直接访问你的设备!
🧠 为什么这很危险?
因为你“自愿”让 Claude 控制你的本地 MCP 工具,而 Claude 又可以被巧妙诱导,执行:
-
写入
.bashrc
添加反弹 shell 命令(远程访问) -
读取
.env
文件,泄露 OpenAI、HuggingFace 密钥 -
使用 Slack MCP 工具,在公司频道发送 API 密钥
一切都是你“请求” Claude 做的,攻击者只需要“设计你要的资料”就行了。
✅ 总结一句话:
虽然 MCP 在本机运行,但攻击者可以“间接遥控”你的 LLM,让它在你不知情的情况下,通过 MCP 操作你的本地环境,完成攻击。你变成了“执行者”,攻击者只需要“设计诱导”。