
Prueba de concepto para CVE-2026-13585
El controlador de kernel de ASUS bsitf.sys (también distribuido como AsusBSItf.sys) expone el IOCTL 0x222808 que asigna memoria del kernel físicamente contigua de un tamaño controlado por el atacante, la mapea al espacio de direcciones del proceso llamante con permisos completos de lectura/escritura, y devuelve tanto la dirección virtual en espacio de usuario como la dirección física al llamante.
El dispositivo requiere privilegios de administrador para abrirse, lo que convierte esto en una escalada de administrador a kernel. En un escenario BYOVD (Bring Your Own Vulnerable Driver), un atacante que ya tenga privilegios de administrador (por ejemplo, mediante ingeniería social o un exploit separado) puede cargar este controlador legítimamente firmado para obtener acceso arbitrario a la memoria del kernel sin necesidad de un exploit del kernel.
| Versión | Nombre de archivo | Paquete | Tipo de Pool |
|---|---|---|---|
| 3.0.10.0 | bsitf.sys | ASUS Business Manager / AbmSvcPackage | NonPagedPool (ejecutable) |
| 3.1.10.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | NonPagedPoolNx |
| 3.1.25.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | NonPagedPoolNx |
Todas las versiones crean el dispositivo \Device\bsitf con enlace simbólico \DosDevices\bsitf.
El búfer mapeado es una asignación nueva del pool del kernel, no una dirección arbitraria del kernel. El llamante controla su contenido pero no su ubicación. Esto limita la explotación en comparación con una verdadera R/W arbitraria del kernel.
NonPagedPool, causando BSOD. No se aplica un límite de tamaño o de asignaciones pendientes.NonPagedPool (ejecutable). Se puede escribir shellcode desde modo usuario en el búfer mapeado, pero se requiere una vulnerabilidad separada para redirigir la ejecución del kernel a la dirección del búfer.En las versiones v3.1.x (NonPagedPoolNx), el búfer no es ejecutable y el impacto práctico se limita a DoS y divulgación de dirección física.
El IOCTL 0x222808 en el manejador de envío realiza lo siguiente sin validación de entrada:
alloc_size = *(DWORD *)Irp->AssociatedIrp.SystemBuffer; // user-controlled
kernel_va = MmAllocateContiguousMemory(alloc_size, 0xffffffff);
mdl = IoAllocateMdl(kernel_va, alloc_size, FALSE, FALSE, NULL);
MmBuildMdlForNonPagedPool(mdl);
user_va = MmMapLockedPages(mdl, UserMode);
output[0] = user_va; // usermode virtual address
output[1] = physical_addr; // physical address of allocation
No hay comprobaciones en el tamaño de asignación, el recuento de asignaciones pendientes o la validación de entrada. El dispositivo requiere administrador para abrirse, pero una vez que se adquiere un identificador, los IOCTL no tienen restricciones.
cargo build --release
sc create bsitf binPath= "C:\path\to\bsitf.sys" type= kernel
sc start bsitf
# por defecto: asignación de 0x1000 (4KB)
cargo run --release
# tamaño personalizado (hex)
cargo run --release -- 10000
[*] bsitf.sys kernel memory mapping PoC
[*] target alloc size: 0x1000
[+] device handle acquired
[*] allocating 0x1000 bytes of kernel memory via IOCTL 0x222808
[+] kernel allocation succeeded:
usermode VA: 0x000001D856F90000
physical addr: 0x00000000BF6CB000
[*] original contents (first 16 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[*] writing 0xCC pattern (int3 sled)...
[+] readback: usermode R/W CONFIRMED
[*] freeing kernel mapping via IOCTL 0x22280C
[+] mapping freed successfully
Probado en Windows 11 24H2 (requiere administrador).
NonPagedPoolNx en todas las versiones| Fecha | Evento |
|---|---|
| 2026-04-06 | Vulnerabilidad descubierta mediante análisis automatizado |
| 2026-04-06 | PoC confirmado en Windows 11 24H2 |
| 2026-04-06 | Informe enviado a ASUS PSIRT |
\Device\bsitf, Enlace simbólico: \DosDevices\bsitfFUN_140001070Esta prueba de concepto se proporciona únicamente con fines de investigación de seguridad autorizada y divulgación responsable. No utilice esto contra sistemas que no posea o para los cuales no tenga permiso explícito para probar.