
MCP ffmpegヘルパーにおけるOSコマンドインジェクションに関するアドバイザリと概念実証(PoC)。根本原因の分析、検出の指針、および未修正のnpmパッケージに対する緩和策を備えています。
runFFmpegCommand は、MCPツールのパラメータから構築した文字列を spawn(…, { shell: true }) に渡すため、options、format、codec、pixelFormat、extraOptions に含まれるシェルのメタ文字が、サーバーを実行しているホスト上で実行されます。
⚠ 修正版は存在しません
2026-08-22現在、最新のnpmリリースは 0.2.1 であり、これが影響を受ける バージョンです。また、シンクはリポジトリのデフォルトブランチに依然として 存在します。アップグレード先はありません。それまでの間のユーザー向けの 対応策については 回避策 を参照してください。
MCPツールの引数は攻撃者の影響を受けます。これらはLLMが、エージェントが処理するコンテンツ(ドキュメント、Webページ、ツールの出力)から生成されるため、間接的なプロンプトインジェクションにより、攻撃者はツールハンドラーが受け取る値を制御できます。これらの値のいずれかをシェルに渡すハンドラーは、その影響力を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 |
チェックされているのは 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、、 にシェルのメタ文字が含まれるMCPツール呼び出しログ。MITRE ATT&CK T1059.004 コマンドおよびスクリプトインタプリタ: Unixシェル。
修正済みリリースが存在しないため、選択肢は封じ込めと削除です:
runFFmpegCommand に到達する前に、上記の5つのパラメータ内のシェルのメタ文字を拒否するよう、サーバーをラップまたはフォークしてください。上流での修正は、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 を参照してください。
| 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 |
optionsextract_audio | format |
create_video_from_images | codec、pixelFormat、extraOptions |
pixelFormatextraOptions| 日付 | イベント |
|---|
| 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。本稿を公開 |