
Advertência e PoC benigno para injeção de comandos do sistema operacional em um servidor MCP do nmap, com rastreamento de CVEs duplicadas, orientações de detecção e mitigação.
run_nmap_scanA ferramenta MCP run_nmap_scan constrói seu comando por interpolação de string dos parâmetros target e additionalFlags e o executa por meio de child_process.exec, ou seja, /bin/sh -c.
⚠ Leia isto primeiro — identificador duplicado
Esta vulnerabilidade já era pública antes de este identificador CVE existir. Ela é coberta por CVE-2026-3484 / GHSA-xc68-rrqc-qgq3, atribuída pela VulDB e publicada em 2026-03-03 contra
mcp-nmap-server <= 1.0.1— mesmo pacote, mesmo sink CWE-78child_process.exec.O CVE-2026-52616 foi atribuído a s1ko pela MITRE CNA-LR em 2026-07-13 em resposta a um relatório independente. Essa atribuição parece ser uma duplicata e foi sinalizada como tal. O identificador pré-existente CVE-2026-3484 é o que deve ser citado.
Este repositório é publicado para fins de completude e para documentar a duplicata, não como uma reivindicação de descoberta inédita. O crédito pela divulgação pública original não é de s1ko.
Uma armadilha de nomenclatura que vale notar para quem estiver deduplicando isto: o pacote npm é mcp-nmap-server e o repositório é nmap-mcp-server. As duas ordens referem-se ao mesmo projeto.
Os argumentos das ferramentas MCP são influenciados pelo atacante. Eles são produzidos por um LLM a partir do conteúdo que o agente processa — documentos, páginas da web, saída de ferramentas — portanto, a injeção indireta de prompt coloca um atacante no controle dos valores que um manipulador de ferramenta recebe. Um manipulador que alimenta qualquer um desses valores a um shell transforma essa influência em execução de código no host que executa o servidor MCP. Este é o mesmo modelo do caso precedente aws-mcp-server / CVE-2026-5058.
dist/index.js — o alvo é anexado a uma string de comando que é então entregue a exec:
command += ` ${target}`;
…
const { stdout, stderr } = await promisify(exec)(command);
child_process.exec executa seu argumento em /bin/sh -c, portanto tudo o que o chamador contribuiu é sintaxe de shell. O esquema de entrada Zod declara z.string(), que valida o tipo e nada diz sobre o conteúdo, portanto metacaracteres passam. additionalFlags chega à mesma string pela mesma rota.
Uma chamada run_nmap_scan com target definido como 127.0.0.1; touch /tmp/marker; echo INJECTED produz:
/bin/sh -c "nmap … 127.0.0.1; touch /tmp/marker; echo INJECTED"
poc/driver.mjs fala MCP via stdio: ele inicializa o servidor, emite uma chamada tools/call para run_nmap_scan com um target injetado e verifica se há um arquivo marcador. O payload é um touch benigno.
npm pack [email protected]
tar xf mcp-nmap-server-1.0.1.tgz && cd package && npm install
node ../poc/driver.mjs
Esperado em uma versão afetada:
==== POC RESULT (mcp-nmap-server) ====
marker /tmp/PWNED_nmap created: true
verdict: CONFIRMED — command injection executed
O nmap não precisa estar instalado — o comando injetado é executado na mesma string /bin/sh -c independentemente de o binário inicial ser resolvido. Validado em 2026-06-01 em um contêiner isolado e revalidado em 2026-06-13. Execute-o apenas contra infraestrutura que você está autorizado a testar.
nmap contendo ;, &&, ||, |, uma crase ou $(.sh -c cuja linha de comando começa com nmap e contém um segundo comando após um separador — um sinal de árvore de processos (auditd, eBPF, Falco, EDR) que não depende do registro de aplicação.nmap é esperado; um shell, um interpretador ou um cliente de rede não é.target ou additionalFlags contenham metacaracteres de shell. Um target deve corresponder a um IP, CIDR ou hostname e nada mais.MITRE ATT&CK T1059.004 Interpretador de Comandos e Scripts: Shell Unix.
O repositório está arquivado e somente leitura, o latest do npm é a versão afetada 1.0.1, e nenhuma versão corrigida será publicada. A remoção é a mitigação:
target contra um padrão de IP/CIDR/hostname e para colocar additionalFlags em uma lista de permissões antes que qualquer um deles chegue à string de comando.A correção, para quem fizer um fork, é chamar execFile("nmap", [...args]) com um vetor de argumentos em vez de construir uma string para exec. A validação de conteúdo, não apenas a validação de tipo do Zod, é o requisito subjacente.
NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; mitigações M1 e M2 de CWE-78.
aws-mcp-server)Avisos complementares da mesma rodada de pesquisa: CVE-2026-52617, CVE-2026-52618.
MIT — consulte LICENSE.
| CVE | CVE-2026-52616 — duplicata de CVE-2026-3484 |
| CWE | CWE-78 (Neutralização imprópria de elementos especiais usados em um comando do SO) |
| Pacote | mcp-nmap-server (npm) |
| Afetados | 1.0.1 e anteriores — todas as versões publicadas |
| Corrigido em | nenhuma — repositório arquivado |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 7.8 Alta (transporte stdio). AV:N → 9.8 Crítica se o servidor estiver encapsulado em um transporte de rede. |
| Relatado independentemente por | s1ko (github.com/s1ko, [email protected]) |
| CVE atribuído | 2026-07-13, MITRE CNA-LR |
| Data | Evento |
|---|
| 2026-03-03 | CVE-2026-3484 / GHSA-xc68-rrqc-qgq3 publicado pela VulDB — a divulgação pública original, por outro relator |
| 2026-05-29 | Identificado de forma independente por revisão de código-fonte do tarball publicado, sem conhecimento do aviso de março |
| 2026-06-01 | Validado dinamicamente via MCP stdio em um contêiner isolado |
| 2026-06-13 | Duplicata identificada durante a deduplicação pré-submissão; repositório confirmado arquivado com Relato Privado de Vulnerabilidade indisponível. Veredito interno: não registrar |
| 2026-07-13 | MITRE CNA-LR atribui CVE-2026-52616 mesmo assim, creditando s1ko como descobridor |
| 2026-08-22 | Este relatório foi publicado, documentando a duplicata |