
Dokumentiert CVE-2026-52618 mit einem PoC für OS-Befehlsinjektion in @webfer/mcp-ansible-drupal über executeDeployment extraVars, plus Erkennungshinweise und Gegenmaßnahmen.
executeDeployment-Extra-Variablenspawn(cmd[0], cmd.slice(1), { shell: true }) fügt ein Argument-Array wieder zu einem
einzigen /bin/sh -c-String zusammen, ohne zu escapen, sodass ein Shell-Metazeichen in einem
extraVars-Wert, der an das MCP-Tool executeDeployment übergeben wird, auf dem
Host ausgeführt wird, auf dem der Server läuft.
| CVE | CVE-2026-52618 |
| CWE | CWE-78 (Improper Neutralization of Special Elements used in an OS Command) |
| Paket | @webfer/mcp-ansible-drupal (npm) |
| Betroffen | 2.0.0 |
| Behoben in | 2.0.3 (veröffentlicht am 2026-06-01) |
| 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 ist. |
| Gemeldet von | s1ko (github.com/s1ko, [email protected]) |
| CVE zugewiesen | 2026-07-13, MITRE CNA-LR |
Dieses Problem ist behoben. Aktualisieren Sie auf 2.0.3 oder höher.
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 in die Lage versetzt, die Werte zu kontrollieren, 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, auf dem der MCP-Server läuft. Dies ist
dasselbe Modell wie im Präzedenzfall aws-mcp-server / CVE-2026-5058.
Die Konsequenz ist, dass „der Aufrufer ist ein vertrauenswürdiges LLM" keine Abschwächung darstellt. Tool-Argumente sind nicht vertrauenswürdige Eingaben.
src/helpers/runAnsible.ts in 2.0.0 erstellte ein Argument-Array und führte es dann
mit aktivierter Shell aus:
const proc = spawn(ansibleCmd[0], ansibleCmd.slice(1), { shell: true });
Mit shell: true führt Node ansibleCmd[0] nicht mit den übrigen
Elementen als argv aus. Es fügt das gesamte Array zu einem einzigen String zusammen und übergibt ihn an
/bin/sh -c, wobei auf die Elemente keine Quotierung oder Escaping angewendet wird. Jedes Element,
das ;, &&, |, Backticks oder $() enthält, bricht daher aus dem beabsichtigten
Befehl aus.
Der erreichbare Pfad ist das MCP-Tool executeDeployment
(src/tools/executeDeployment.ts), das vom Aufrufer übergebene extraVars
als --extra-vars key=value in das Array weiterleitet. Ein Wert von ; touch /tmp/marker ;
ergibt:
/bin/sh -c "ansible-playbook -i inv.ini play.yml ... --extra-vars deploy_env=; touch /tmp/marker ; echo INJECTED"
Eine sekundäre Senke in derselben Version interpolierte projectRoot in
execSync('ansible-vault encrypt ' + vaultPath).
poc/driver.mjs ruft runAnsible direkt mit einem manipulierten
extraVars-Wert auf und prüft auf die Marker-Datei. ansible-playbook muss nicht
installiert sein — der injizierte Befehl läuft in derselben /bin/sh -c-Zeichenkette,
unabhängig davon, ob die führende Binärdatei aufgelöst wird.
npm pack @webfer/[email protected] && tar xf webfer-mcp-ansible-drupal-2.0.0.tgz
node poc/driver.mjs
Auf einer betroffenen Version wird Folgendes erwartet:
{"target":"@webfer/mcp-ansible-drupal 2.0.0","sink":"runAnsible -> spawn(cmd[0], cmd.slice(1), {shell:true})","vector":"executeDeployment extraVars value","marker":"/tmp/PWNED_ansible","created":true,"verdict":"CONFIRMED - command injection executed"}
Validiert am 2026-06-01 in einem isolierten Container und erneut validiert am 2026-06-13 mit
einem harmlosen touch-Marker. Führe es nur gegen Infrastruktur aus, für deren Test du autorisiert
bist.
--extra-vars-Wert, der ansible-playbook erreicht und ;, &&,
||, |, einen Backtick oder $( enthält. Legitime Ansible-Variablenwerte tun
das praktisch nie.sh -c-Prozess, dessen Kommandozeile ansible-playbook und einen
zweiten Befehl nach einem Trennzeichen enthält — ein Prozessbaum-Signal (auditd, eBPF,
Falco, EDR), das nicht von Anwendungs-Logging abhängt.ansible-playbook, git und
ansible-vault sind zu erwarten; eine Shell, ein Interpreter oder ein Netzwerk-Client
nicht.executeDeployment-Argumente Shell-
Metazeichen enthalten. Logge Tool-Argumente — die meisten MCP-Deployments tun das nicht, und es ist
der einzige Ort, an dem der injizierte Wert in Anwendungsbegriffen sichtbar ist.MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell.
Aktualisiere auf @webfer/mcp-ansible-drupal 2.0.3 oder höher. Der aktuelle Quellcode
ruft spawn(ansibleCmd[0], ansibleCmd.slice(1), { … }) ohne shell-Option auf,
sodass das Array als argv übergeben wird und Metazeichen ihre Bedeutung verlieren.
Die allgemeine Regel für MCP-Tool-Handler und was der Fix hier anwendet:
shell: true, wenn bereits ein Argument-Array verfügbar ist. Die
Array-Form existiert genau, um die Shell zu vermeiden.execFile/spawn mit einem expliziten Argument-Vektor.z.string() beweist, dass der Wert ein
String ist, und nichts darüber, was darin steht. Verwende eine Allowlist, wo die Wertemenge
bekannt ist; lehne Shell-Metazeichen ab, wo sie es nicht ist.NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; CWE-78 Gegenmaßnahmen M1 und M2.
| Datum | Ereignis |
|---|---|
| 2026-06-01 | Schwachstelle dynamisch gegen 2.0.0 validiert |
| 2026-06-01 | 2.0.3 mit entferntem shell: true auf npm veröffentlicht |
| 2026-06-13 | Erneut validiert auf einem zweiten Host |
| 2026-07-13 | MITRE CNA-LR vergibt CVE-2026-52618, s1ko als Entdecker genannt |
| 2026-08-22 | Dieser Write-up veröffentlicht |
aws-mcp-server)Begleitende Advisories aus demselben Research-Durchlauf: CVE-2026-52616, CVE-2026-52617.
MIT — siehe LICENSE.