
Proof-of-concept exploit per CVE-2025-21333, un buffer overflow basato su heap in vkrnlintvsp.sys di Hyper-V che porta all'escalation dei privilegi locali tramite I/O Ring e sostituzione del token.
Hyper-V NT Kernel Integration VSP(vkrnlintvsp.sys)Heap overflow in Paged Pool → Local Privilege Escalation (LPE).
Questa directory contiene il codice sorgente PoC per il laboratorio (basato su MrAle98/CVE-2025-21333-POC, con patch locale).
| Voce | Contenuto |
|---|---|
| CVE | CVE-2025-21333 |
| Tipo | Heap-based Buffer Overflow |
| Impatto | Local Privilege Escalation (EoP); marcato come sfruttato in natura |
| Componente | vkrnlintvsp.sys |
| Funzione vulnerabile | VkiRootAdjustSecurityDescriptorForVmwp |
| Pool Tag | ViRo |
| Patch | 2025-01-14; Win11 23H2 richiede ≥ 22631.4751 (KB5050021) |
In VkiRootAdjustSecurityDescriptorForVmwp:
WORD per calcolare la lunghezza di allocazione: AclSize + sid1 + sid2 + 16AclSize = 0xfff0, la somma è 0x10040 → troncata a 0x40ExAllocatePool2(..., 0x40, 'ViRo')memmove(pool, dacl, AclSize) copia ancora l'intero 0xfff0Disuguaglianza chiave: allocatedBytes(0x40) < accessEnd(0xfff0).
Conferma dinamica tramite Kernel Debugger:
ExAllocatePool2 → @rdx = 0x40memmove → @r8 = 0xfff0È necessario abilitare Windows Sandbox (e Nested Virtualization), in modo che le syscall pertinenti entrino in vkrnlintvsp.sys:
PoC → NtCreateCrossVmEvent
→ VkiRootCalloutCreateEvent
→ VkiRootAdjustSecurityDescriptorForVmwp
| Voce | Valore |
|---|---|
| Guest OS | Windows 11 23H2 |
23H2 con patch (≥ 22631.4751) non riproducibile. È necessario abilitare Nested Virtualization + Windows Sandbox.
WNF_STATE_DATAAclSize=0xfff0, attiva overflow, ingrandisce il DataSize di un WNF adiacenteIrRB (I/O Ring RegBuffers) + NpAt (PipeAttribute)IOP_MC_BUFFER_ENTRY in modalità utentePRIV_ESC_OK → shell SYSTEM visibile legata alla sessioneLayout atteso: 0x30 IrRB + 0x80 NpAt (richiede found1=1 && found2=1).
Requisiti essenziali rispetto all'upstream:
Il layout dell'heap spray non è deterministico, l'elevazione non è al 100%; in caso di fallimento riprovare.
| Guest build | 10.0.22631.3447 (< 4751, riproducibile) |
vkrnlintvsp.sys | 10.0.22621.2506; SHA256 015DD1211569B6F85CC0041269F249BA5935A3DA89B615B502DF59EAD5354BB8 |
| Argomento | Punti essenziali |
|---|
| Dual-ACE | Un singolo ACE con AceSize=0xf000 viene modificato da SeCapture a circa 0xf008 → nessun overflow; è necessario un doppio ACE per mantenere AclSize=0xfff0 nel kernel |
| Codice di ritorno | CrossVm può restituire STATUS_INVALID_ACL (0xC0000077), è comunque necessario continuare a scansionare i WNF |
| Tempismo | free CCC → Submit IoRing → Sleep(5000) → free DDD → pipe spray |
| Sandbox | Dopo aver confermato IrRB/NpAt, uccidi WindowsSandboxClient |
| ntos RVA | ExAllocatePool2=0xaac7a0, PsInitialSystemProcess=0xd1da60 (l'offset upstream su 3447 restituisce system EPROCESS: 0) |
| Shell visibile | CreateProcessAsUser + TokenSessionId + winsta0\Default → VISIBLE_SYSTEM_CMD_OK |