
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 tramite interpolazione di stringhe dei parametri
target e additionalFlags e lo esegue tramite
child_process.exec, ovvero /bin/sh -c.
⚠ Leggere prima — identificatore duplicato
Questa vulnerabilità era già pubblica prima che esistesse questo CVE ID. È coperta da CVE-2026-3484 / GHSA-xc68-rrqc-qgq3, assegnato da VulDB e pubblicato il 2026-03-03 contro
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 2026-07-13 in risposta a una segnalazione indipendente. Tale assegnazione sembra essere un duplicato, e è 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 per la divulgazione pubblica originale non è di s1ko.
| CVE | CVE-2026-52616 — duplicato di CVE-2026-3484 |
| CWE | CWE-78 (Improper Neutralization of Special Elements used in an OS Command) |
| Pacchetto | mcp-nmap-server (npm) |
| Affetto | 1.0.1 e precedenti — tutte le versioni pubblicate |
| Corretto in | nessuna — repository archiviato |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 8.4 High (trasporto stdio). AV:N → 9.8 Critical se il server è incapsulato in un trasporto di rete. |
| Segnalato indipendentemente 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 influenzati dall'attaccante. Sono prodotti da un LLM a partire
dal contenuto che l'agente elabora — documenti, pagine web, output di strumenti — quindi
l'iniezione indiretta di prompt mette un attaccante in controllo dei valori che un gestore di strumenti
riceve. Un gestore che inserisce 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 proprio argomento in /bin/sh -c, quindi tutto ciò che il chiamante ha contribuito è sintassi della shell. Lo schema di input Zod dichiara z.string(), che convalida il tipo e non dice nulla sul contenuto, quindi i metacaratteri passano. additionalFlags raggiunge la stessa stringa attraverso lo stesso percorso.
Una chiamata 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 comunica tramite MCP su stdio: inizializza il
server, invia una singola tools/call per run_nmap_scan con un target iniettato,
e verifica la presenza di un file marcatore. Il payload è un touch benigno.
npm pack [email protected]
tar xf mcp-nmap-server-1.0.1.tgz && cd package && npm install
node ../poc/driver.mjs
Atteso su una versione interessata:
==== 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 2026-06-01 in un container isolato e rivalidato il 2026-06-13.
Eseguilo solo contro infrastrutture che sei autorizzato 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 a livello di albero dei processi (auditd, eBPF, Falco, EDR)
che non dipende dal logging dell'applicazione.nmap è previsto; una shell,
un interprete o un client di rete non lo sono.target o additionalFlags contengono
metacaratteri della shell. Un target dovrebbe corrispondere a un IP, CIDR o hostname e a 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 dalla vulnerabilità, e non verrà pubblicata alcuna release corretta. La rimozione è la mitigazione:
target rispetto a un pattern
IP/CIDR/hostname e per inserire additionalFlags in una allowlist 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 dei tipi con Zod, è il
requisito di fondo.
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 pubblicato da VulDB — la divulgazione pubblica originale, da parte di un altro segnalatore |
| 2026-05-29 | Identificato in modo indipendente tramite revisione del codice sorgente del tarball pubblicato, all'insaputa dell'advisory di marzo |
| 2026-06-01 | Validato dinamicamente tramite MCP stdio in un container isolato |
| 2026-06-13 | Duplicato identificato durante la deduplicazione pre-invio; repository confermato archiviato con Private Vulnerability Reporting non disponibile. Verdetto interno: non presentare |
| 2026-07-13 | MITRE CNA-LR assegna comunque CVE-2026-52616, accreditando s1ko come scopritore |
| 2026-08-22 | Pubblicato questo write-up, che documenta il duplicato |
aws-mcp-server)Advisory complementari dalla stessa sessione di ricerca: CVE-2026-52617, CVE-2026-52618.
MIT — vedi LICENSE.