
Advisory und Proof-of-Concept für eine OS-Kommando-Injection in einem MCP-ffmpeg-Helfer, mit Ursachenanalyse, Detektionshinweisen und Gegenmaßnahmen für ein nicht gepatchtes npm-Paket.
runFFmpegCommand übergibt einen String, der aus MCP-Tool-Parametern zusammengesetzt wird, an
spawn(…, { shell: true }), sodass Shell-Metazeichen in options, format,
codec, pixelFormat oder extraOptions auf dem Host ausgeführt werden, der den Server betreibt.
⚠ Es existiert keine korrigierte Version
Stand 2026-08-22 ist die neueste npm-Version 0.2.1, welche die betroffene Version ist, und die Senke ist weiterhin im Standard-Branch des Repositorys vorhanden. Es gibt nichts, worauf man aktualisieren könnte. Siehe Mitigation für das, was Nutzer in der Zwischenzeit tun können.
| CVE | CVE-2026-52617 |
| CWE | CWE-78 (Improper Neutralization of Special Elements used in an OS Command) |
| Paket | @sworddut/mcp-ffmpeg-helper (npm) |
| Betroffen | 0.2.1 und früher — alle veröffentlichten Versionen |
| Behoben in | keine |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 8.4 High (stdio-Transport). AV:N → 9.8 Critical, wenn der Server in einen Netzwerk-Transport eingebettet wird. |
| Gemeldet von | s1ko (github.com/s1ko, [email protected]) |
| CVE zugewiesen | 2026-07-13, MITRE CNA-LR |
MCP-Tool-Argumente werden von Angreifern beeinflusst. Sie werden von einem LLM aus
dem Inhalt erzeugt, den der Agent verarbeitet — Dokumente, Webseiten, Tool-Ausgaben —, sodass
indirekte Prompt-Injection einen Angreifer die Kontrolle über die Werte erlangen lässt, die ein Tool-
Handler empfängt. Ein Handler, der einen dieser Werte in eine Shell einspeist, verwandelt
diesen Einfluss in Codeausführung auf dem Host, der den MCP-Server betreibt. Dies ist
dasselbe Modell wie im Präzedenzfall aws-mcp-server / CVE-2026-5058.
Ein Medienkonvertierungsserver ist ein besonders naheliegendes Ziel dafür: Die Dateien, deren Verarbeitung von ihm verlangt wird, sind genau der nicht vertrauenswürdige Inhalt, den ein Agent von anderswo aufnimmt.
src/utils/ffmpeg.ts — der Befehl wird als String zusammengesetzt und die Shell wird
explizit aktiviert:
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 }) führt die gesamte Zeichenkette durch
/bin/sh -c aus. Alles, was der Aufrufer zu command beigetragen hat, ist Shell-Syntax.
src/tools/handlers.ts erreicht diesen Helper von drei Tools aus und interpoliert
Parameter, die niemals auf ihren Inhalt geprüft werden:
| Tool | Injizierbare Parameter |
|---|---|
convert_video | options |
extract_audio | format |
create_video_from_images | codec, pixelFormat, extraOptions |
Nur inputPath und outputPath werden überhaupt geprüft, und die Zod-Schemas
validieren den Typ (z.string()), niemals den Inhalt — so gelangen Metazeichen
unmittelbar durch.
Ein convert_video-Aufruf mit options auf ; touch /tmp/marker ; gesetzt erzeugt:
/bin/sh -c "ffmpeg -i /tmp/in.mp4 ; touch /tmp/marker ; /tmp/out.mp4"
poc/driver.mjs spricht MCP über stdio: Es initialisiert den
Server, sendet einen tools/call für convert_video mit einem injizierten options-Wert
und prüft auf eine Marker-Datei. Die Payload ist ein harmloses touch.
npm pack @sworddut/[email protected]
tar xf sworddut-mcp-ffmpeg-helper-0.2.1.tgz && cd package && npm install
node ../poc/driver.mjs
Auf einer betroffenen Version wird Folgendes erwartet:
==== POC RESULT (@sworddut/mcp-ffmpeg-helper) ====
marker /tmp/PWNED_ffmpeg created: true
verdict: CONFIRMED — command injection executed
ffmpeg muss nicht installiert sein — der injizierte Befehl läuft unabhängig davon, ob die führende Binärdatei aufgelöst wird, in derselben /bin/sh -c-Zeichenkette. Validiert am 2026-06-01 in einem isolierten Container, erneut validiert am 2026-06-13, und die Senke wurde am 2026-08-22 erneut als im Standard-Branch vorhanden bestätigt. Führe dies nur gegen Infrastruktur aus, für deren Test du autorisiert bist.
ffmpeg-Kommandozeile, die ;, &&, ||, |, einen Backtick oder $( enthält. Legitime ffmpeg-Aufrufe von diesem Server tun das nicht.sh -c-Prozess, dessen Kommandozeile mit ffmpeg beginnt und nach einem Trennzeichen einen zweiten Befehl enthält — ein Prozessbaum-Signal (auditd, eBPF, Falco, EDR), das nicht von Anwendungs-Logging abhängt.ffmpeg und ffprobe sind zu erwarten; eine Shell, ein Interpreter oder ein Netzwerk-Client nicht.Running FFmpeg command: ffmpeg <command>, was der günstigste Ort ist, um einen injizierten Wert zu entdecken, sofern die Logs überhaupt gesammelt werden.options, format, codec, pixelFormat oder extraOptions Shell-Metazeichen enthalten.MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell.
Es existiert keine gepatchte Version, daher sind die Optionen Eindämmung und Entfernung:
runFFmpegCommand erreichen.Der Upstream-Fix besteht darin, shell: true zu entfernen und ffmpeg einen Argumentvektor zu übergeben — spawn("ffmpeg", ["-i", inputPath, …]) —, wobei dieses Array aus allowlisteten format-, codec- und pixelFormat-Werten statt aus Freitext-Zeichenketten aufgebaut wird. Inhaltsvalidierung, nicht nur Zod-Typvalidierung, ist die zugrunde liegende Anforderung.
NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; CWE-78 Gegenmaßnahmen M1 und M2.
| Datum | Ereignis |
|---|---|
| 2026-05-29 | Schwachstelle durch Quellcode-Review des veröffentlichten Tarballs identifiziert |
| 2026-06-01 | Dynamisch über MCP stdio in einem isolierten Container validiert |
| 2026-06-13 | Auf einem zweiten Host erneut validiert; das Repository hat kein Private Vulnerability Reporting aktiviert, und die Felder repository/bugs/homepage in package.json sind auf der Vorlage github.com/yourusername belassen, sodass kein dokumentierter Sicherheitskontakt existiert |
| 2026-07-13 | MITRE CNA-LR weist CVE-2026-52617 zu, s1ko als Entdecker genannt |
| 2026-08-22 | Senke im Standard-Branch erneut bestätigt; npm latest weiterhin 0.2.1; dieser Write-up veröffentlicht |
aws-mcp-server)Begleitende Advisories aus demselben Recherchedurchgang: CVE-2026-52616, CVE-2026-52618.