Synth Daily

从MCP到Shell:MCP认证漏洞引发Claude Code、Gemini CLI等远程命令执行

一项安全研究发现,模型上下文协议(MCP)的认证流程中存在一个严重漏洞。由于 Claude CodeGemini CLI 等常用AI编码工具未能充分验证来自服务器的授权URL,攻击者可以通过设置恶意服务器,实现跨站脚本(XSS)攻击,并最终升级为远程代码执行(RCE),从而完全控制用户的计算机。尽管 Cloudflare、Anthropic 和 Google 等公司已发布补丁,但 Anthropic 对其 MCP TypeScript SDK 的上游修复对整个生态系统产生了最广泛的安全改进,凸显了纵深防御和上游修复的重要性。

什么是模型上下文协议 (MCP)?

MCP 是一种允许 AI 模型与外部工具、API 和数据源连接的协议。它通过共享上下文和执行操作来扩展大型语言模型(LLM)应用的基础能力,例如让 Gemini 访问 Google Drive。

为了规范客户端与服务器之间的认证,MCP 引入了 OAuth 框架,这是一种类似“使用 Google 登录”的标准。然而,许多客户端在实现这一标准时忽略了一个关键的安全环节,为攻击创造了条件。

核心问题很简单:MCP 服务器控制着客户端将用户重定向到何处进行身份验证,而大多数客户端完全信任这个 URL。

攻击实例:从浏览器脚本到远程控制

攻击者利用客户端对认证 URL 的信任,通过多种方式实现了从简单的浏览器脚本执行到完全的远程代码执行。

Cloudflare 的 use-mcp 库:跨站脚本 (XSS)

  • Cloudflare 的 use-mcp 库直接使用服务器提供的 authUrlString 来打开一个新浏览器窗口。
  • 攻击者可以构造一个以 javascript: 开头的恶意 URL。
  • 当客户端的 window.open() 函数执行这个 URL 时,它会在用户的浏览器中运行任意 JavaScript 代码,这可能导致会话劫持和账户接管

Anthropic 的 MCP Inspector:从 XSS 升级到 RCE

MCP Inspector 也存在同样的 XSS 漏洞。但由于它是一个在本地运行的桌面应用,攻击者可以进一步利用其 stdio 传输功能将漏洞升级。

  • stdio 传输 是一个本地代理服务,用于在浏览器界面和本地进程之间传递消息。
  • 攻击者通过 XSS 漏洞,可以窃取到与本地代理通信所需的认证令牌
  • 获得令牌后,攻击者可以命令代理执行任何本地命令(例如打开计算器 calc.exe),从而将浏览器内的脚本攻击升级为对整个系统的远程代码执行

Claude Code 与 Gemini CLI:命令注入

这两款流行的命令行工具也存在漏洞,但利用方式略有不同。

  • Claude Code 在 Windows 系统上使用 cmd.exe /c start <authUrl> 命令来打开认证链接。攻击者可以在 URL 后面附加 &calc.exe 这样的命令,利用 & 符号实现命令注入
  • 后续版本改为使用 PowerShell,但攻击者仍可通过 PowerShell 的字符串插值功能构造恶意 URL 来执行代码。
  • Gemini CLI 使用了一个名为 open 的流行 npm 包,该包的文档明确警告用户需要自行清理不受信任的输入。由于 Gemini CLI 未做处理,它同样容易受到与 Claude Code 完全相同的 PowerShell 命令注入攻击

open 包的文档警告: “本软件包不作任何安全保证。如果您传入不受信任的输入,您有责任对其进行适当的清理。”

防御成功的案例

并非所有实现都容易受到攻击,这证明了传统网络安全措施的有效性。

  • ChatGPT 开发者模式:尽管其代码逻辑与易受攻击的库相似,但 ChatGPT 部署了强大的内容安全策略 (CSP)。该策略阻止了 javascript: URL 的执行,从而有效防止了 XSS 攻击。
  • Claude Web 应用:Claude 的网页版通过服务器端重定向来处理认证 URL。浏览器不会执行来自服务器端重定向的 javascript: 链接,因此该攻击路径被阻断。

行业响应与修复方案

受影响的供应商迅速采取了行动,但修复方法各不相同:

  • Cloudflare:发布了一个 strict-url-sanitise 包,通过验证 URL 协议来阻止 javascript: 等恶意链接。
  • Google (Gemini CLI):放弃了有漏洞的 open 包,并自行实现了 URL 打开逻辑,但其修复方式(仅转义单引号)不够稳健。
  • Anthropic (Claude Code):最终完全放弃了使用 shell 来打开 URL,从根本上消除了命令注入的风险。
  • 影响最广的修复:Anthropic 更新了其 MCP TypeScript SDK,将 javascript: 等危险的 URI 协议列入黑名单。由于 MCP Inspector 等多个工具都依赖此 SDK,这一上游修复立即提升了整个生态系统的安全性。

结论:传统安全措施依然有效

这次事件表明,即使在 AI 这个新兴领域,许多漏洞也源于对现有网络技术的误用。

  • 纵深防御依然关键:ChatGPT 的内容安全策略(CSP)就是一个很好的例子,即使底层代码存在逻辑缺陷,额外的安全层也能有效阻止攻击。
  • 上游修复影响深远:像 Anthropic 对其 SDK 的更新那样,修复核心依赖库可以一次性保护下游所有使用它的应用,从而使整个生态系统更加安全。