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(操作系统命令中使用的特殊元素的不当中和) |
| 软件包 | @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 = 8.4 高危(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 |
extract_audio | format |
create_video_from_images | codec、pixelFormat、extraOptions |
只有 inputPath 和 outputPath 会被检查,而且 Zod schema 只验证类型(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 发起一次 tools/call,并注入一个 options 值,然后检查标记文件是否存在。该载荷是一个无害的 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 在默认分支上再次确认该 sink 仍然存在。请仅针对你获授权测试的基础设施运行它。
;、&&、||、|、反引号或 $( 的 ffmpeg 命令行。来自此服务器的合法 ffmpeg 调用不会包含这些字符。ffmpeg 开头、并在分隔符后包含第二条命令的 sh -c 进程——这是一种进程树信号(auditd、eBPF、Falco、EDR),不依赖应用程序日志。ffmpeg 和 ffprobe 是预期内的;shell、解释器或网络客户端则不是。Running FFmpeg command: ffmpeg <command> 的形式记录到 stderr,如果日志被收集,这是发现注入值最省事的地方。options、format、codec、pixelFormat 或 extraOptions 包含 shell 元字符。MITRE ATT&CK T1059.004 Command and Scripting Interpreter: 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。
| 日期 | 事件 |
|---|---|
| 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 | 在默认分支上再次确认 sink;npm 最新版本仍为 0.2.1;本文发布 |
aws-mcp-server)同一轮研究中的配套公告: CVE-2026-52616、 CVE-2026-52618。
MIT — 参见 LICENSE。