
Advisory und gutartiger PoC für eine OS-Befehlsinjektion in einem nmap-MCP-Server, inklusive Tracking doppelter CVE-Einträge, Erkennungshinweisen und Gegenmaßnahmen.
run_nmap_scanDas MCP-Tool run_nmap_scan erstellt seinen Befehl durch String-Interpolation der Parameter target und additionalFlags und führt ihn über child_process.exec aus, d. h. /bin/sh -c.
⚠ Zuerst lesen — doppelte Kennung
Diese Schwachstelle war bereits öffentlich, bevor diese CVE-Kennung existierte. Sie wird durch CVE-2026-3484 / GHSA-xc68-rrqc-qgq3 abgedeckt, vergeben von VulDB und veröffentlicht am 2026-03-03 für
mcp-nmap-server <= 1.0.1— gleiches Paket, gleiche CWE-78-child_process.exec-Senke.CVE-2026-52616 wurde s1ko am 2026-07-13 von MITRE CNA-LR als Reaktion auf einen unabhängigen Bericht zugewiesen. Diese Zuweisung scheint ein Duplikat zu sein, und sie wurde als solches gekennzeichnet. Die bereits bestehende Kennung CVE-2026-3484 ist diejenige, die zitiert werden sollte.
Dieses Repository wird der Vollständigkeit halber und zur Dokumentation des Duplikats veröffentlicht, nicht als Anspruch auf eine neue Entdeckung. Die Anerkennung für die ursprüngliche öffentliche Offenlegung gebührt nicht s1ko.
Eine Namensfalle, die für alle, die dies deduplizieren, erwähnenswert ist: Das npm-Paket heißt mcp-nmap-server und das Repository nmap-mcp-server. Die beiden Reihenfolgen beziehen sich auf dasselbe Projekt.
MCP-Werkzeugargumente werden vom Angreifer beeinflusst. Sie werden von einem LLM aus den Inhalten erzeugt, die der Agent verarbeitet — Dokumente, Webseiten, Werkzeugausgaben. Indirekte Prompt-Injection gibt einem Angreifer daher die Kontrolle über die Werte, die ein Werkzeug-Handler erhält. Ein Handler, der einen dieser Werte in eine Shell einspeist, verwandelt diese Beeinflussung in Codeausführung auf dem Host, auf dem der MCP-Server läuft. Dies ist dasselbe Modell wie im Präzedenzfall aws-mcp-server / CVE-2026-5058.
dist/index.js — das Ziel wird an eine Befehlskette angehängt, die dann an exec übergeben wird:
command += ` ${target}`;
…
const { stdout, stderr } = await promisify(exec)(command);
child_process.exec führt sein Argument in /bin/sh -c aus, sodass alles, was der Aufrufer beigetragen hat, Shell-Syntax ist. Das Zod-Eingabeschema deklariert z.string(), was den Typ validiert und nichts über den Inhalt aussagt, sodass Metazeichen durchgelassen werden. additionalFlags erreicht dieselbe Zeichenkette auf demselben Weg.
Ein run_nmap_scan-Aufruf mit target gesetzt auf 127.0.0.1; touch /tmp/marker; echo INJECTED erzeugt:
/bin/sh -c "nmap … 127.0.0.1; touch /tmp/marker; echo INJECTED"
poc/driver.mjs spricht MCP über stdio: Es initialisiert den Server, sendet einen tools/call-Aufruf für run_nmap_scan mit einem injizierten target und prüft auf eine Markierungsdatei. Der Payload ist ein harmloses touch.
npm pack [email protected]
tar xf mcp-nmap-server-1.0.1.tgz && cd package && npm install
node ../poc/driver.mjs
Erwartet bei einer betroffenen Version:
==== POC RESULT (mcp-nmap-server) ====
marker /tmp/PWNED_nmap created: true
verdict: CONFIRMED — command injection executed
nmap muss nicht installiert sein — der injizierte Befehl läuft in derselben /bin/sh -c-Zeichenkette, unabhängig davon, ob das vorangestellte Binary aufgelöst wird. Validiert 2026-06-01 in einem isolierten Container und erneut validiert 2026-06-13. Führen Sie es nur gegen Infrastruktur aus, die Sie testen dürfen.
nmap-Befehlszeile, die ;, &&, ||, |, ein Backtick oder $( enthält.sh -c-Prozess, dessen Befehlszeile mit nmap beginnt und nach einem Trenner einen zweiten Befehl enthält — ein Prozessbaum-Signal (auditd, eBPF, Falco, EDR), das nicht von der Anwendungsprotokollierung abhängt.nmap ist erwartet; eine Shell, ein Interpreter oder ein Netzwerkclient nicht.target oder additionalFlags Shell-Metazeichen enthalten. Ein target sollte einer IP, CIDR oder einem Hostnamen entsprechen und sonst nichts.MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell.
Das Repository ist archiviert und schreibgeschützt, bei npm ist die neueste Version die betroffene 1.0.1, und es wird keine gepatchte Version veröffentlicht. Die Entfernung ist die Gegenmaßnahme:
target gegen ein IP-/CIDR-/Hostname-Muster zu validieren und additionalFlags auf eine Whitelist zu setzen, bevor einer von beiden die Befehlszeichenkette erreicht.Der Fix für alle, die ihn forken, besteht darin, execFile("nmap", [...args]) mit einem Argument-Vektor aufzurufen, anstatt eine Zeichenkette für exec zu erstellen. Inhaltsvalidierung, nicht nur Zod-Typvalidierung, ist die zugrunde liegende Anforderung.
NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; CWE-78-Gegenmaßnahmen M1 und M2.
aws-mcp-server)Begleitende Advisories aus demselben Forschungsdurchgang: CVE-2026-52617, CVE-2026-52618.
MIT — siehe LICENSE.
| CVE | CVE-2026-52616 — Duplikat von CVE-2026-3484 |
| CWE | CWE-78 (Improper Neutralization of Special Elements used in an OS Command) |
| Paket | mcp-nmap-server (npm) |
| Betroffen | 1.0.1 und früher — alle veröffentlichten Versionen |
| Behoben in | keine — Repository archiviert |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 7.8 Hoch (Stdio-Transport). AV:N → 9.8 Kritisch, wenn der Server in einen Netzwerk-Transport eingebettet ist. |
| Unabhängig gemeldet von | s1ko (github.com/s1ko, [email protected]) |
| CVE zugewiesen | 2026-07-13, MITRE CNA-LR |
| Datum | Ereignis |
|---|
| 2026-03-03 | CVE-2026-3484 / GHSA-xc68-rrqc-qgq3 von VulDB veröffentlicht — die ursprüngliche öffentliche Offenlegung durch einen anderen Melder |
| 2026-05-29 | Unabhängig identifiziert durch Quellenüberprüfung des veröffentlichten Tarballs, ohne Kenntnis des März-Advisories |
| 2026-06-01 | Dynamisch über MCP-Stdio in einem isolierten Container validiert |
| 2026-06-13 | Duplikat während der Deduplizierung vor der Einreichung identifiziert; Repository als archiviert bestätigt, Private Vulnerability Reporting nicht verfügbar. Internes Urteil: nicht einreichen |
| 2026-07-13 | MITRE CNA-LR weist CVE-2026-52616 trotzdem zu und nennt s1ko als Entdecker |
| 2026-08-22 | Dieser Bericht veröffentlicht, der das Duplikat dokumentiert |