nmap을 MCP(Model Context Protocol) 도구로 연결해 사용하는 환경에서, 문제는 도구의 기능이 아니라 도구를 둘러싼 통제에서 드러납니다. 오픈소스 MCP 서버 프로젝트인 Vorota-ai nmap-mcp에서, 실행 범주를 제한하려는 허용 목록(allowlist) 검증이 의도대로 작동하지 않아 차단된 NSE 스크립트 범주가 실행될 수 있는 결함이 보고됐습니다. CVE 번호는 CVE-2026-117570이고, 레코드상 CNA는 VulnCheck입니다.
개요

- 대상은 Vorota-ai nmap-mcp로, 영향 범위는 커밋 3636afa까지로 표기됐습니다.
- 영향 컴포넌트는 nmap_mcp/server.py의 scan_vulnerabilities() 함수입니다.
- CVE 레코드와 VulnCheck 권고는 공통적으로, 이 도구의 허용 목록 검증이 부적절해(improper allowlist validation) 호출자가 차단된 NSE 스크립트 범주를 실행할 수 있다고 기록합니다. VulnCheck 권고에는 MCP 클라이언트나 프롬프트 인젝션에 노출된 에이전트가 exploit, dos, brute 같은 범주를 전달할 수 있다는 설명이 있습니다.
- 악용 주체는 자료의 표현대로 두 가지로 정리됩니다. MCP 클라이언트를 직접 다루는 호출자, 그리고 프롬프트 인젝션에 노출돼 대신 인자를 넣게 된 에이전트입니다.
- 보고된 취약점 유형은 GitHub Issue #3 기준 CWE-183(정보 누락에 의한 잘못된 입력 허용 목록)과 CWE-20(부적절한 입력 검증)입니다. 이번 근거에서 확인되는 실행 가능한 결과는 차단된 NSE 스크립트 범주의 실행까지입니다.
- 심각도 표기는 두 갈래입니다. CVE 레코드에는 CVSS 4.0 4.8, CVSS 3.1 5.2로 기록돼 있고, GitHub Issue #3을 작성한 연구자의 평가는 CVSS 3.1 8.1(High)이었습니다.
영향 범위
- 버전: nmap-mcp 커밋
3636afa까지 - 코드 위치:
nmap_mcp/server.py의scan_vulnerabilities(), 공개된 기술 보고서에서 취약 코드로 지목된 범위는 440-446라인 - 공격 전제 조건: MCP 도구 호출 자격(PR:L), 또는 에이전트를 조작할 수 있는 프롬프트 인젝션 지점
- 배치 조건: 네트워크에서 도달 가능한(AV:N) MCP 서버 환경
연구자 평가 벡터가 PR:L을 전제한다는 점은, 위협이 자격 없이 도달하는 외부 공격자 단독보다는 도구 호출 자격을 얻은 클라이언트나 프롬프트 인젝션으로 에이전트를 조종할 수 있는 지점을 통해 구체화된다는 뜻으로 읽을 수 있습니다. 같은 전제라면 점검의 첫 자리는 코드판정보다 MCP 서버의 도달 범위와, 그 도구 호출 자격이 어디까지 부여돼 있는지가 됩니다. 이것은 자료에 적힌 지침이 아니라 벡터 조건에서 끌어낸 해석입니다.
기밀성과 무결성에 대한 높은 영향(C:H/I:H)은 GitHub Issue #3의 제보자가 적은 평가 벡터의 값입니다. 같은 결함에 대해 CVE 레코드에 기록된 점수는 그보다 낮은 CVSS 4.0 4.8, CVSS 3.1 5.2이고, 레코드 점수를 구성하는 세부 벡터 값은 이번 자료에 포함되어 있지 않아 두 평가가 어디에서 갈리는지까지는 확인하지 못했습니다. 또한 이번 근거에는 차단 범주 실행이 특정 내부 자산 침해, 정보 유출, 서비스 장애 같은 결과로 이어졌다는 관측 기록이 없습니다. 따라서 C:H/I:H가 가리키는 구체적인 침해 경로를 이 사례의 사실로 특정하지는 못하며, 확인된 범위는 scan_vulnerabilities()의 범주 검증이 우회돼 차단 범주가 nmap에 전달될 수 있다는 통제 실패까지입니다. 제보자 벡터상 가용성 영향은 A:N으로 표기돼 있습니다.
기술적 분석
허용 목록이 우회되는 지점
scan_vulnerabilities()(server.py 440-446라인)는 실행할 NSE 스크립트 범주를 제한하는 허용 목록 검증 경로를 갖지만, CVE 레코드와 VulnCheck 권고는 공통적으로 이 검증이 부적절(improper allowlist validation)해서 호출자가 차단된 NSE 스크립트 범주를 실행할 수 있다고 기록합니다. 즉 취약점은 nmap 기능 내부가 아니라, MCP 도구 진입점에서 입력을 승인 범주와 견주는 통제 그 자체에 있습니다. 허용 목록이 코드에서 어떤 구조로 정의되고 어떤 기준으로 입력과 견주는지에 대한 구현 상세는 이번 인용 범위에 포함되어 있지 않아, 우회가 정확히 어떤 비교 조건에서 발생하는지는 확인하지 못했습니다. 따라서 이 결함의 기술적 설명은 제공된 근거의 표현대로, 허용 목록 검증이 부적절해 차단된 NSE 범주가 실행될 수 있다는 범위로 한정하는 편이 정확합니다.
공격으로 이어지는 두 경로
- 직접 경로: MCP 클라이언트 호출 자격을 가진 주체가
scan_vulnerabilities인자에 차단 범주를 명시적으로 넣는 경우 - 간접 경로: 신뢰할 수 없는 외부 콘텐츠를 읽은 에이전트가 프롬프트 인젝션으로 유도되어 스스로 차단 범주를 전달하는 경우
두 경로에서 공통으로 확인되는 것은 범주 검증 자체의 실패입니다. VulnCheck 권고가 exploit, dos, brute를 예로 들고 있는 만큼, 막혀야 할 인자가 nmap 호출로 전달되면 MCP 도구라는 진입점이 실제 스캔 동작으로 이어질 수 있습니다. 다만 그 동작이 어떤 침해 결과로 귀결되는지는 이번 자료로 확인되지 않았습니다. 프롬프트 인젝션 자체가 침해를 완성하지는 않고, 실제로는 MCP 서버의 도달 범위(AV:N)와 도구 호출 자격(PR:L)이라는 전제가 함께 성립해야 합니다.
공개 PoC·익스플로잇 분석
- 출처: GitHub Issue #3에 취약 코드로 지목된 위치(
nmap_mcp/server.py440-446라인)와 허용 목록을 통과시킬 수 있는 차단 범주(exploit,dos,brute등)가 호출 인자 수준까지 구체적으로 적혀 있습니다. CVE 레코드와 VulnCheck 권고가 같은 차단 범주 실행 가능성을 뒷받침하므로, 자료 범위 안에서 이는 실행 절차라기보다 코드와 인자 수준까지 공개된 기술 보고서 형식의 악용 정보로 확인됩니다. - 전제조건: 공개된 내용은 코드와 인자 수준 설명에 가까워, 실제로 성립시키려면 MCP 서버에 도달할 네트워크 경로(AV:N)와 도구 호출 자격(PR:L) 또는 프롬프트 인젝션으로 에이전트를 조종할 지점이 별도로 필요합니다. 즉 정보 공개 자체가 침해를 완성하지는 않고, 환경의 노출면과 도구 호출 자격 상태가 맞춰져야 합니다.
- 입증 범위: 입증된다고 다룰 수 있는 것은
scan_vulnerabilities의 범주 검증이 우회돼 차단 범주가 nmap에 전달될 수 있다는 통제 실패까지입니다. 특정 내부 자산 침해, 인증 우회 성공, 서비스 장애 같은 결과는 이 자료에서 확인되지 않았고, 제보자 평가 벡터상 가용성 영향은 A:N으로 표기돼 있습니다. - 운용상 의미: 차단 대상 범주와 취약 코드로 지목된 위치가 공개돼 있으므로, 자기 환경의 MCP 도구 호출 기록과 설정을 대조해 어떤 범주 요청이 통과했는지, 누가 그 도구를 호출할 수 있는지부터 살피는 것이 점검의 출발점이 됩니다. 허용 목록의 실제 판정 기준과 최신 커밋에서의 동작은 이번 자료로 확인되지 않으므로, 코드 수준 확인이 필요하다면 프로젝트 저장소에서 직접 확인해야 합니다.
심각도와 악용 상태
- CVE 레코드에 기록된 점수는 CVSS 4.0 4.8, CVSS 3.1 5.2입니다. 같은 결함에 대해 GitHub Issue의 제보자 평가는 CVSS 3.1 기준 8.1(High), 벡터 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N으로, 두 사이에는 뚜렷한 간격이 있습니다. 제보자 평가는 CNA 공식 채점이 아닌 리포트 작성자의 것이므로, 심각도를 한 값으로 단정하지 않는 편이 정확합니다.
- 제보자 벡터의 가용성 영향은 A:N입니다. 따라서
dos범주 실행 가능이 부하성 트래픽 위험과 무관하다고 보기는 어렵지만, 적어도 그 평가에는 반영되지 않았습니다. 공식 점수가 낮은 쪽이라면 우선순위는 레코드의 수치 자체보다 자기 환경의 노출 범위와 도구 활성 여부로 판단하는 것이 합리적입니다. - 악용 지표(IOC), 실제 공격 관측, CISA KEV 등재는 확인되지 않았습니다. 공개된 악용 정보는 위 구역에서 정리한 기술 보고서 수준이고, 전달된 근거에는 실행 산출물 형태의 PoC 코드나 실전 악용 기록은 포함돼 있지 않습니다.
- CVE-2026-117570의 CNA는 VulnCheck로 확인됩니다.
관측 사례가 없다는 사실은 위험이 낮다는 뜻이 아니라 이번 자료로는 드러나지 않았다는 뜻에 가깝습니다. 특히 MCP 서버를 내부망에 둔 채 외부 콘텐츠까지 처리하게 하는 구성에서는, 확인되지 않음과 안전하지 않음을 구분해 다루는 편이 안전합니다.
확인되지 않은 사항
- 공급업체(Vorota-ai)의 공식 보안 권고문이나 수정 커밋의 존재 여부는 이번 자료로 확인되지 않았습니다. 패치 반영 여부는 프로젝트 저장소에서 직접 확인해야 합니다.
- CISA KEV 등재 여부는 미확인입니다.
- CVE 레코드에 기록된 점수 외로 NVD가 별도로 내린 평가는 이번 자료에서 확인되지 않았습니다.
- 허용 목록이 코드에서 어떤 구조로 정의되고 어떤 기준으로 입력과 비교되는지, 그리고 최신 커밋에서의 동작은 이번 자료의 인용 범위에 포함되어 있지 않습니다.
- 차단 범주 실행이 특정 서비스 침해로 이어진 사례, 그리고 이 결함을 다루는 공개 탐지 규칙이나 로그 양식도 확인되지 않았습니다.
대응 방안
지금 확인할 것
- 자기 배포본이 영향 범위인 커밋
3636afa까지에 해당하는지, 그리고scan_vulnerabilities도구를 실제로 활성화해 사용하고 있는지부터 확인합니다. 도구를 쓰지 않는 배포라면 이 결함의 직접적인 점검 대상에서 빠집니다. - 공급업체 공식 권고나 수정 커밋의 존재는 이 자료 시점에 확인되지 않았으므로, 저장소에서 수정 반영 여부를 직접 확인합니다. 어떤 버전에서 범주 판정이 막히는지는 저장소 확인 전까지는 단정할 수 없습니다.
- 벡터 조건상 AV:N과 PR:L이 전제이므로, MCP 서버가 네트워크에서 얼마나 도달 가능한지, 도구 호출 자격이 어떤 주체까지 부여돼 있는지를 점검 순서의 앞에 두는 해석이 성립합니다. 외부 접근 가능 네트워크에 MCP 서버를 두지 않도록 배치를 재검토하는 것도 같은 맥락입니다. 이 부분은 자료에 적힌 지침이 아니라 벡터 조건에서 끌어낸 해석입니다.
scan_vulnerabilities호출에서exploit,dos,brute같은 차단 범주가 인자로 전달된 사례가 있는지, 배포에서 확인 가능한 호출 기록이 남아 있는지 살펴봅니다. 이 확인은 자료에서 범주와 호출 인자 수준만 확인됐다는 범위 안에서 이해해야 하며, 로그 항목이나 보존 설정은 배포마다 다릅니다.- 프롬프트 인젝션 경로는 에이전트가 처리하는 외부 콘텐츠가 도구 호출 인자 결정에 관여할 때 열립니다. VulnCheck 권고가 프롬프트 인젝션에 노출된 에이전트를 악용 주체로 지목하는 이유입니다. 어떤 콘텐츠가 그 경로에 들어가는지는 배포별 설정이므로 이번 자료로는 확인되지 않습니다.
구조적으로 남는 문제
이번 자료로 확인되는 완화 관련 사실은 제한적입니다. 취약점은 scan_vulnerabilities()의 허용 목록 검증이 부적절하다(improper allowlist validation)는 보고로 정리되고, 공식 수정 릴리스나 공급업체 차원의 권고 존재는 확인되지 않았습니다. 따라서 특정 수정이 어떤 릴리스에 어떻게 반영됐는지는 저장소 확인 전까지는 단정할 수 없습니다.
그래도 이번 사례가 남기는 지점은 명확합니다. 판정 실패는 nmap 기능 내부가 아니라 MCP 도구 진입점의 허용 목록 검증에서 보고됐습니다. 허용 목록형 통제를 직접 구현하거나 개조하는 환경이라면, 같은 종류의 판정 경로를 코드 리뷰의 검토 대상으로 올리는 판단이 설득력을 갖습니다. 이는 확인된 메커니즘에서 끌어낸 해석이지, 자료에 적힌 공급업체 지침이 아닙니다.
참고자료
- CVE-2026-117570 nmap-mcp through commit 3636afa Permissive NSE Script Allowlist in scan_vulnerabilities
- [Security] NSE Script Category Validation Bypass in scan-vulnerabilities Tool (CWE-183)
- nmap_mcp/consts.py — SAFE_NSE_CATEGORIES definition
- nmap-mcp through commit 3636afa Permissive NSE Script Allowlist in scan_vulnerabilities
함께 읽으면 좋은 글
- Kali-GPT MCP 서버의 OS 명령 삽입(CVE-2026-117569): execute_tool() 경로의 입력 검증 공백과 점검 포인트
- Z.ai Zcode Sed Command Filter OS 명령 주입(CVE-2026-116118) 점검
- Continue 2.0.0 MCP Server Transport 명령 주입(CVE-2026-116109): CVE 기록으로 확인되는 범위와 점검 순서
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!