
Exploit de prueba de concepto para CVE-2025-21333, un desbordamiento de búfer basado en montículo en vkrnlintvsp.sys de Hyper-V que conduce a la escalada local de privilegios mediante I/O Ring y reemplazo de tokens.
Desbordamiento de montón (Paged Pool) en Hyper-V NT Kernel Integration VSP (vkrnlintvsp.sys) → escalada de privilegios local (LPE).
Este directorio contiene el código fuente del PoC de laboratorio (basado en MrAle98/CVE-2025-21333-POC, con parches locales).
| Campo | Contenido |
|---|---|
| CVE | CVE-2025-21333 |
| Tipo | Desbordamiento de búfer basado en montón |
| Impacto | Escalada de privilegios local (EoP); marcada anteriormente como explotada en la naturaleza |
| Componente | vkrnlintvsp.sys |
| Función vulnerable | VkiRootAdjustSecurityDescriptorForVmwp |
| Pool Tag | ViRo |
| Parche | 2025-01-14; Win11 23H2 requiere ≥ 22631.4751 (KB5050021) |
En VkiRootAdjustSecurityDescriptorForVmwp:
WORD: AclSize + sid1 + sid2 + 16AclSize = 0xfff0, la suma es 0x10040 → se trunca a 0x40ExAllocatePool2(..., 0x40, 'ViRo')memmove(pool, dacl, AclSize) aún copia el 0xfff0 completoDesigualdad clave: allocatedBytes(0x40) < accessEnd(0xfff0).
Confirmación dinámica con KD:
ExAllocatePool2 → @rdx = 0x40memmove → @r8 = 0xfff0Se requiere habilitar Windows Sandbox (y Virtualización Anidada) para que la syscall relevante entre en vkrnlintvsp.sys:
PoC → NtCreateCrossVmEvent
→ VkiRootCalloutCreateEvent
→ VkiRootAdjustSecurityDescriptorForVmwp
| Campo | Valor |
|---|---|
| Guest OS | Windows 11 23H2 |
El 23H2 parcheado (≥ 22631.4751) no es reproducible. Se requiere habilitar Virtualización Anidada + Windows Sandbox.
WNF_STATE_DATAAclSize=0xfff0, se dispara el desbordamiento y se amplía el DataSize del WNF adyacenteIrRB (I/O Ring RegBuffers) + NpAt (PipeAttribute)IOP_MC_BUFFER_ENTRY en modo usuarioPRIV_ESC_OK → shell SYSTEM visible vinculada a la sesiónDisposición esperada: 0x30 IrRB + 0x80 NpAt (requiere found1=1 && found2=1).
Contratos ineludibles respecto al upstream:
La disposición del heap spray no es determinista; la escalada no es 100%. Si falla, se puede reintentar.
| Guest build | 10.0.22631.3447 (< 4751, reproducible) |
vkrnlintvsp.sys | 10.0.22621.2506; SHA256 015DD1211569B6F85CC0041269F249BA5935A3DA89B615B502DF59EAD5354BB8 |
| Tema | Puntos clave |
|---|
| Dual-ACE | Un solo ACE con AceSize=0xf000 es modificado por SeCapture a aproximadamente 0xf008 → sin desbordamiento; es obligatorio usar dos ACE para conservar el AclSize=0xfff0 en el kernel |
| Código de retorno | CrossVm puede devolver STATUS_INVALID_ACL (0xC0000077); aún así se debe continuar escaneando WNF |
| Temporización | free CCC → Submit IoRing → Sleep(5000) → free DDD → pipe spray |
| Sandbox | Matar WindowsSandboxClient después de confirmar IrRB/NpAt |
| ntos RVA | ExAllocatePool2=0xaac7a0, PsInitialSystemProcess=0xd1da60 (con los offsets del upstream en 3447 se obtiene system EPROCESS: 0) |
| Shell visible | CreateProcessAsUser + TokenSessionId + winsta0\Default → VISIBLE_SYSTEM_CMD_OK |