
Бюллетень безопасности и безвредный PoC для внедрения команд ОС в nmap MCP-сервере, с отслеживанием дублирующихся CVE, рекомендациями по обнаружению и мерами по устранению уязвимости.
run_nmap_scanMCP-инструмент run_nmap_scan формирует свою команду путём строковой интерполяции
параметров target и additionalFlags и выполняет её через
child_process.exec, то есть /bin/sh -c.
⚠ Прочтите в первую очередь — дублирующий идентификатор
Эта уязвимость была публично известна ещё до появления данного CVE ID. Она покрыта CVE-2026-3484 / GHSA-xc68-rrqc-qgq3, присвоенным VulDB и опубликованным 2026-03-03 в отношении
mcp-nmap-server <= 1.0.1— тот же пакет, та же точка sink CWE-78child_process.exec.CVE-2026-52616 был присвоен s1ko организацией MITRE CNA-LR 2026-07-13 в ответ на независимый отчёт. Это присвоение, по-видимому, является дубликатом, и оно было помечено как таковое. Ссылаться следует на ранее существовавший идентификатор CVE-2026-3484.
Этот репозиторий опубликован для полноты и документирования дубликата, а не как заявление о новом открытии. Заслуга за первоначальное публичное раскрытие не принадлежит s1ko.
| CVE | CVE-2026-52616 — дубликат CVE-2026-3484 |
| CWE | CWE-78 (Ненадлежащая нейтрализация специальных элементов, используемых в команде ОС) |
| Пакет | mcp-nmap-server (npm) |
| Затронуто | 1.0.1 и более ранние — все опубликованные версии |
| Исправлено в | нет — репозиторий заархивирован |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 8.4 High (транспорт stdio). AV:N → 9.8 Critical, если сервер обёрнут в сетевой транспорт. |
| Независимо сообщено | s1ko (github.com/s1ko, [email protected]) |
| CVE присвоен | 2026-07-13, MITRE CNA-LR |
Ловушка в именовании, которую стоит отметить всем, кто занимается дедупликацией этого случая: npm-пакет называется
mcp-nmap-server, а репозиторий — nmap-mcp-server. Эти два порядка слов
относятся к одному и тому же проекту.
Аргументы MCP-инструментов находятся под влиянием атакующего. Они формируются LLM из
содержимого, которое обрабатывает агент — документов, веб-страниц, вывода инструментов — поэтому
косвенная инъекция промпта даёт атакующему контроль над значениями, которые получает
обработчик инструмента. Обработчик, передающий любое из этих значений в оболочку, превращает
это влияние в выполнение кода на хосте, где запущен MCP-сервер. Это
та же модель, что и в прецедентном случае aws-mcp-server / CVE-2026-5058.
dist/index.js — цель добавляется к строке команды, которая затем
передаётся в exec:
command += ` ${target}`;
…
const { stdout, stderr } = await promisify(exec)(command);
child_process.exec выполняет свой аргумент в /bin/sh -c, поэтому всё, что внёс вызывающий код, является синтаксисом оболочки. Входная схема Zod объявляет z.string(), которая проверяет тип и ничего не говорит о содержимом, поэтому метасимволы проходят насквозь. additionalFlags попадает в ту же строку тем же путём.
Вызов run_nmap_scan с target, установленным в
127.0.0.1; touch /tmp/marker; echo INJECTED, даёт:
/bin/sh -c "nmap … 127.0.0.1; touch /tmp/marker; echo INJECTED"
poc/driver.mjs взаимодействует с MCP через stdio: он инициализирует
сервер, выполняет один вызов tools/call для run_nmap_scan с внедрённым target
и проверяет наличие файла-маркера. Полезная нагрузка — безобидный touch.
npm pack [email protected]
tar xf mcp-nmap-server-1.0.1.tgz && cd package && npm install
node ../poc/driver.mjs
Ожидается на уязвимой версии:
==== POC RESULT (mcp-nmap-server) ====
marker /tmp/PWNED_nmap created: true
verdict: CONFIRMED — command injection executed
nmap не обязательно должен быть установлен — внедрённая команда выполняется в той же строке /bin/sh -c независимо от того, разрешается ли ведущий бинарный файл.
Проверено 2026-06-01 в изолированном контейнере и повторно проверено 2026-06-13.
Запускайте только против инфраструктуры, которую вы уполномочены тестировать.
nmap, содержащая ;, &&, ||, |, обратную кавычку или $(.sh -c, командная строка которого начинается с nmap и содержит вторую
команду после разделителя — сигнал дерева процессов (auditd, eBPF, Falco, EDR),
не зависящий от логирования приложения.nmap ожидаем; оболочка,
интерпретатор или сетевой клиент — нет.target или additionalFlags содержат
метасимволы оболочки. target должен соответствовать IP, CIDR или имени хоста и
ничему больше.MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell.
Репозиторий заархивирован и доступен только для чтения, последняя версия в npm — уязвимая 1.0.1, и исправленный релиз не будет опубликован. Смягчение — удаление:
target на соответствие шаблону
IP/CIDR/имени хоста и вносить additionalFlags в белый список до того, как что-либо из этого попадёт в командную
строку.Исправление для тех, кто форкнет проект, — вызывать
execFile("nmap", [...args]) с вектором аргументов вместо построения
строки для exec. Проверка содержимого, а не только проверка типов Zod, — это
основное требование.
NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; меры смягчения CWE-78 M1 и M2.
| Дата | Событие |
|---|---|
| 2026-03-03 | CVE-2026-3484 / GHSA-xc68-rrqc-qgq3 опубликованы VulDB — первоначальное публичное раскрытие, другим исследователем |
| 2026-05-29 | Независимо выявлено при анализе исходного кода опубликованного tarball, без знания о мартовском уведомлении |
| 2026-06-01 | Динамически проверено через MCP stdio в изолированном контейнере |
| 2026-06-13 | Дубликат выявлен при дедупликации перед отправкой; подтверждено, что репозиторий заархивирован, а Private Vulnerability Reporting недоступен. Внутренний вердикт: не подавать |
| 2026-07-13 | MITRE CNA-LR тем не менее присваивает CVE-2026-52616, указывая s1ko как первооткрывателя |
| 2026-08-22 | Опубликован этот отчёт, документирующий дубликат |
aws-mcp-server)Сопутствующие уведомления из того же исследовательского прохода: CVE-2026-52617, CVE-2026-52618.
MIT — см. LICENSE.