
CVE-2025-21333에 대한 개념 증명 익스플로잇으로, Hyper-V의 vkrnlintvsp.sys에서 힙 기반 버퍼 오버플로우가 발생하여 I/O Ring 및 토큰 교체를 통해 로컬 권한 상승으로 이어집니다.
Hyper-V NT Kernel Integration VSP(vkrnlintvsp.sys)Paged Pool 힙 오버플로 → 로컬 권한 상승(LPE)。
본 디렉토리는 lab용 PoC 소스 코드(MrAle98/CVE-2025-21333-POC 기반, 로컬 패치 포함)。
| 항목 | 내용 |
|---|---|
| CVE | CVE-2025-21333 |
| 유형 | Heap-based Buffer Overflow |
| 영향 | 로컬 권한 상승(EoP);야생 이용 표시됨 |
| 구성 요소 | vkrnlintvsp.sys |
| 취약 함수 | VkiRootAdjustSecurityDescriptorForVmwp |
| Pool Tag | ViRo |
| 패치 | 2025-01-14;Win11 23H2는 ≥22631.4751(KB5050021) 필요 |
VkiRootAdjustSecurityDescriptorForVmwp에서:
WORD로 할당 길이 계산:AclSize + sid1 + sid2 + 16AclSize = 0xfff0일 때 합계 0x10040 → 0x40으로 절단ExAllocatePool2(..., 0x40, 'ViRo')memmove(pool, dacl, AclSize)는 여전히 전체 0xfff0 복사핵심 부등식:allocatedBytes(0x40) < accessEnd(0xfff0)。
KD 동적 확인:
ExAllocatePool2 → @rdx = 0x40memmove → @r8 = 0xfff0Windows Sandbox(및 Nested Virtualization)를 활성화해야 관련 syscall이 vkrnlintvsp.sys로 들어감:
PoC → NtCreateCrossVmEvent
→ VkiRootCalloutCreateEvent
→ VkiRootAdjustSecurityDescriptorForVmwp
| 항목 | 값 |
|---|---|
| Guest OS | Windows 11 23H2 |
패치 적용된 23H2(≥ 22631.4751)재현 불가. Nested Virtualization + Windows Sandbox를 활성화해야 함.
WNF_STATE_DATAAclSize=0xfff0 생성, 오버플로 트리거, 인접 WNF DataSize 확장IrRB(I/O Ring RegBuffers)+ NpAt(PipeAttribute)IOP_MC_BUFFER_ENTRYPRIV_ESC_OK → 세션 바인딩에 표시되는 SYSTEM 셸예상 레이아웃:0x30 IrRB + 0x80 NpAt(found1=1 && found2=1 필요)
상위 코드에서 생략할 수 없는 계약:
힙 스프레이 레이아웃은 비결정적이므로 권한 상승이 100% 보장되지 않음. 실패 시 재시도 가능.
| Guest build |
10.0.22631.3447(< 4751, 재현 가능) |
vkrnlintvsp.sys | 10.0.22621.2506;SHA256 015DD1211569B6F85CC0041269F249BA5935A3DA89B615B502DF59EAD5354BB8 |
| 주제 | 포인트 |
|---|
| Dual-ACE | 단일 ACE AceSize=0xf000는 SeCapture에 의해 약 0xf008로 변경됨 → 오버플로우 없음;이중 ACE로 커널 AclSize=0xfff0을 유지해야 함 |
| 반환 코드 | CrossVm이 STATUS_INVALID_ACL (0xC0000077)을 반환할 수 있어도 계속 WNF 스캔 필요 |
| 타이밍 | free CCC → Submit IoRing → Sleep(5000) → free DDD → pipe spray |
| Sandbox | IrRB/NpAt 확인 이후 WindowsSandboxClient 종료 |
| ntos RVA | ExAllocatePool2=0xaac7a0, PsInitialSystemProcess=0xd1da60(3447에서 상위 오프셋은 system EPROCESS: 0을 반환함) |
| 표시 셸 | CreateProcessAsUser + TokenSessionId + winsta0\Default → VISIBLE_SYSTEM_CMD_OK |