vm2 3.12.2 미만 버전의 NodeVM 외부 모듈 리졸버에서 허용 경로를 검증할 때 경로 경계를 요구하지 않는 접두사 정규식을 사용해, 허용 목록에 없는 호스트 파일까지 인가될 수 있는 권한 우회 취약점이 보고되었습니다. CVE-2026-100721은 샌드박스로 격리된 게스트 코드가 호스트 프로세스 권한으로 실행될 수 있는 경로를 열기 때문에, vm2를 보안 경계로 신뢰하는 서비스라면 구성 점검과 패치가 필요합니다.
개요

CVE-2026-100721은 vm2 3.12.2 미만 버전의 NodeVM 외부 모듈 리졸버에 존재하는 권한 우회(authorization bypass) 취약점입니다. 임베더가 require.external에 커스텀 리졸버를 지정하고 context: 'host'로 구성한 환경에서, CVE Project 기록에 따르면 lib/resolver-compat.js의 LegacyResolver.customResolve가 해석된 모듈 디렉터리를 this.externals에 정규식으로 기록할 때 경로 경계를 요구하지 않아 인가 범위가 의도된 허용 목록보다 넓어집니다.
CVE Project 기록은 이 취약점에 CVSS v4.0 9.5(CRITICAL), CVSS v3.1 9.0(CRITICAL) 평가를 부여하고 있습니다.
해당 취약점은 GitHub Security Advisory(GHSA-5h3f-q97h-ccvc)를 통해 공개되었으며, VulnCheck에서도 분석이 발표되었습니다.
영향 범위
이 취약점이 성립하려면 다음 조건이 모두 충족되어야 합니다.
- vm2 3.12.2 미만 버전을 사용하는 서비스
- NodeVM 설정에서
require.external에 커스텀 리졸버를 구성한 임베딩 서비스 context: 'host'로 실행되는 NodeVM 구성
세 가지 조건이 동시에 성립하고 게스트 코드에 대한 제어권이 공격자에게 있는 경우, 샌드박스 경계가 실질적으로 무력화될 수 있습니다. vm2를 보안 경계로서 신뢰하고 게스트 코드 격리에 의존하는 운영 환경에서는 이 취약점이 격리 모델 전반의 신뢰를 훼손합니다.
다만 야생에서의 실제 악용 사례는 현재 조사 범위에서 확인되지 않았으며, CISA KEV 등재 여부도 확인되지 않았습니다.
기술적 분석
메커니즘
커스텀 리졸버가 모듈을 해석하면 LegacyResolver.customResolve는 해석된 경로를 this.externals에 다음과 같은 형태로 기록합니다.
new RegExp('^' + escapeRegExp(resolvedPath))
이 정규식은 ^로 시작만 고정하고, 경로 구분자(/)나 문자열 끝 경계(end-of-string boundary)를 요구하지 않습니다. 즉, 허용된 경로가 인가되면 그 접두사를 공유하는 다른 경로도 정규식에 일치하게 됩니다. Advisory에서 확인된 시연에 따르면, transitive: false 설정과 무관하게 허용 목록에 없는 접두사 공유 호스트 파일을 로드하도록 유도할 수 있으며, 시연된 형제 파일(sibling)은 child_process를 실행하는 방식으로 호스트 프로세스에서 코드 실행에 이르는 경로를 보여줍니다.
VulnCheck 분석은 이 문제를 NodeVM External-Package Allowlist Bypass via Unanchored Module-Path Prefix로 분류합니다.
공개 PoC·익스플로잇 분석
공개 기술 연구와 재현 사례(PoC)가 확인되었습니다. 시연은 공격자 제어 JavaScript가 NodeVM에서 실행되고, 커스텀 외부 리졸버와 context: 'host'가 함께 구성된 환경에서 허용 목록에 없는 호스트 파일을 로드하고 child_process를 실행하는 것을 보여줍니다.
- 출처: GHSA-5h3f-q97h-ccvc
- 전제 조건: 게스트 코드가 공격자 통제하에 있고, 커스텀 외부 리졸버와
context: 'host'구성이 함께 존재 - 입증 범위: 허용 목록에 없는 접두사 공유 파일 로드 및
child_process실행 - 운영상 의미: 샌드박스 내 코드 격리만으로는 이 구성에서 호스트 프로세스 격리를 보장하지 못하며, 리졸버 인가 로직 자체가 경계 역할을 수행해야 합니다
야생 악용은 확인되지 않았으므로, 이 시연이 실제 공격 시나리오에 적용되는지는 해당 서비스의 노출 범위와 게스트 코드 제어 가능 여부에 따라 다릅니다.
대응 방안
즉각 조치
- vm2 사용 여부와 버전을 파악하고, 3.12.2 미만이면 최신 버전으로 업데이트합니다.
- NodeVM 구성에서
require.external커스텀 리졸버 사용 여부와context: 'host'설정 여부를 점검합니다. - 커스텀 리졸버가 필수라면, 허용 경로 인가가 접두사 일치가 아닌 경로 경계 있는 일치로 동작하는지 개발팀과 확인합니다.
- 패치 전 운영 구간에서는 공격자 제어 JavaScript를 NodeVM에서 실행하는 기능의 노출을 최소화합니다.
지속적 개선
- vm2를 3.12.2 이상으로 업그레이드합니다. 수정 커밋(6ac3916)은 외부 모듈 인가에 경로 경계를 요구하도록 specifier 측 검사를 보강했습니다.
- 커스텀 외부 리졸버 사용 시 허용 목록이 정확한 경로 경계로 일치하는지 검증하는 설계 검토를 코드 베이스에 반영합니다.
탐지
- 게스트 코드 실행이 허용된 서비스에서 허용 목록 외 모듈 로드 및
child_process계열 프로세스 생성 이벤트를 모니터링합니다. - NodeVM 외부 모듈 해석 요청 중 허용된 접두사와 유사하지만 다른 경로를 참조하는
require활동을 로그로 남겨 이상 징후로 검토합니다.
한계
- CISA KEV 등재 여부와 야생 악용 사례는 현재 확인되지 않았습니다.
- 정량적 위협 수준 판단의 기준은 CVE 기록이 제공하는 CVSS 평가(v4.0 9.5 CRITICAL, v3.1 9.0 CRITICAL)이며, 이를 넘어선 호스트 환경 특이적 위험도 평가는 제공된 근거에 포함되지 않았습니다.
- 호스트 환경에 따른 영향 차이와 구체적 우회 사례의 전체 조건은 제공된 근거에 명시된 구성 범위 내에서만 설명했습니다.
참고자료
- CVE-2026-100721: vm2 before 3.12.2 Authorization Bypass via Custom Resolver
- NodeVM custom resolution bypasses external path boundaries (GHSA-5h3f-q97h-ccvc)
- vm2 before 3.12.2 Authorization Bypass via Custom Resolver
- Fix commit 6ac3916: require a path boundary in external module authorization
함께 읽으면 좋은 글
- CVE-2015-5287: Red Hat ABRT 심볼릭 링크 권한 상승, KEV 등재와 레거시 Linux 점검
- CVE-2026-53266: Linux 커널 ebtables SNAT ARP 리라이팅 취약점과 CISA KEV 등재
- CVE-2026-66384: JFrog Artifactory Docker 캐시 경로 외부 데이터 작성 취약점
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!