
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.-à-d. /bin/sh -c.
⚠ À lire en premier — identifiant en double
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, assigné par VulDB et publié 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é assigné à s1ko par MITRE CNA-LR le 2026-07-13 en réponse à un rapport indépendant. Cette assignation semble être un doublon, et elle a été signalée comme telle. L'identifiant préexistant CVE-2026-3484 est celui qui doit être cité.
Ce dépôt est publié pour l'exhaustivité et pour documenter le doublon, pas comme une revendication de découverte originale. Le crédit de la divulgation publique originale ne revient pas à s1ko.
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
se réfèrent au 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, sorties d'outils — de sorte que
l'injection indirecte de prompt donne à l'attaquant le contrôle des valeurs qu'un
gestionnaire d'outil reçoit. Un gestionnaire qui transmet l'une de ces valeurs à 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(),
qui valide le type et ne dit rien sur le contenu, donc les métacaractères passent
à travers. additionalFlags atteint la même chaîne par le même chemin.
Un appel run_nmap_scan avec target défini à
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 parle MCP sur 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
Résultat 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 initial se résolve ou non.
Validé le 2026-06-01 dans un conteneur isolé et re-validé 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 shell. Un target doit correspondre à une IP, un CIDR ou un nom d'hôte et rien
d'autre.MITRE ATT&CK T1059.004 Interpréteur de commandes et de scripts : shell Unix.
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. Le retrait est l'atténuation :
target contre un motif IP/CIDR/nom d'hôte
et pour mettre additionalFlags sur liste autorisée avant que l'un ou l'autre n'atteigne la chaîne
de commande.La correction, pour quiconque le forke, est d'appeler
execFile("nmap", [...args]) avec un vecteur d'arguments au lieu de construire une
chaîne pour exec. La validation du contenu, 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.
aws-mcp-server)Avis compagnons de la même campagne de recherche : CVE-2026-52617, CVE-2026-52618.
MIT — voir LICENSE.
| CVE | CVE-2026-52616 — doublon de CVE-2026-3484 |
| CWE | CWE-78 (Mauvaise neutralisation des éléments spéciaux utilisés dans une commande système) |
| Paquet | mcp-nmap-server (npm) |
| Versions affectées | 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 = 7,8 Élevée (transport stdio). AV:N → 9,8 Critique si le serveur est enveloppé dans un transport réseau. |
| Rapporté indépendamment par | s1ko (github.com/s1ko, [email protected]) |
| CVE assigné | 2026-07-13, MITRE CNA-LR |
| Date | Événement |
|---|
| 2026-03-03 | CVE-2026-3484 / GHSA-xc68-rrqc-qgq3 publié par VulDB — la divulgation publique originale, par un autre rapporteur |
| 2026-05-29 | Identifié indépendamment par revue du code source du tarball publié, 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 avant soumission ; dépôt confirmé archivé, signalement privé de vulnérabilité indisponible. Verdict interne : ne pas déposer |
| 2026-07-13 | MITRE CNA-LR assigne CVE-2026-52616 quand même, créditant s1ko comme découvreur |
| 2026-08-22 | Cet article publié, documentant le doublon |