
Avis et PoC bénin pour l'injection de commandes OS dans un serveur MCP nmap, avec suivi des CVE en double, conseils de détection et mesures d'atténuation.
run_nmap_scanL'outil MCP run_nmap_scan construit sa commande par interpolation de chaîne des
paramètres target et additionalFlags et l'exécute via
child_process.exec, c'est-à-dire /bin/sh -c.
⚠ À lire en premier — identifiant en doublon
Cette vulnérabilité était déjà publique avant l'existence de cet identifiant CVE. Elle est couverte par CVE-2026-3484 / GHSA-xc68-rrqc-qgq3, attribuée par VulDB et publiée le 2026-03-03 contre
mcp-nmap-server <= 1.0.1— même paquet, même sink CWE-78child_process.exec.CVE-2026-52616 a été attribué à s1ko par le CNA-LR de MITRE le 2026-07-13 en réponse à un rapport indépendant. Cette attribution semble être un doublon, et elle a été signalée comme telle. L'identifiant préexistant CVE-2026-3484 est celui qui devrait être cité.
Ce dépôt est publié par souci d'exhaustivité et pour documenter le doublon, non comme une revendication de découverte inédite. Le crédit de la divulgation publique originale ne revient pas à s1ko.
| CVE | CVE-2026-52616 — doublon de CVE-2026-3484 |
| CWE | CWE-78 (Neutralisation incorrecte des éléments spéciaux utilisés dans une commande OS) |
| Paquet | mcp-nmap-server (npm) |
| Affecté | 1.0.1 et antérieures — toutes les versions publiées |
| Corrigé dans | aucune — dépôt archivé |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 8.4 Élevé (transport stdio). AV:N → 9.8 Critique si le serveur est encapsulé dans un transport réseau. |
| Signalé indépendamment par | s1ko (github.com/s1ko, [email protected]) |
| CVE attribué | 2026-07-13, CNA-LR de MITRE |
Un piège de nommage à noter pour quiconque déduplique ceci : le paquet npm est
mcp-nmap-server et le dépôt est nmap-mcp-server. Les deux ordres
désignent le même projet.
Les arguments des outils MCP sont influencés par l'attaquant. Ils sont produits par un LLM à partir
du contenu que l'agent traite — documents, pages web, sortie d'outils — de sorte que
l'injection de prompt indirecte place un attaquant aux commandes des valeurs que reçoit un gestionnaire
d'outil. Un gestionnaire qui injecte l'une de ces valeurs dans un shell transforme
cette influence en exécution de code sur l'hôte exécutant le serveur MCP. C'est
le même modèle que le cas précédent aws-mcp-server / CVE-2026-5058.
dist/index.js — la cible est ajoutée à une chaîne de commande qui est ensuite
transmise à exec :
command += ` ${target}`;
…
const { stdout, stderr } = await promisify(exec)(command);
child_process.exec exécute son argument dans /bin/sh -c, donc tout ce que l'appelant a fourni est de la syntaxe shell. Le schéma d'entrée Zod déclare z.string(), ce qui valide le type et ne dit rien sur le contenu, donc les métacaractères passent. additionalFlags atteint la même chaîne par la même voie.
Un appel run_nmap_scan avec target défini sur
127.0.0.1; touch /tmp/marker; echo INJECTED produit :
/bin/sh -c "nmap … 127.0.0.1; touch /tmp/marker; echo INJECTED"
poc/driver.mjs communique avec MCP via stdio : il initialise le
serveur, émet un tools/call pour run_nmap_scan avec un target injecté,
et vérifie la présence d'un fichier marqueur. La charge utile est un touch bénin.
npm pack [email protected]
tar xf mcp-nmap-server-1.0.1.tgz && cd package && npm install
node ../poc/driver.mjs
Attendu sur une version affectée :
==== POC RESULT (mcp-nmap-server) ====
marker /tmp/PWNED_nmap created: true
verdict: CONFIRMED — command injection executed
nmap n'a pas besoin d'être installé — la commande injectée s'exécute dans la même chaîne /bin/sh -c, que le binaire de tête soit résolu ou non.
Validé le 2026-06-01 dans un conteneur isolé et revalidé le 2026-06-13.
Ne l'exécutez que contre une infrastructure que vous êtes autorisé à tester.
nmap contenant ;, &&, ||, |, un backtick ou $(.sh -c dont la ligne de commande commence par nmap et contient une seconde commande après un séparateur — un signal d'arborescence de processus (auditd, eBPF, Falco, EDR) qui ne dépend pas de la journalisation applicative.nmap est attendu ; un shell, un interpréteur ou un client réseau ne l'est pas.target ou additionalFlags contiennent des métacaractères de shell. Un target doit correspondre à une IP, un CIDR ou un nom d'hôte et rien d'autre.MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell.
Le dépôt est archivé et en lecture seule, la dernière version npm est la 1.0.1 affectée, et aucune version corrigée ne sera publiée. La suppression est l'atténuation :
target par rapport à un motif IP/CIDR/nom d'hôte et pour mettre additionalFlags sur liste blanche avant que l'un ou l'autre n'atteigne la chaîne de commande.Le correctif, pour quiconque le forke, consiste à appeler
execFile("nmap", [...args]) avec un vecteur d'arguments au lieu de construire une chaîne pour exec. La validation du contenu, et pas seulement la validation de type Zod, est l'exigence sous-jacente.
NIST SP 800-53r5 SI-10 ; OWASP ASVS v4 §5.3.8 ; atténuations CWE-78 M1 et M2.
| Date | Événement |
|---|---|
| 2026-03-03 | CVE-2026-3484 / GHSA-xc68-rrqc-qgq3 publiés par VulDB — la divulgation publique initiale, par un autre rapporteur |
| 2026-05-29 | Identifié indépendamment par revue du code source de l'archive publiée, sans connaissance de l'avis de mars |
| 2026-06-01 | Validé dynamiquement via MCP stdio dans un conteneur isolé |
| 2026-06-13 | Doublon identifié lors de la déduplication pré-soumission ; dépôt confirmé archivé avec Private Vulnerability Reporting indisponible. Verdict interne : ne pas déposer |
| 2026-07-13 | Le CNA-LR de MITRE attribue CVE-2026-52616 malgré tout, en créditant s1ko comme découvreur |
| 2026-08-22 | Publication de ce rapport, documentant le doublon |
aws-mcp-server)Avis complémentaires issus de la même passe de recherche : CVE-2026-52617, CVE-2026-52618.
MIT — voir LICENSE.