
Preuve de concept d'exploitation pour CVE-2025-21333, un débordement de tampon basé sur le tas dans vkrnlintvsp.sys de Hyper-V conduisant à une élévation de privilèges locale via I/O Ring et remplacement de jeton.
Débordement de tas (Paged Pool) dans Hyper-V NT Kernel Integration VSP (vkrnlintvsp.sys) → élévation de privilèges locale (LPE).
Ce répertoire contient le code source du PoC de laboratoire (basé sur MrAle98/CVE-2025-21333-POC, incluant des correctifs locaux).
| Élément | Détail |
|---|---|
| CVE | CVE-2025-21333 |
| Type | Heap-based Buffer Overflow |
| Impact | Élévation de privilèges locale (EoP) ; exploitation dans la nature signalée |
| Composant | vkrnlintvsp.sys |
| Fonction vulnérable | VkiRootAdjustSecurityDescriptorForVmwp |
| Pool Tag | ViRo |
| Correctif | 2025-01-14 ; Win11 23H2 requiert ≥ 22631.4751 (KB5050021) |
Dans VkiRootAdjustSecurityDescriptorForVmwp :
WORD : AclSize + sid1 + sid2 + 16AclSize = 0xfff0, la somme vaut 0x10040 → tronquée à 0x40ExAllocatePool2(..., 0x40, 'ViRo')memmove(pool, dacl, AclSize) copie toujours l'intégralité de 0xfff0Inéquation clé : allocatedBytes(0x40) < accessEnd(0xfff0).
Confirmation dynamique sous KD :
ExAllocatePool2 → @rdx = 0x40memmove → @r8 = 0xfff0Nécessite l'activation de Windows Sandbox (et de Nested Virtualization) pour que les syscalls concernés atteignent vkrnlintvsp.sys :
PoC → NtCreateCrossVmEvent
→ VkiRootCalloutCreateEvent
→ VkiRootAdjustSecurityDescriptorForVmwp
| Élément | Valeur |
|---|---|
| OS invité | Windows 11 23H2 |
La 23H2 corrigée (≥ 22631.4751) n'est pas reproductible. Nécessite l'activation de Nested Virtualization + Windows Sandbox.
WNF_STATE_DATAAclSize=0xfff0 via Dual-ACE, déclenche le débordement, agrandit le DataSize du WNF adjacentIrRB (I/O Ring RegBuffers) + NpAt (PipeAttribute)IOP_MC_BUFFER_ENTRY en mode utilisateurPRIV_ESC_OK → shell SYSTEM visible lié à la sessionDisposition attendue : 0x30 IrRB + 0x80 NpAt (nécessite found1=1 && found2=1).
Exigences non négociables par rapport à l'amont :
La disposition du spray de tas est non déterministe : l'élévation de privilèges n'est pas garantie à 100 % ; en cas d'échec, réessayer.
| Build invité | 10.0.22631.3447 (< 4751, reproductible) |
vkrnlintvsp.sys | 10.0.22621.2506 ; SHA256 015DD1211569B6F85CC0041269F249BA5935A3DA89B615B502DF59EAD5354BB8 |
| Sujet | Point clé |
|---|
| Dual-ACE | Un seul ACE AceSize=0xf000 est transformé par SeCapture en environ 0xf008 → aucun débordement ; il faut deux ACE pour préserver le AclSize=0xfff0 côté noyau |
| Code de retour | CrossVm peut retourner STATUS_INVALID_ACL (0xC0000077) ; il faut néanmoins continuer à scanner les WNF |
| Séquencement | free CCC → Submit IoRing → Sleep(5000) → free DDD → pipe spray |
| Sandbox | Tuer WindowsSandboxClient après avoir confirmé IrRB/NpAt |
| RVA de ntos | ExAllocatePool2=0xaac7a0, PsInitialSystemProcess=0xd1da60 (les offsets amont donnent system EPROCESS: 0 sur la build 3447) |
| Shell visible | CreateProcessAsUser + TokenSessionId + winsta0\Default → VISIBLE_SYSTEM_CMD_OK |