
교육용 랩으로, 여러 취약한 샌드박스 버전을 통해 JavaScript 표현식 샌드박스 탈출 기법과 패치 진화를 시연하며, 페이로드 및 AST 분석을 포함합니다.
JavaScript 표현식 샌드박스 탈출과 패치 진화를 시연하기 위한 최소화된 실험 환경입니다.
여러 버전의 sandbox를 통해 다음 과정을 구현합니다:
완전 탈출 가능 → this 패치 → destructuring 재패치
동시에 새로운 우회 방식을 남겨두어, 실제 세계에서 벌어지는 취약점과 패치의 공방 과정을 이해하는 데 도움을 줍니다.
.
├── payload.js # 각종 공격 payload
├── sandbox_v0.js # 원본 취약 버전
├── sandbox_v1.js # this 체인 수정
├── sandbox_v2.js # destructuring 추가 수정
우리는 다음과 같은 현실을 시뮬레이션하고자 합니다:
끊임없이 반복됩니다.
이 프로젝트는 진짜 안전한 VM을 만드는 것이 목적이 아닙니다. 오히려 다음을 관찰하기 위한 것입니다:
"그럴듯해 보이는" 패치 하나하나가, 어떻게 다음 기법에 의해 뚫리는지.
npm install vm2 acorn acorn-walk
node sandbox_vX.js
X를 0 / 1 / 2로 바꾸면 됩니다.
payload.js에는 네 가지 접근 방식이 내장되어 있습니다:
| 이름 | 기술 |
|---|---|
| CVE-2025-68613 / this | this를 통해 process 획득 |
| CVE-2026-25049 / destructuring | 객체 구조 분해로 constructor 획득 |
| Reflect.get | Reflect API 사용 |
| Dynamic Reflect | 동적 속성 접근 |
특징:
결과: 모든 payload가 통과합니다.
공격자는 명절 분위기로 즐거워합니다.
변경 사항:
"use strict" 강제.call(undefined)따라서:
this === undefined
공격자는 고개를 끄덕이며 다른 길로 우회합니다.
추가 사항:
ObjectPattern 전용 검사constructor블랙리스트 방식 패치는 일반적으로 다음과 같은 특성을 가집니다:
✔ 명확한 경로 수정 ✔ 비용이 낮음 ✔ 배포가 쉬움
하지만 동시에:
❌ 방어 범위가 제한적 ❌ 의미적으로 동등한 다른 접근 방식으로 쉽게 우회됨
이것이 바로 vm2과 유사한 샌드박스에서 역사적으로 탈출이 반복적으로 발생한 이유입니다.