【紧急预警】大模型安全再爆一洞:mcp-remote 严重命令注入漏洞CVE-2025-6514 深度剖析
一、漏洞概述:从 \"代理工具\" 到 \"安全隐患\"
2025 年 7 月 9 日,JFrog 安全研究团队披露了一个编号为CVE-2025-6514的严重远程代码执行(RCE)漏洞,该漏洞存在于热门工具mcp-remote
中,CVSS 评分高达9.6(CRITICAL 级别)。这一漏洞允许攻击者通过构造恶意 MCP 服务器,在受害者连接时执行任意操作系统命令,可能导致完全的系统接管。
1.1 什么是 mcp-remote?
要理解漏洞的影响,首先需要明确mcp-remote
的作用。mcp-remote
是一个代理工具,诞生于Model Context Protocol(MCP 协议) 的发展过程中。MCP 协议是 2024 年 11 月出现的开放标准,用于让 AI 助手(如 Claude、Cursor 等 LLM 客户端)实时连接外部数据源、工具和服务。
早期的 MCP 服务器多为本地部署(与 LLM 客户端同机运行),但随着远程 MCP 服务器的兴起,mcp-remote
逐渐流行 —— 它能让仅支持本地 MCP 连接(如通过 STDIO)的客户端(如 Claude Desktop、Cursor)通过 HTTP 协议连接远程 MCP 服务器,成为本地与远程的 \"桥梁\"。
目前,mcp-remote
已被广泛采用,Cloudflare、Auth0、Hugging Face 等平台的文档中均有提及,是 LLM 生态中连接远程 MCP 服务的关键工具。
1.2 漏洞核心特征
二、受影响范围与风险场景
2.1 受影响的系统与用户
- 直接受影响:使用
mcp-remote 0.0.5 ~ 0.1.15
版本连接远程 MCP 服务器的用户,尤其是依赖 Claude Desktop、Cursor 等 LLM 客户端的开发者和企业。 - 操作系统差异:
- Windows:可实现完全的任意命令执行(包括参数控制);
- macOS/Linux:可执行任意程序,但参数控制受限(进一步研究可能实现完全命令执行)。
2.2 典型攻击场景
场景 1:连接不可信的 MCP 服务器
受害者配置mcp-remote
连接一个被攻击者控制的恶意 MCP 服务器。当mcp-remote
与服务器建立连接并进行授权流程时,恶意服务器返回构造的authorization_endpoint
URL,触发命令注入。
场景 2:局域网中间人攻击
受害者通过 HTTP(非加密)连接可信 MCP 服务器,但局域网内的攻击者通过中间人(MITM)攻击劫持流量,篡改服务器返回的authorization_endpoint
URL,植入恶意命令。
这种场景在企业内网中尤为常见 —— 用户通常对局域网内的服务器缺乏警惕,且可能使用 HTTP 进行 \"信任内\" 通信。
三、漏洞技术细节:从授权流程到命令执行
3.1 漏洞触发的核心链路
mcp-remote
的漏洞源于对authorization_endpoint
URL 的不安全处理。该 URL 用于 OAuth 授权流程中引导用户跳转至登录页面,而mcp-remote
在处理该 URL 时,直接将其传递给系统命令执行函数,导致注入风险。
完整触发链路如下:
用户配置LLM客户端连接远程MCP服务器 → mcp-remote启动并与服务器通信 → 服务器返回恶意authorization_endpoint URL → mcp-remote调用系统工具打开该URL → 恶意URL被解析为系统命令并执行
3.2 关键代码解析
步骤 1:配置与初始化
用户通过 LLM 客户端(如 Claude Desktop)的配置文件指定远程 MCP 服务器地址,示例配置如下:
{ \"mcpServers\": { \"remote-mcp-server-example\": { \"command\": \"npx\", \"args\": [\"mcp-remote\", \"http://remote.server.example.com/mcp\"] } }}
客户端启动时,mcp-remote
作为代理启动,开始与http://remote.server.example.com/mcp
通信。
步骤 2:授权流程中的漏洞点
当服务器返回 \"401 Unauthorized\" 时,mcp-remote
会进入授权流程(调用auth.ts
中的auth
函数),核心逻辑如下:
// 简化的auth函数export async function auth(provider, {serverUrl}) { // 1. 获取服务器OAuth元数据(包含authorization_endpoint) const metadata = await discoverOAuthMetadata(serverUrl); // 2. 构造授权URL const { authorizationUrl } = await startAuthorization(serverUrl, {metadata}); // 3. 打开授权URL(触发点) await provider.redirectToAuthorization(authorizationUrl);}
在startAuthorization
函数中,metadata.authorization_endpoint
被直接用于构造URL
对象:
// 简化的startAuthorization函数async function startAuthorization(serverUrl, {metadata}) { authorizationUrl = new URL(metadata.authorization_endpoint); // 使用恶意URL构造对象 authorizationUrl.searchParams.set(\"response_type\", \"code\"); // 添加查询参数 return { authorizationUrl };}
最终,redirectToAuthorization
调用open
npm 包打开该 URL:
// node-oauth-client-provider.tsasync redirectToAuthorization(authorizationUrl: URL) { await open(authorizationUrl.toString()); // 直接执行系统命令打开URL}
步骤 3:open
包的危险行为
open
包是一个用于打开 URL / 文件的工具,但其在 Windows 上的实现存在风险:
- 调用 PowerShell 执行命令:
powershell -EncodedCommand
; - 当传入的 URL 以
file:
开头时,PowerShell 会将其解析为本地文件路径并执行对应的程序。
3.3 恶意 Payload 构造
攻击者只需让 MCP 服务器返回如下authorization_endpoint
即可触发漏洞:
{ \"authorization_endpoint\": \"file:/c:/windows/system32/calc.exe\", \"registration_endpoint\": \"https://remote.server.example.com/register\"}
当mcp-remote
处理该 URL 时,open
包会执行:
Start \"file:/c:/windows/system32/calc.exe?response_type=code...\"
这等价于直接运行calc.exe
,在受害者机器上打开计算器(实际攻击中可替换为恶意程序)。
3.4 从 \"执行程序\" 到 \"完全命令注入\"
上述 Payload 只能执行程序,无法传递参数。攻击者通过PowerShell 子表达式可实现更灵活的命令注入:
- 使用
$(...)
在 URL 中嵌入命令,例如:a:$(cmd.exe /c \"echo hacked > c:\\temp\\pwned.txt\")?response_type=code
- 由于非标准协议(如
a:
)不会被 URL 编码,$(...)
会被 PowerShell 解析并执行,实现带参数的命令注入。
四、漏洞修复与防御建议
4.1 官方修复方案
mcp-remote
在0.1.16 版本中修复了该漏洞(参考官方修复提交)。修复核心是对authorization_endpoint
URL 进行严格校验,仅允许http:
/https:
协议,拒绝file:
等危险协议。
4.2 紧急防御措施
-
立即升级版本
将mcp-remote
升级至 0.1.16 及以上:npx mcp-remote@latest
-
限制连接范围
仅允许mcp-remote
连接可信的 MCP 服务器,禁止连接未知或第三方服务器。 -
强制加密通信
要求所有 MCP 服务器连接使用 HTTPS(而非 HTTP),避免中间人攻击篡改流量。 -
临时监控
检查系统日志中是否存在异常命令执行记录(如calc.exe
、cmd.exe
的异常启动),尤其是mcp-remote
运行时段。
五、总结与扩展思考
CVE-2025-6514 揭示了 MCP 生态快速发展中潜藏的安全风险 —— 当工具为了便利性简化安全校验时,可能引入致命漏洞。对于开发者和用户:
- 开发者:在处理外部输入(尤其是 URL、命令参数)时,必须进行严格的协议校验和字符过滤,避免直接传递给系统命令函数。
- 用户:对 \"代理工具\" 保持警惕,及时关注官方更新,避免连接不可信的第三方服务。
随着 LLM 客户端(如 Cursor、Windsurf)逐渐支持直接连接远程 MCP 服务器,mcp-remote
的使用可能减少,但类似的 \"兼容性工具\" 仍可能存在类似风险。安全防护的核心始终是:最小权限原则 + 严格输入校验 + 及时更新。