
Бюллетень безопасности и безвредный PoC для внедрения команд ОС в nmap MCP-сервере, с отслеживанием дублирующихся CVE, рекомендациями по обнаружению и мерами по устранению уязвимости.
run_nmap_scanИнструмент MCP 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— тот же пакет, тот же сток CWE-78child_process.exec.CVE-2026-52616 был присвоен s1ko организацией MITRE CNA-LR 2026-07-13 в ответ на независимый отчёт. Это присвоение, по-видимому, является дубликатом и помечено как таковое. Существующий ранее идентификатор CVE-2026-3484 — именно тот, на который следует ссылаться.
Этот репозиторий опубликован для полноты и документирования дубликата, а не как заявление о новом открытии. Заслуга в исходном публичном раскрытии принадлежит не s1ko.
Стоит отметить ловушку в именовании для тех, кто проводит дедупликацию: npm-пакет называется mcp-nmap-server, а репозиторий — nmap-mcp-server. Оба порядка слов относятся к одному и тому же проекту.
Аргументы инструментов MCP подвержены влиянию атакующего. Они формируются LLM из контента, который обрабатывает агент, — документов, веб-страниц, вывода инструментов, — поэтому непрямая промпт-инъекция даёт атакующему контроль над значениями, которые получает обработчик инструмента. Обработчик, передающий любое из этих значений в shell, превращает это влияние в выполнение кода на хосте, где запущен 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, поэтому всё, что внёс вызывающий код, является синтаксисом shell. Схема ввода 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 ожидаем; shell, интерпретатор или сетевой клиент — нет.target или additionalFlags содержат метасимволы shell. 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.
aws-mcp-server)Сопутствующие бюллетени из того же цикла исследований: CVE-2026-52617, CVE-2026-52618.
MIT — см. LICENSE.
| CVE | CVE-2026-52616 — дубликат CVE-2026-3484 |
| CWE | CWE-78 (Некорректная нейтрализация специальных элементов, используемых в OS-команде) |
| Package | mcp-nmap-server (npm) |
| Affected | 1.0.1 и более ранние — все опубликованные версии |
| Fixed in | нет — репозиторий архивирован |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 7.8 Высокий (транспорт stdio). AV:N → 9.8 Критический, если сервер обёрнут в сетевой транспорт. |
| Independently reported by | s1ko (github.com/s1ko, [email protected]) |
| CVE assigned | 2026-07-13, MITRE CNA-LR |
| Дата | Событие |
|---|
| 2026-03-03 | CVE-2026-3484 / GHSA-xc68-rrqc-qgq3 опубликован VulDB — исходное публичное раскрытие, другим репортёром |
| 2026-05-29 | Независимо выявлено при анализе исходного кода опубликованного tarball, без знания о мартовском бюллетене |
| 2026-06-01 | Динамически проверено через MCP stdio в изолированном контейнере |
| 2026-06-13 | Дубликат выявлен при предварительной дедупликации перед подачей; подтверждено, что репозиторий архивирован, а частное сообщение об уязвимостях недоступно. Внутренний вердикт: не подавать |
| 2026-07-13 | MITRE CNA-LR присваивает CVE-2026-52616 несмотря ни на что, указывая s1ko как первооткрывателя |
| 2026-08-22 | Опубликована эта статья, документирующая дубликат |