
PoC per CVE-2026-13585
Il driver del kernel ASUS bsitf.sys (distribuito anche come AsusBSItf.sys) espone l'IOCTL 0x222808 che alloca memoria del kernel fisicamente contigua di dimensione controllata dall'attaccante, la mappa nello spazio di indirizzi del processo chiamante con permessi di lettura/scrittura completi e restituisce sia l'indirizzo virtuale in spazio utente che l'indirizzo fisico al chiamante.
Il dispositivo richiede privilegi di amministratore per essere aperto, rendendo questa una escalation da amministratore a kernel. In uno scenario BYOVD (Bring Your Own Vulnerable Driver), un attaccante che ha già privilegi di amministratore (ad esempio tramite ingegneria sociale o un exploit separato) può caricare questo driver firmato legittimamente per ottenere accesso arbitrario alla memoria del kernel senza bisogno di un exploit del kernel.
| Versione | Nome file | Pacchetto | Tipo di pool |
|---|---|---|---|
| 3.0.10.0 | bsitf.sys | ASUS Business Manager / AbmSvcPackage | NonPagedPool (eseguibile) |
| 3.1.10.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | NonPagedPoolNx |
| 3.1.25.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | NonPagedPoolNx |
Tutte le versioni creano il dispositivo \Device\bsitf con symlink \DosDevices\bsitf.
Il buffer mappato è una nuova allocazione del pool del kernel, non un indirizzo arbitrario del kernel. Il chiamante controlla il suo contenuto ma non la sua posizione. Questo limita lo sfruttamento rispetto a una vera lettura/scrittura arbitraria del kernel.
NonPagedPool, causando BSOD. Non viene imposto alcun limite di dimensione o di numero di allocazioni.NonPagedPool (eseguibile). Lo shellcode può essere scritto dallo spazio utente nel buffer mappato, ma è necessaria una vulnerabilità separata per reindirizzare l'esecuzione del kernel all'indirizzo del buffer.Sulle versioni v3.1.x (NonPagedPoolNx), il buffer non è eseguibile e l'impatto pratico è limitato a DoS e divulgazione dell'indirizzo fisico.
L'IOCTL 0x222808 nel gestore di spedizione esegue le seguenti operazioni senza alcuna validazione dell'input:
alloc_size = *(DWORD *)Irp->AssociatedIrp.SystemBuffer; // controllato dall'utente
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; // indirizzo virtuale in spazio utente
output[1] = physical_addr; // indirizzo fisico dell'allocazione
Nessun controllo sulla dimensione dell'allocazione, sul numero di allocazioni in sospeso o sulla validazione dell'input. Il dispositivo richiede privilegi di amministratore per essere aperto, ma una volta ottenuto un handle, gli IOCTL sono senza restrizioni.
cargo build --release
sc create bsitf binPath= "C:\path\to\bsitf.sys" type= kernel
sc start bsitf
# default: allocazione di 0x1000 (4KB)
cargo run --release
# dimensione personalizzata (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
Testato su Windows 11 24H2 (richiede privilegi di amministratore).
NonPagedPoolNx su tutte le versioni.| Data | Evento |
|---|---|
| 2026-04-06 | Vulnerabilità scoperta tramite analisi automatica |
| 2026-04-06 | PoC confermato su Windows 11 24H2 |
| 2026-04-06 | Report inviato ad ASUS PSIRT |
\Device\bsitf, Symlink: \DosDevices\bsitfFUN_140001070Questa prova di concetto è fornita esclusivamente per scopi di ricerca di sicurezza autorizzata e divulgazione responsabile. Non utilizzarlo contro sistemi di cui non si possiede la proprietà o per i quali non si ha esplicito permesso di test.