
Documenta la CVE-2026-52618 con un PoC per l'iniezione di comandi del sistema operativo in @webfer/mcp-ansible-drupal tramite le extraVars di executeDeployment, oltre a indicazioni per il rilevamento e le mitigazioni.
executeDeploymentspawn(cmd[0], cmd.slice(1), { shell: true }) riunisce un array di argomenti in una singola stringa /bin/sh -c senza escaping, quindi un metacarattere di shell in un valore extraVars fornito allo strumento MCP executeDeployment viene eseguito sull'host che esegue il server.
| CVE | CVE-2026-52618 |
| CWE | CWE-78 (neutralizzazione impropria di elementi speciali usati in un comando del sistema operativo) |
| Package | @webfer/mcp-ansible-drupal (npm) |
| Affected | 2.0.0 |
| Fixed in | 2.0.3 (pubblicata il 2026-06-01) |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 7.8 Alto (transporto stdio). AV:N → 9.8 Critico se il server è incapsulato in un transport di rete. |
| Reported by | s1ko (github.com/s1ko, [email protected]) |
| CVE assigned | 2026-07-13, MITRE CNA-LR |
Questo problema è risolto. Aggiorna alla 2.0.3 o successiva.
Gli argomenti degli strumenti MCP sono influenzabili da un attaccante. Sono prodotti da un LLM a partire dal contenuto che l'agente elabora — documenti, pagine web, output di strumenti — quindi un'iniezione indiretta di prompt mette l'attaccante in controllo dei valori che un handler di strumenti riceve. Un handler che convoglia uno qualsiasi di questi valori in una shell trasforma tale influenza in esecuzione di codice sull'host che esegue il server MCP. Questo è lo stesso modello del caso precedente aws-mcp-server / CVE-2026-5058.
La conseguenza è che «il chiamante è un LLM affidabile» non è una mitigazione. Gli argomenti degli strumenti sono input non attendibili.
src/helpers/runAnsible.ts nella 2.0.0 costruiva un array di argomenti e poi lo eseguiva con la shell abilitata:
const proc = spawn(ansibleCmd[0], ansibleCmd.slice(1), { shell: true });
Con shell: true, Node non esegue ansibleCmd[0] con gli elementi rimanenti come argv. Unisce l'intero array in un'unica stringa e la passa a /bin/sh -c, senza applicare quoting o escaping agli elementi. Qualsiasi elemento contenente ;, &&, |, backtick o $() fuoriesce quindi dal comando previsto.
Il percorso raggiungibile è lo strumento MCP executeDeployment (src/tools/executeDeployment.ts), che inoltra gli extraVars forniti dal chiamante nell'array come --extra-vars key=value. Un valore di ; touch /tmp/marker ; produce:
/bin/sh -c "ansible-playbook -i inv.ini play.yml ... --extra-vars deploy_env=; touch /tmp/marker ; echo INJECTED"
Un sink secondario nella stessa versione interpolava projectRoot in execSync('ansible-vault encrypt ' + vaultPath).
poc/driver.mjs chiama runAnsible direttamente con un valore extraVars appositamente costruito e verifica la presenza del file marker. Non è necessario che ansible-playbook sia installato — il comando iniettato viene eseguito nella stessa stringa /bin/sh -c indipendentemente dal fatto che il binario iniziale venga risolto.
npm pack @webfer/[email protected] && tar xf webfer-mcp-ansible-drupal-2.0.0.tgz
node poc/driver.mjs
Risultato atteso su una versione affetta:
{"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"}
Validato il 2026-06-01 in un container isolato e ri-validato il 2026-06-13 con un marker touch benigno. Eseguilo solo contro infrastrutture che sei autorizzato a testare.
--extra-vars che raggiunge ansible-playbook e contiene ;, &&, ||, |, un backtick o $(. I valori legittimi di variabili Ansible non li contengono praticamente mai.sh -c la cui riga di comando contiene ansible-playbook e un secondo comando dopo un separatore — un segnale a livello di albero dei processi (auditd, eBPF, Falco, EDR) che non dipende dai log applicativi.ansible-playbook, git e ansible-vault sono attesi; una shell, un interprete o un client di rete non lo sono.executeDeployment contengono metacaratteri di shell. Registra gli argomenti degli strumenti — la maggior parte delle implementazioni MCP non lo fa, ed è l'unico punto in cui il valore iniettato è visibile in termini applicativi.MITRE ATT&CK T1059.004 Interprete di comandi e scripting: Unix Shell.
Aggiorna a @webfer/mcp-ansible-drupal 2.0.3 o successiva. Il sorgente attuale chiama spawn(ansibleCmd[0], ansibleCmd.slice(1), { … }) senza l'opzione shell, quindi l'array viene passato come argv e i metacaratteri perdono il loro significato.
La regola generale per gli handler degli strumenti MCP, e ciò che la correzione applica qui:
shell: true quando è già disponibile un array di argomenti. La forma a array esiste proprio per evitare la shell.execFile/spawn con un vettore di argomenti esplicito.z.string() di Zod dimostra che il valore è una stringa e nulla su ciò che contiene. Usa un allowlist quando il set di valori è noto; rifiuta i metacaratteri di shell quando non lo è.NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; mitigazioni CWE-78 M1 e M2.
| Data | Evento |
|---|---|
| 2026-06-01 | Vulnerabilità validata dinamicamente contro la 2.0.0 |
| 2026-06-01 | 2.0.3 pubblicata su npm con shell: true rimosso |
| 2026-06-13 | Ri-validata su un secondo host |
| 2026-07-13 | MITRE CNA-LR assegna CVE-2026-52618, s1ko accreditato come scopritore |
| 2026-08-22 | Questo write-up pubblicato |
aws-mcp-server)Bollettini complementari dello stesso ciclo di ricerca: CVE-2026-52616, CVE-2026-52617.
MIT — vedi LICENSE.