
MCP ffmpegヘルパーにおけるOSコマンドインジェクションに関するアドバイザリと概念実証(PoC)。根本原因の分析、検出の指針、および未修正のnpmパッケージに対する緩和策を備えています。
runFFmpegCommand は MCP ツールのパラメータから構築された文字列を
spawn(…, { shell: true }) に渡すため、options、format、
codec、pixelFormat、extraOptions に含まれるシェルメタ文字が、サーバーを実行しているホスト上で実行されます。
⚠ 修正版は存在しません
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 = 8.4 High (stdio トランスポート)。サーバーがネットワークトランスポートでラップされている場合は AV:N → 9.8 Critical。 |
| 報告者 | s1ko (github.com/s1ko, [email protected]) |
| CVE 割り当て | 2026-07-13, MITRE CNA-LR |
MCP ツールの引数は攻撃者の影響を受けます。これらはエージェントが処理する
コンテンツ — ドキュメント、Web ページ、ツールの出力 — から LLM によって生成されるため、
間接的なプロンプトインジェクションによって攻撃者がツールハンドラが受け取る値を
制御できるようになります。これらの値のいずれかをシェルに渡すハンドラは、
その影響を MCP サーバーを実行しているホスト上でのコード実行に変えてしまいます。これは
前例である aws-mcp-server / CVE-2026-5058 と同じモデルです。
メディア変換サーバーは、この攻撃にとって特に自然な標的です。処理を求められる ファイルは、まさにエージェントが他の場所から取得する信頼できないコンテンツだからです。
src/utils/ffmpeg.ts — コマンドは文字列として組み立てられ、シェルが
明示的に有効化されています:
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 に寄与したものはすべてシェル構文です。
src/tools/handlers.ts は3つのツールからこのヘルパーに到達し、内容が一切検証されない
パラメータを補間します:
| ツール | 注入可能なパラメータ |
|---|---|
convert_video | options |
extract_audio | format |
create_video_from_images | codec、pixelFormat、extraOptions |
チェックされるのは inputPath と outputPath のみであり、Zod スキーマは型(z.string())を
検証するだけで内容は決して検証しません — そのためメタ文字はそのまま通過します。
options を ; touch /tmp/marker ; に設定した convert_video 呼び出しは次を生成します:
/bin/sh -c "ffmpeg -i /tmp/in.mp4 ; touch /tmp/marker ; /tmp/out.mp4"
poc/driver.mjs は stdio 経由で MCP を話します。サーバーを初期化し、注入された options 値を用いて convert_video に対する tools/call を1回発行し、マーカーファイルの有無を確認します。ペイロードは無害な 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 で始まり、区切り文字の後に2番目のコマンドを含む sh -c プロセス — アプリケーションのログに依存しないプロセスツリーのシグナル(auditd、eBPF、Falco、EDR)。ffmpeg と ffprobe は想定内ですが、シェル、インタープリタ、ネットワーククライアントは想定外です。Running FFmpeg command: ffmpeg <command> として記録します。ログが収集されている場合、注入された値を発見する最も簡単な場所です。options、format、codec、pixelFormat、または extraOptions にシェルメタ文字が含まれる MCP ツール呼び出しログ。MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell。
パッチ済みリリースは存在しないため、選択肢は封じ込めと削除です:
runFFmpegCommand に到達する前にシェルメタ文字を拒否するよう、サーバーをラップまたはフォークしてください。上流の修正は、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 | 2台目のホストで再検証。リポジトリには 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。本記事を公開 |
aws-mcp-server)同じ調査パスからの関連アドバイザリ: CVE-2026-52616、 CVE-2026-52618。
MIT — LICENSE を参照してください。