
Aviso y PoC benigno para inyección de comandos del sistema operativo en un servidor MCP de nmap, con seguimiento de CVEs duplicados, guía de detección y mitigación.
run_nmap_scanLa herramienta MCP run_nmap_scan construye su comando mediante interpolación de cadenas de los parámetros target y additionalFlags y lo ejecuta a través de child_process.exec, es decir, /bin/sh -c.
⚠ Lea esto primero — identificador duplicado
Esta vulnerabilidad ya era pública antes de que existiera este ID de CVE. Está cubierta por CVE-2026-3484 / GHSA-xc68-rrqc-qgq3, asignado por VulDB y publicado el 2026-03-03 contra
mcp-nmap-server <= 1.0.1— el mismo paquete, el mismo sumidero CWE-78child_process.exec.CVE-2026-52616 fue asignado a s1ko por MITRE CNA-LR el 2026-07-13 en respuesta a un informe independiente. Esa asignación parece ser un duplicado y ha sido marcada como tal. El identificador preexistente CVE-2026-3484 es el que debe citarse.
Este repositorio se publica por integridad y para documentar el duplicado, no como una reclamación de descubrimiento novedoso. El mérito de la divulgación pública original no es de s1ko.
Una trampa de nomenclatura que conviene señalar a quien deduplique esto: el paquete npm es mcp-nmap-server y el repositorio es nmap-mcp-server. Los dos órdenes se refieren al mismo proyecto.
Los argumentos de las herramientas MCP están influenciados por el atacante. Son producidos por un LLM a partir del contenido que el agente procesa — documentos, páginas web, salida de herramientas — por lo que la inyección indirecta de prompt pone al atacante en control de los valores que recibe un manejador de herramientas. Un manejador que introduce cualquiera de esos valores en un shell convierte esa influencia en ejecución de código en el host que ejecuta el servidor MCP. Este es el mismo modelo que el caso precedente aws-mcp-server / CVE-2026-5058.
dist/index.js — el target se añade a una cadena de comandos que luego se entrega a exec:
command += ` ${target}`;
…
const { stdout, stderr } = await promisify(exec)(command);
child_process.exec ejecuta su argumento en /bin/sh -c, por lo que todo lo que el llamador aportó es sintaxis de shell. El esquema de entrada de Zod declara z.string(), que valida el tipo y no dice nada sobre el contenido, por lo que los metacaracteres pasan. additionalFlags llega a la misma cadena por la misma vía.
Una llamada a run_nmap_scan con target establecido en 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 se comunica mediante MCP a través de stdio: inicializa el servidor, emite una tools/call para run_nmap_scan con un target inyectado y comprueba la existencia de un archivo marcador. El payload es un touch benigno.
npm pack [email protected]
tar xf mcp-nmap-server-1.0.1.tgz && cd package && npm install
node ../poc/driver.mjs
Resultado esperado en una versión afectada:
==== POC RESULT (mcp-nmap-server) ====
marker /tmp/PWNED_nmap created: true
verdict: CONFIRMED — command injection executed
nmap no necesita estar instalado: el comando inyectado se ejecuta en la misma cadena /bin/sh -c independientemente de si el binario principal se resuelve. Validado el 2026-06-01 en un contenedor aislado y revalidado el 2026-06-13. Ejecútelo solo contra infraestructura que esté autorizado a probar.
nmap que contenga ;, &&, ||, |, una comilla invertida o $(.sh -c cuya línea de comandos comience con nmap y contenga un segundo comando después de un separador — una señal en el árbol de procesos (auditd, eBPF, Falco, EDR) que no depende del registro de la aplicación.nmap es esperado; un shell, un intérprete o un cliente de red no lo es.target o additionalFlags contengan metacaracteres de shell. Un target debe coincidir con una IP, un CIDR o un nombre de host y nada más.MITRE ATT&CK T1059.004 Intérprete de comandos y scripts: shell de Unix.
El repositorio está archivado y es de solo lectura, la versión más reciente en npm es la afectada 1.0.1 y no se publicará ninguna versión corregida. La mitigación es la eliminación:
target contra un patrón de IP/CIDR/nombre de host y para poner en lista blanca additionalFlags antes de que cualquiera de ellos llegue a la cadena de comandos.La corrección, para quien lo bifurque, es llamar a execFile("nmap", [...args]) con un vector de argumentos en lugar de construir una cadena para exec. La validación de contenido, no solo la validación de tipos de Zod, es el requisito subyacente.
NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; mitigaciones M1 y M2 de CWE-78.
aws-mcp-server)Avisos complementarios de la misma pasada de investigación: CVE-2026-52617, CVE-2026-52618.
MIT — consulte LICENSE.
| CVE | CVE-2026-52616 — duplicado de CVE-2026-3484 |
| CWE | CWE-78 (Neutralización incorrecta de elementos especiales usados en un comando del sistema operativo) |
| Paquete | mcp-nmap-server (npm) |
| Versiones afectadas | 1.0.1 y anteriores — todas las versiones publicadas |
| Corregido en | ninguna — repositorio archivado |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 7.8 Alto (transporte stdio). AV:N → 9.8 Crítico si el servidor está envuelto en un transporte de red. |
| Reportado de forma independiente por | s1ko (github.com/s1ko, [email protected]) |
| CVE asignado | 2026-07-13, MITRE CNA-LR |
| Fecha | Evento |
|---|
| 2026-03-03 | CVE-2026-3484 / GHSA-xc68-rrqc-qgq3 publicado por VulDB — la divulgación pública original, por otro reportero |
| 2026-05-29 | Identificado de forma independiente mediante revisión del código fuente del tarball publicado, sin conocimiento del aviso de marzo |
| 2026-06-01 | Validado dinámicamente a través de MCP stdio en un contenedor aislado |
| 2026-06-13 | Duplicado identificado durante la deduplicación previa al envío; repositorio confirmado como archivado con Informe de Vulnerabilidad Privado no disponible. Veredicto interno: no presentar |
| 2026-07-13 | MITRE CNA-LR asigna CVE-2026-52616 de todos modos, acreditando a s1ko como descubridor |
| 2026-08-22 | Publicación de este informe, documentando el duplicado |