
Exploit de prova de conceito para CVE-2025-21333, um estouro de buffer baseado em heap no vkrnlintvsp.sys do Hyper-V levando à escalada de privilégio local via I/O Ring e substituição de token.
Hyper-V NT Kernel Integration VSP(vkrnlintvsp.sys)estouro de heap no pool paginado → elevação de privilégio local (LPE).
Este diretório contém o código-fonte do PoC para laboratório (baseado em MrAle98/CVE-2025-21333-POC, incluindo patch local).
| Item | Conteúdo |
|---|---|
| CVE | CVE-2025-21333 |
| Tipo | Heap-based Buffer Overflow |
| Impacto | Elevação de Privilégio Local (EoP); marcado como explorado na natureza |
| Componente | vkrnlintvsp.sys |
| Função Vulnerável | VkiRootAdjustSecurityDescriptorForVmwp |
| Pool Tag | ViRo |
| Patch | 2025-01-14; Win11 23H2 requer ≥ 22631.4751 (KB5050021) |
Em VkiRootAdjustSecurityDescriptorForVmwp:
WORD para calcular o tamanho da alocação: AclSize + sid1 + sid2 + 16AclSize = 0xfff0, a soma é 0x10040 → truncado para 0x40ExAllocatePool2(..., 0x40, 'ViRo')memmove(pool, dacl, AclSize) ainda copia o 0xfff0 completoDesigualdade central: allocatedBytes(0x40) < accessEnd(0xfff0).
Confirmação dinâmica via KD:
ExAllocatePool2 → @rdx = 0x40memmove → @r8 = 0xfff0Requer ativação do Windows Sandbox (e Virtualização Aninhada), para que a syscall relacionada entre em vkrnlintvsp.sys:
PoC → NtCreateCrossVmEvent
→ VkiRootCalloutCreateEvent
→ VkiRootAdjustSecurityDescriptorForVmwp
| Item | Valor |
|---|---|
| Guest OS | Windows 11 23H2 |
23H2 com patch (≥ 22631.4751) não é reproduzível. Requer ativação de Virtualização Aninhada + Windows Sandbox.
WNF_STATE_DATAAclSize=0xfff0, aciona overflow, amplia DataSize do WNF adjacenteIrRB (I/O Ring RegBuffers) + NpAt (PipeAttribute)IOP_MC_BUFFER_ENTRY falsa em modo de usuárioPRIV_ESC_OK → shell SYSTEM visível vinculado à sessãoLayout esperado: 0x30 IrRB + 0x80 NpAt (requer found1=1 && found2=1).
Contratos não omitíveis em relação ao upstream:
O layout do heap pulverizado é não determinístico, a elevação de privilégio não é 100%; pode-se tentar novamente em caso de falha.
| Guest build | 10.0.22631.3447 (< 4751, reproduzível) |
vkrnlintvsp.sys | 10.0.22621.2506; SHA256 015DD1211569B6F85CC0041269F249BA5935A3DA89B615B502DF59EAD5354BB8 |
| Tópico | Pontos |
|---|
| Dual-ACE | Um único ACE com AceSize=0xf000 será modificado por SeCapture para cerca de 0xf008 → sem overflow; são necessários dois ACEs para preservar o AclSize=0xfff0 do kernel |
| Código de Retorno | CrossVm pode retornar STATUS_INVALID_ACL (0xC0000077), ainda é necessário continuar varrendo WNF |
| Temporização | free CCC → Submit IoRing → Sleep(5000) → free DDD → pipe spray |
| Sandbox | Matar WindowsSandboxClient após confirmar IrRB/NpAt |
| ntos RVA | ExAllocatePool2=0xaac7a0, PsInitialSystemProcess=0xd1da60 (o deslocamento upstream em 3447 resultaria em system EPROCESS: 0) |
| Shell Visível | CreateProcessAsUser + TokenSessionId + winsta0\Default → VISIBLE_SYSTEM_CMD_OK |