
Advisory e PoC benigno per l'iniezione di comandi OS in un server MCP nmap, con monitoraggio dei CVE duplicati, indicazioni per il rilevamento e mitigazione.
run_nmap_scanLo strumento MCP run_nmap_scan costruisce il proprio comando interpolando come stringa i parametri target e additionalFlags e lo esegue tramite child_process.exec, cioè /bin/sh -c.
⚠ Leggi prima — identificatore duplicato
Questa vulnerabilità era già pubblica prima che questo ID CVE esistesse. È coperta da CVE-2026-3484 / GHSA-xc68-rrqc-qgq3, assegnato da VulDB e pubblicato il 03-03-2026 per
mcp-nmap-server <= 1.0.1— stesso pacchetto, stesso sink CWE-78child_process.exec.
CVE-2026-52616 è stato assegnato a s1ko da MITRE CNA-LR il 13-07-2026 in risposta a una segnalazione indipendente. Tale assegnazione risulta essere un duplicato ed è stata segnalata come tale. L'identificatore preesistente CVE-2026-3484 è quello che dovrebbe essere citato.
Questo repository è pubblicato per completezza e per documentare il duplicato, non come rivendicazione di una scoperta originale. Il merito della divulgazione pubblica originaria non è di s1ko.
| CVE | CVE-2026-52616 — duplicato di CVE-2026-3484 |
| CWE | CWE-78 (Neutralizzazione impropria di elementi speciali usati in un comando del sistema operativo) |
| Pacchetto | mcp-nmap-server (npm) |
| Versioni affette | 1.0.1 e precedenti — tutte le versioni pubblicate |
| Risolto in | nessuna — repository archiviato |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 7.8 Alto (trasporto stdio). AV:N → 9.8 Critico se il server è incapsulato in un trasporto di rete. |
| Segnalato in modo indipendente da | s1ko (github.com/s1ko, [email protected]) |
| CVE assegnato | 2026-07-13, MITRE CNA-LR |
Una trappola di denominazione degna di nota per chiunque deduplichi questo caso: il pacchetto npm è mcp-nmap-server e il repository è nmap-mcp-server. I due ordinamenti si riferiscono allo stesso progetto.
Gli argomenti degli strumenti MCP sono influenzabili dall'attaccante. Sono prodotti da un LLM a partire dal contenuto che l'agente elabora — documenti, pagine web, output degli strumenti — quindi l'iniezione indiretta di prompt mette un attaccante in controllo dei valori ricevuti da un gestore di strumenti. Un gestore 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.
dist/index.js — il target viene aggiunto a una stringa di comando che viene poi passata a exec:
command += ` ${target}`;
…
const { stdout, stderr } = await promisify(exec)(command);
child_process.exec esegue il suo argomento in /bin/sh -c, quindi tutto ciò che il chiamante ha contribuito è sintassi di shell. Lo schema di input Zod dichiara z.string(), che valida il tipo e non dice nulla sul contenuto, quindi i metacaratteri passano. additionalFlags raggiunge la stessa stringa attraverso lo stesso percorso.
Una chiamata a run_nmap_scan con target impostato a 127.0.0.1; touch /tmp/marker; echo INJECTED produce:
/bin/sh -c "nmap … 127.0.0.1; touch /tmp/marker; echo INJECTED"
poc/driver.mjs parla MCP su stdio: inizializza il server, emette una tools/call per run_nmap_scan con un target iniettato e verifica la presenza di un file marker. Il payload è una touch benigna.
npm pack [email protected]
tar xf mcp-nmap-server-1.0.1.tgz && cd package && npm install
node ../poc/driver.mjs
Previsto su una versione affetta:
==== POC RESULT (mcp-nmap-server) ====
marker /tmp/PWNED_nmap created: true
verdict: CONFIRMED — command injection executed
nmap non deve essere installato — il comando iniettato viene eseguito nella stessa stringa /bin/sh -c indipendentemente dal fatto che il binario iniziale venga risolto. Validato il 01-06-2026 in un contenitore isolato e ri-validato il 13-06-2026. Eseguirlo solo contro infrastrutture che si è autorizzati a testare.
nmap contenente ;, &&, ||, |, un backtick o $(.sh -c la cui riga di comando inizia con nmap e contiene un secondo comando dopo un separatore — un segnale dall'albero dei processi (auditd, eBPF, Falco, EDR) che non dipende dai log dell'applicazione.nmap è atteso; una shell, un interprete o un client di rete non lo sono.target o additionalFlags contengono metacaratteri di shell. Un target dovrebbe corrispondere a un IP, CIDR o hostname e nient'altro.MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell.
Il repository è archiviato e in sola lettura, l'ultima versione su npm è la 1.0.1 affetta, e non verrà pubblicata alcuna release corretta. La rimozione è la mitigazione:
target rispetto a un pattern IP/CIDR/hostname e per mettere in allowlist additionalFlags prima che uno dei due raggiunga la stringa di comando.La correzione, per chiunque ne faccia un fork, è chiamare execFile("nmap", [...args]) con un vettore di argomenti invece di costruire una stringa per exec. La validazione del contenuto, non solo la validazione del tipo Zod, è il requisito di base.
NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; mitigazioni CWE-78 M1 e M2.
| Data | Evento |
|---|---|
| 2026-03-03 | CVE-2026-3484 / GHSA-xc68-rrqc-qgq3 pubblicati da VulDB — la divulgazione pubblica originale, da un altro segnalatore |
| 2026-05-29 | Identificato in modo indipendente tramite revisione del tarball pubblicato, senza essere a conoscenza dell'avviso di marzo |
| 2026-06-01 | Validato dinamicamente tramite MCP su stdio in un contenitore isolato |
| 2026-06-13 | Duplicato identificato durante la deduplicazione pre-invio; repository confermato archiviato con segnalazione di vulnerabilità privata non disponibile. Verdetto interno: non presentare |
| 2026-07-13 | MITRE CNA-LR assegna CVE-2026-52616 nonostante ciò, accreditando s1ko come scopritore |
| 2026-08-22 | Pubblicato questo write-up, che documenta il duplicato |
aws-mcp-server)Avvisi complementari della stessa sessione di ricerca: CVE-2026-52617, CVE-2026-52618.
MIT — vedi LICENSE.