
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-extraVarsspawn(cmd[0], cmd.slice(1), { shell: true }) fügt ein Argument-Array ohne Escaping wieder zu einer einzigen /bin/sh -c-Zeichenkette zusammen, 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.
Dieses Problem ist behoben. Aktualisieren Sie auf 2.0.3 oder neuer.
MCP-Tool-Argumente sind vom Angreifer beeinflussbar. Sie werden von einem LLM aus dem Inhalt erzeugt, den der Agent verarbeitet — Dokumente, Webseiten, Tool-Ausgaben —, sodass indirekte Prompt-Injektion 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 Gegenmaßnahme darstellt. Tool-Argumente sind nicht vertrauenswürdige Eingaben.
src/helpers/runAnsible.ts in 2.0.0 baute ein Argument-Array auf 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 verbindet das gesamte Array zu einer einzigen Zeichenkette und übergibt sie an /bin/sh -c, ohne die Elemente zu quoten oder zu escapen. 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 gelieferte extraVars als --extra-vars key=value in das Array einfügt. 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 präparierten extraVars-Wert auf und prüft auf die Markierungsdatei. ansible-playbook muss nicht installiert sein — der injizierte Befehl wird in derselben /bin/sh -c-Zeichenkette ausgeführt, unabhängig davon, ob das führende Binary gefunden wird.
npm pack @webfer/[email protected] && tar xf webfer-mcp-ansible-drupal-2.0.0.tgz
node poc/driver.mjs
Erwartet auf einer betroffenen Version:
{"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ühren Sie dies nur gegen Infrastruktur aus, für deren Test Sie autorisiert sind.
--extra-vars-Wert, der ansible-playbook erreicht und ;, &&, ||, |, ein Backtick oder $( enthält. Legitime Ansible-Variablenwerte tun dies praktisch nie.sh -c-Prozess, dessen Befehlszeile ansible-playbook und einen zweiten Befehl nach einem Trennzeichen enthält — ein Prozessbaum-Signal (auditd, eBPF, Falco, EDR), das nicht von der Anwendungsprotokollierung 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. Protokollieren Sie Tool-Argumente — die meisten MCP-Bereitstellungen tun dies nicht; es ist die einzige Stelle, an der der injizierte Wert aus Anwendungssicht sichtbar ist.MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell.
Aktualisieren Sie auf @webfer/mcp-ansible-drupal 2.0.3 oder neuer. 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 umsetzt:
shell: true, wenn bereits ein Argument-Array vorhanden ist. Die Array-Form existiert genau dazu, die Shell zu vermeiden.execFile/spawn mit einem expliziten Argumentvektor.z.string() beweist, dass der Wert eine Zeichenkette ist, sagt aber nichts darüber aus, was darin steht. Nutzen Sie eine Allowlist, wenn die Wertmenge bekannt ist; lehnen Sie Shell-Metazeichen ab, wenn sie nicht bekannt ist.NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; CWE-78-Gegenmaßnahmen M1 und M2.
| Datum | Ereignis |
|---|
aws-mcp-server)Begleitende Advisories aus derselben Forschungsreihe: CVE-2026-52616, CVE-2026-52617.
MIT — siehe LICENSE.
| 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 = 7.8 High (Stdio-Transport). AV:N → 9.8 Critical, wenn der Server in einen Netzwerktransport eingebettet ist. |
| Gemeldet von | s1ko (github.com/s1ko, [email protected]) |
| CVE zugewiesen | 2026-07-13, MITRE CNA-LR |
| 2026-06-01 | Schwachstelle dynamisch gegen 2.0.0 validiert |
| 2026-06-01 | 2.0.3 auf npm veröffentlicht, mit entferntem shell: true |
| 2026-06-13 | Auf einem zweiten Host erneut validiert |
| 2026-07-13 | MITRE CNA-LR weist CVE-2026-52618 zu; s1ko als Entdecker genannt |
| 2026-08-22 | Veröffentlichung dieses Berichts |