
你给 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 传参数数组。所以看到白名单和转义函数,把它当「维护者想过这个问题」的线索,别当「问题已解决」的结论。
今晚就能做完的六步自查
- 盘点。MCP 服务器按客户端安装,不进中央软件清单。翻 Claude Desktop 的 claude_desktop_config.json、Cursor 的 .cursor/mcp.json、Claude Code 的 ~/.claude.json,以及 CI runner 上的同名配置。
- 升级 ai-sdlc。唯一有补丁的项目,补丁是 commit 717d7ec,确认实际 commit,别只看包版本号。
- 其余八个,在「移除」和「沙箱」之间二选一。「等补丁」不是选项,因为没有补丁。
- 代码搜索定位风险口:
grep -rn "shell=True\|create_subprocess_shell\|execSync\|child_process.exec" <服务器目录>。命中不等于有洞,但能找出「参数最终进了 shell」的服务器。 - 沙箱化留下的那些。专用低权限用户 + 容器 + 环境里不放凭证。影响指标全是高危,只因为命令以服务器用户身份运行,这是部署时唯一能改的变量。
- 缩小 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。
文章链接:https://www.muooy.cn/16178.html
更新时间:2026年10月28日
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:305582964@qq.com,我们将第一时间处理!2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。
3.所有资源仅限于参考和学习,版权归原作者所有,更多请阅读用户协议和免责声明。
- 1Claude Opus 5.5 八种玩法:从手写字体到一个人做出 Steam 好评游戏10月22日
- 22GB 老电视被 Claude Code 救活:开源 CleanYourTV 清出九成可用内存10月21日
- 3WordPress官方MCP Adapter插件上线:让AI助手按规矩连接你的网站10月14日
- 4GitHub热门开源ARTEX实测:AI自主渗透测试系统的Docker部署全流程10月10日
- 5WordPress官方MCP Adapter上架插件目录10月9日
- 6AI生成的UI总被扔进回收站?三道坎破法让Demo活到上线10月3日
- 7国庆自驾别把攻略全甩给 AI:河南七天实战的 Agent 用法拆解9月30日
- 8Hostinger Agent开放自定义MCP:一句话管好你的WordPress站点9月28日
- 9不会聊天的Jev送1.2亿token:6个实测案例看懂它适合干什么9月24日
- 10别再烧大模型做分类判断:开源 Laya 一次前向传播 33 毫秒出结果9月24日

