runFFmpegCommand 将由 MCP 工具参数构建的字符串传递给 spawn(…, { shell: true }),因此 options、format、codec、pixelFormat 或 extraOptions 中的 shell 元字符会在运行服务器的宿主机上执行。
⚠ 不存在已修复版本
截至 2026-08-22,最新的 npm 发布版本为 0.2.1,该版本即受影响版本, 且漏洞点仍存在于仓库的默认分支中。 当前没有可升级到的版本。在此期间用户可采取的措施请参阅缓解措施。
| CVE | CVE-2026-52617 |
| CWE | CWE-78(OS 命令中使用的特殊元素中和不当) |
| 软件包 | @sworddut/mcp-ffmpeg-helper(npm) |
| 受影响版本 | 0.2.1 及更早版本 — 所有已发布版本 |
| 修复版本 | 无 |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 7.8 高危(stdio 传输)。若服务器封装在网络传输中,则 AV:N → 9.8 严重。 |
| 报告者 | s1ko(github.com/s1ko,[email protected]) |
| CVE 分配 | 2026-07-13,MITRE CNA-LR |
MCP 工具参数会受到攻击者影响。它们由 LLM 根据代理处理的内容(文档、网页、工具输出)生成,因此间接提示注入使攻击者能够控制工具处理程序接收到的值。任何将这些值中的某一个传入 shell 的处理程序,都会将这种影响转化为在运行 MCP 服务器的宿主机上的代码执行。这与先例 aws-mcp-server / CVE-2026-5058 的模型相同。
媒体转换服务器尤其容易成为此类攻击的目标:它被要求处理的文件恰恰是代理从其他地方获取的不可信内容。
src/utils/ffmpeg.ts — 命令以字符串形式拼接,并显式启用 shell:
function runProcess(command: string, args: string[], useShell = false) {
const child = spawn(command, args, { shell: useShell, windowsHide: true });
…
}
export async function runFFmpegCommand(command: string): Promise<string> {
const { stdout, stderr, code } = await runProcess(`ffmpeg ${command}`, [], true);
…
}
spawn("ffmpeg " + command, [], { shell: true }) 会将整个字符串通过 /bin/sh -c 执行。调用者为 command 贡献的所有内容都会被当作 shell 语法。
src/tools/handlers.ts 通过三个工具调用该辅助函数,并插入从未经过内容验证的参数:
| 工具 | 可注入参数 |
|---|---|
convert_video | options |
只有 inputPath 和 outputPath 会接受检查,而 Zod 模式只验证类型(z.string()),从不验证内容——因此元字符可以畅通无阻地通过。
当 convert_video 调用的 options 被设置为 ; touch /tmp/marker ; 时,会产生:
/bin/sh -c "ffmpeg -i /tmp/in.mp4 ; touch /tmp/marker ; /tmp/out.mp4"
poc/driver.mjs 通过 stdio 与 MCP 通信:它初始化服务器,针对 convert_video 发起一次带有注入 options 值的 tools/call 调用,并检查标记文件是否存在。载荷是一个无害的 touch。
npm pack @sworddut/[email protected]
tar xf sworddut-mcp-ffmpeg-helper-0.2.1.tgz && cd package && npm install
node ../poc/driver.mjs
在受影响版本上预期会看到:
==== POC RESULT (@sworddut/mcp-ffmpeg-helper) ====
marker /tmp/PWNED_ffmpeg created: true
verdict: CONFIRMED — command injection executed
ffmpeg 无需安装——无论前导二进制能否解析,注入的命令都会在同一个 /bin/sh -c 字符串中执行。已于 2026-06-01 在隔离容器中验证,2026-06-13 重新验证,并于 2026-08-22 再次确认默认分支上仍存在该漏洞点。请仅对你有权测试的基础设施运行它。
;、&&、||、|、反引号或 $( 的 ffmpeg 命令行。此服务器的合法 ffmpeg 调用不会包含这些字符。ffmpeg 开头且分隔符后包含第二个命令的 sh -c 进程——这是一个进程树信号(auditd、eBPF、Falco、EDR),不依赖应用程序日志。ffmpeg 和 ffprobe 是预期中的;shell、解释器或网络客户端则不是。Running FFmpeg command: ffmpeg <command> 的形式记录到 stderr;只要日志有被收集,这就是发现注入值成本最低的地方。options、format、codec、pixelFormat 或 包含 shell 元字符。MITRE ATT&CK T1059.004 命令和脚本解释器:Unix Shell。
目前不存在已修复的发布版本,因此可选方案是隔离和移除:
runFFmpegCommand 之前拒绝其中的 shell 元字符。上游修复方案是去掉 shell: true,以参数向量形式向 ffmpeg 传参——spawn("ffmpeg", ["-i", inputPath, …])——根据白名单中的 format、codec 和 pixelFormat 值构建该数组,而不是根据自由格式的字符串。根本要求是内容验证,而不仅仅是 Zod 类型验证。
NIST SP 800-53r5 SI-10;OWASP ASVS v4 §5.3.8;CWE-78 缓解措施 M1 和 M2。
aws-mcp-server)同一轮研究发布的配套公告: CVE-2026-52616、 CVE-2026-52618。
MIT — 参见 LICENSE。
extract_audio | format |
create_video_from_images | codec、pixelFormat、extraOptions |
extraOptions| 日期 | 事件 |
|---|
| 2026-05-29 | 通过审查已发布 tarball 的源代码识别出该漏洞 |
| 2026-06-01 | 在隔离容器中通过 MCP stdio 进行了动态验证 |
| 2026-06-13 | 在第二台主机上重新验证;该仓库未启用 Private Vulnerability Reporting,且 package.json 中的 repository/bugs/homepage 字段仍保留着 github.com/yourusername 模板,没有记录任何安全联系方式 |
| 2026-07-13 | MITRE CNA-LR 分配 CVE-2026-52617,s1ko 被认定为发现者 |
| 2026-08-22 | 再次确认默认分支上仍存在该漏洞点;npm 最新版本仍为 0.2.1;本文发布 |