
PoC para CVE-2026-13585
O driver de kernel bsitf.sys da ASUS (também distribuído como AsusBSItf.sys) expõe o IOCTL 0x222808 que aloca memória do kernel fisicamente contígua de tamanho controlado pelo atacante, mapeia-a no espaço de endereçamento do processo solicitante com permissões totais de leitura/escrita e retorna tanto o endereço virtual do modo de usuário quanto o endereço físico para o solicitante.
O dispositivo requer privilégios de administrador para ser aberto, tornando isso um escalonamento de admin para kernel. Em um cenário BYOVD (Bring Your Own Vulnerable Driver), um atacante que já possui admin (por exemplo, via engenharia social ou um exploit separado) pode carregar este driver legítimo e assinado para obter acesso arbitrário à memória do kernel sem precisar de um exploit de kernel.
| Versão | Nome do Arquivo | Pacote | Tipo de Pool |
|---|---|---|---|
| 3.0.10.0 | bsitf.sys | ASUS Business Manager / AbmSvcPackage | NonPagedPool (executável) |
| 3.1.10.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | NonPagedPoolNx |
| 3.1.25.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | NonPagedPoolNx |
Todas as versões criam o dispositivo \Device\bsitf com o link simbólico \DosDevices\bsitf.
O buffer mapeado é uma alocação nova do pool do kernel, não um endereço arbitrário do kernel. O solicitante controla seu conteúdo, mas não sua localização. Isso limita a exploração em comparação com um verdadeiro R/W arbitrário do kernel.
NonPagedPool, causando BSOD. Nenhum limite de tamanho ou de alocações pendentes é imposto.NonPagedPool (executável). Shellcode pode ser escrito a partir do modo de usuário no buffer mapeado, mas é necessária uma vulnerabilidade separada para redirecionar a execução do kernel para o endereço do buffer.Nas versões v3.1.x (NonPagedPoolNx), o buffer não é executável e o impacto prático se limita a DoS e divulgação de endereço físico.
O IOCTL 0x222808 no manipulador de despacho realiza o seguinte sem validação de entrada:
alloc_size = *(DWORD *)Irp->AssociatedIrp.SystemBuffer; // controlado pelo usuário
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; // endereço virtual do modo de usuário
output[1] = physical_addr; // endereço físico da alocação
Não há verificações no tamanho da alocação, no número de alocações pendentes ou validação de entrada. O dispositivo requer admin para abrir, mas uma vez que um handle é adquirido, os IOCTLs são irrestritos.
cargo build --release
sc create bsitf binPath= "C:\path\to\bsitf.sys" type= kernel
sc start bsitf
# default: 0x1000 (4KB) allocation
cargo run --release
# custom size (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
Testado no Windows 11 24H2 (requer administrador).
NonPagedPoolNx em todas as versões| Data | Evento |
|---|---|
| 2026-04-06 | Vulnerabilidade descoberta via análise automatizada |
| 2026-04-06 | PoC confirmada no Windows 11 24H2 |
| 2026-04-06 | Relatório enviado ao ASUS PSIRT |
\Device\bsitf, Link simbólico: \DosDevices\bsitfFUN_140001070Esta prova de conceito é fornecida apenas para fins autorizados de pesquisa de segurança e divulgação responsável. Não utilize isto contra sistemas que você não possui ou para os quais não tem permissão explícita para testar.