
nmap MCP 서버의 OS 명령어 주입에 대한 권고 및 무해한 PoC, 중복 CVE 추적, 탐지 지침, 완화 조치를 포함합니다.
run_nmap_scan을 통한 OS 커맨드 인젝션run_nmap_scan MCP 도구는 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은 독립적인 보고에 대한 응답으로 2026-07-13에 MITRE CNA-LR이 s1ko에게 지정했습니다. 해당 지정은 중복으로 보이며, 그렇게 플래그가 지정되었습니다. 기존 식별자 CVE-2026-3484가 인용되어야 하는 식별자입니다.
이 저장소는 완전성과 중복 사례를 문서화하기 위해 게시된 것이며, 새로운 발견을 주장하는 것이 아닙니다. 최초 공개 공개에 대한 공로는 s1ko에게 있지 않습니다.
중복 제거를 수행하는 사람이라면 알아둘 만한 명명 함정이 있습니다: npm 패키지는
mcp-nmap-server이고 저장소는 nmap-mcp-server입니다. 두 순서는 동일한
프로젝트를 가리킵니다.
MCP 도구 인자는 공격자의 영향을 받습니다. 이 인자는 에이전트가 처리하는 콘텐츠 — 문서, 웹 페이지, 도구 출력 — 에서 LLM이 생성하므로, 간접 프롬프트 인젝션을 통해 공격자가 도구 핸들러가 수신하는 값을 제어할 수 있게 됩니다. 해당 값 중 하나라도 셸에 전달하는 핸들러는 그 영향을 MCP 서버가 실행되는 호스트에서의 코드 실행으로 바꿉니다. 이는 선례가 된 aws-mcp-server / CVE-2026-5058 사례와 동일한 모델입니다.
dist/index.js — target이 명령 문자열에 추가된 후 exec에 전달됩니다:
command += ` ${target}`;
…
const { stdout, stderr } = await promisify(exec)(command);
child_process.exec는 인자를 /bin/sh -c에서 실행하므로, 호출자가 기여한 모든 것이 셸 구문이 됩니다. Zod 입력 스키마는 z.string()을 선언하는데, 이는 타입만 검증할 뿐 콘텐츠에 대해서는 아무것도 말하지 않으므로 메타문자가 통과합니다. additionalFlags도 동일한 경로로 동일한 문자열에 도달합니다.
target이 127.0.0.1; touch /tmp/marker; echo INJECTED로 설정된 run_nmap_scan 호출은 다음을 생성합니다:
/bin/sh -c "nmap … 127.0.0.1; touch /tmp/marker; echo INJECTED"
poc/driver.mjs는 stdio를 통해 MCP를 사용합니다: 서버를 초기화하고, 인젝션된 target으로 run_nmap_scan에 대한 tools/call 하나를 실행한 뒤 마커 파일을 확인합니다. 페이로드는 무해한 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 명령줄.nmap으로 시작하고 구분자 뒤에 두 번째 명령어가 포함된 sh -c 프로세스 — 애플리케이션 로깅에 의존하지 않는 프로세스 트리 신호(auditd, eBPF, Falco, EDR).nmap은 정상이지만 셸, 인터프리터 또는 네트워크 클라이언트는 정상이 아닙니다.target 또는 additionalFlags에 셸 메타문자가 포함된 MCP 도구 호출 로그. target은 IP, CIDR 또는 호스트 이름이어야 하며 그 외의 것은 아니어야 합니다.MITRE ATT&CK T1059.004 커맨드 및 스크립팅 인터프리터: Unix Shell.
저장소는 보관 처리되어 읽기 전용이고, npm 최신 버전은 영향을 받는 1.0.1이며, 패치된 릴리스는 게시되지 않을 것입니다. 제거가 완화책입니다:
target을 IP/CIDR/호스트 이름 패턴으로 검증하고
additionalFlags가 명령 문자열에 도달하기 전에 허용 목록을 적용하세요.포크하는 사람을 위한 수정 방법은 exec용 문자열을 만드는 대신 인자 벡터로
execFile("nmap", [...args])를 호출하는 것입니다. 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 커맨드에 사용되는 특수 요소의 부적절한 중화) |
| 패키지 | 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 = 7.8 High (stdio 전송). 서버가 네트워크 전송으로 래핑된 경우 AV:N → 9.8 Critical. |
| 독립 보고자 | s1ko (github.com/s1ko, [email protected]) |
| CVE 지정 | 2026-07-13, MITRE CNA-LR |
| 날짜 | 이벤트 |
|---|
| 2026-03-03 | CVE-2026-3484 / GHSA-xc68-rrqc-qgq3 VulDB에 의해 게시 — 다른 보고자에 의한 최초 공개 공개 |
| 2026-05-29 | 3월 권고를 인지하지 못한 채, 게시된 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 | 중복을 문서화한 본 보고서 게시 |