Blackbox Фаззинг драйверов WindowsРешил заняться этим делом, для этого мне подсказали проект msFuzz (
https://github.com/0dayResearchLab/msFuzz) (практически единственный в своем роде). Развернуть его было не так-то просто. Для начала пришлось найти совместимый Intel процессор, который должен поддерживать технологию Intel PT (хардварная фича для получения трейса CPU). Также пришлось докупить ОЗУ. Следующая сложность была в том, что для msFuzz надо на bare metal ставить специальное ядро ОС (6.0.0-nyx+). У меня на этом ПК крутился Proxmox с виртуалками, пришлось все забэкапить и снести и поставить Ubuntu server 24 и потом поставить кастомное ядро под фаззер. Алгоритм работы фаззера следующий:
1. На Ubuntu-хосте стоит kAFL/msFuzz + QEMU-Nyx + специальное ядро 6.0.0-nyx+.
2. Внутри QEMU поднимается Windows VM с драйвером, который мы хотим фаззить.
3. В VM запускается harness: маленькая программа, которая открывает device path драйвера
4. Harness сообщает kAFL диапазон адресов целевого драйвера, чтобы coverage считался именно по нашему конкретному драйверу.
5. Fuzzer берет seed: структура вида IOIO + IOCTL + in_len + out_len + input_buffer (это под мой кейс).
6. kAFL мутирует эти байты и через shared memory передает payload в VM.
7. Harness делает DeviceIoControl() в драйвер.
8. QEMU-Nyx через KVM/Intel PT смотрит, какие новые basic blocks были достигнуты.
9. Если появился новый coverage path, payload сохраняется в corpus.
10. Если VM/ядро падает, зависает или ловит bugcheck, kAFL кладет вход в crash/timeout/kasan findings.
11. После каждой итерации VM откатывается к snapshot, поэтому тесты быстрые и изолированные.
За счет технологии Intel PT обеспечивается covereged guided fuzzing, в отличии от подхода, когда мы фаззим драйвер через userspace программу и не видим что происходит в ядре. Классический способ фаззинга, когда мы крашим ОС с драйвером и потом читаем дамп - очень медленна. Способ msFuzz кратно быстрее. Происходит это так: загружается винда один раз, kAFL/Nyx делает snapshot, мы делаем fuzz итерацию, а потом очень быстро откатываем VM к snapshot после каждого payload. В моей текущей сессии возврат к снэпшоту происходит 2154 раза в секунду или 129 240 в минуту.
Мое железо:
CPU: Intel Core i7-13620H 10 cores / 16 threads
RAM: DDR5 32 GB 4800