当前位置:首页教程中心软件教程9个MCP服务器同天爆命令注入,8个连补丁都没有

9个MCP服务器同天爆命令注入,8个连补丁都没有

10月27日两分钟内连发9个CVE,8个是MCP服务器的命令注入,只有1个有补丁。附六步自查清单:怎么盘点、怎么搜代码、怎么沙箱。
MCP服务器命令注入风险场景插画

你给 AI 装的每一个 MCP 服务器,本质上都是「一只会执行命令的手」。这只手不检查自己握着什么——10 月 27 日,九个 CVE 同时把这句话变成了字面意思。

两分钟,九个 CVE

2026 年 10 月 27 日 13:07 到 13:08(UTC),VulnCheck 以 CNA 身份连续发布 9 条 CVE 记录,覆盖 9 个互不相关的 MCP(Model Context Protocol)工具服务器。其中 8 条是操作系统命令注入(CWE-78),1 条是白名单过宽;7 条评分完全一致:CVSS 3.1 为 7.8,CVSS 4.0 为 8.5。九个项目由不同维护者写成、解决不同问题,却犯了同一个错:Agent 可调用的工具参数被直接拼进 shell 命令,$() 和反引号没有做任何中和。

名单如下(括号内是受影响范围):

  • ai-sdlc(≤0.31.2):CVE-2026-117558,repo 参数经 execSync 进入 gh 命令,唯一有补丁的项目
  • DroidMind(≤0.4.0):CVE-2026-117559,shell 白名单可被 $(...) 绕过,到达 Device.run_shell()
  • ATXP Gemini CLI 扩展(≤1.0.0):CVE-2026-117560,未清洗的 message_id、subject 进入 runAtxp()
  • sf-mcp(≤1.3.2):CVE-2026-117561,自带 escapeValue() 仍被反引号绕过
  • esp-mcp(commit 28afddf 之前):CVE-2026-117567,target、project_path 进入 create_subprocess_shell
  • mcp-ffmpeg(≤1.0.5):CVE-2026-117568,videoPath、outputDir 进入 child_process.exec
  • Kali-GPT(commit a608c74 之前):CVE-2026-117569,target、url 进入 subprocess.run(shell=True)
  • nmap-mcp(commit 3636afa 之前):CVE-2026-117570,NSE 脚本类别绕过白名单
  • hagent(commit 761eec6 之前):CVE-2026-117573,args 进入 arduino-cli 与 idf.py

八个项目在记录里写的都是「修复版本:无」。四个项目甚至没有版本化发布,CVE 只能用 commit hash 划边界——也就是说,你连「升级到哪个版本」这个动作都无处可做。

攻击者根本不在你的机器上

注入载荷怎么进来的?三种典型路径:邮件或短信正文里写一段 $(),Agent 读完后把内容当参数传下去;恶意仓库名被当成 repo 参数;mcp-ffmpeg 最省事,连提示注入都不需要,只要它处理的目录里有恶意文件名就能触发。

这就是 MCP 的危险之处:工具的输入来自提示词、邮件、文件名、仓库名这些完全不受控的文本。MCP 服务器是 Agent 的手,而这只手不检查自己握着什么。

为什么「低危」评分会害了你

八条注入记录的 CVSS 向量都是 AV:L/PR:L——本地、低权限。很多团队的漏洞分诊规则里,看到「本地」就直接降级、排到下周。但在 MCP 场景里,那个本地已认证的调用者就是 Agent 本身,攻击者是写邮件、起仓库名的人,他从头到尾没碰过这台机器。

原文有句话很到位:CVSS 4.0 里没有「拥有特权的本地调用者是一个按不可信文本行事的自动程序」这个指标。任何丢弃 AV:L、或把 PR:L 当作「只有内部人员才有风险」的分诊规则,都会把这一整类漏洞漏掉。

白名单救不了:五次尝试,五次失败

九个项目里有五个做过防御,全部被绕过。DroidMind 的 shell 命令白名单被 $(...) 和反引号穿过去,能执行本来被拦的 reboot;nmap-mcp 的 NSE 脚本类别白名单(本意是挡住 exploit、dos、brute、intrusive)可被调用方绕开;sf-mcp 的 escapeValue() 没处理反引号和 $()。

原因不复杂:shell 元字符比黑名单想的多,解析规则依赖上下文,正则追不上。过滤一个马上要交给 shell 的字符串,是一场赢不了的赛跑。正确做法只有一条——别拼命令字符串,给非 shell 的 exec 传参数数组。所以看到白名单和转义函数,把它当「维护者想过这个问题」的线索,别当「问题已解决」的结论。

今晚就能做完的六步自查

  1. 盘点。MCP 服务器按客户端安装,不进中央软件清单。翻 Claude Desktop 的 claude_desktop_config.json、Cursor 的 .cursor/mcp.json、Claude Code 的 ~/.claude.json,以及 CI runner 上的同名配置。
  2. 升级 ai-sdlc。唯一有补丁的项目,补丁是 commit 717d7ec,确认实际 commit,别只看包版本号。
  3. 其余八个,在「移除」和「沙箱」之间二选一。「等补丁」不是选项,因为没有补丁。
  4. 代码搜索定位风险口:grep -rn "shell=True\|create_subprocess_shell\|execSync\|child_process.exec" <服务器目录>。命中不等于有洞,但能找出「参数最终进了 shell」的服务器。
  5. 沙箱化留下的那些。专用低权限用户 + 容器 + 环境里不放凭证。影响指标全是高危,只因为命令以服务器用户身份运行,这是部署时唯一能改的变量。
  6. 缩小 Agent 的可达范围。MCP 服务器继承运行用户的网络位置和凭证,把它能碰到的源码、SSH 私钥、云密钥先挪走。

沙箱落地时至少加这几项(以官方镜像为例):docker run --rm -u 1000:1000 --read-only --network none -v /data:/data:ro <镜像名>。不需要写盘的工具加 --read-only,不需要联网的加 --network none,能挡掉很大一部分后利用动作。

监控上盯三件事

  • MCP 服务器进程下出现非预期子进程:shell、curl、wget、nc、解释器
  • 工具参数里出现 $(、反引号、;、| 这类元字符
  • 从 MCP 服务器可达的凭证被读取:源码、SSH 私钥、云 AK、API token

我的看法

这批 CVE 不是丑闻,是测量结果。它测出的不是九个维护者格外粗心,而是这个生态的默认写法:给命令行程序套一层薄薄的工具封装,参数直接进字符串,写得快、跑得通,安全留给以后。以前这类缺陷散落在各种小工具里没人统计,现在 MCP 把它们集中到一个能被 Agent 自动调用的位置,风险就从「本地脚本」升级成「读了封邮件就能触发」。

所以别把它当补丁任务,当清单任务。补丁你有八个装不上,但清单今晚就能列出来,而且列清单这个动作,比任何一次升级都更能降低你的实际暴露面。

最后

处理顺序:先盘点配置,再升级唯一的补丁,再把剩下的沙箱化或删掉,最后补监控。官方记录去 cve.org 和 nvd.nist.gov 按 CVE-2026-117558 到 CVE-2026-117573 逐个查,别只看二手摘要——受影响范围的界定方式,八个项目里有四个写的是 commit hash。

温馨提示:

文章标题:9个MCP服务器同天爆命令注入,8个连补丁都没有

文章链接:https://www.muooy.cn/16178.html

更新时间:2026年10月28日

1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:305582964@qq.com,我们将第一时间处理!

2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。

3.所有资源仅限于参考和学习,版权归原作者所有,更多请阅读用户协议和免责声明。

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧