Логотип
Главная | Статьи | Интеграция машинного обучения в фаззинг: находим баги быстрее
Интеграция машинного обучения в фаззинг: находим баги быстрее

Интеграция машинного обучения в фаззинг: находим баги быстрее

24 сентября, 2025

64

Фаззинг — это наш хлеб с маслом. Мы скармливаем программе тонны мусорных данных и ждём, когда она упадёт. Классика, как AFL или libFuzzer, работает, но часто вслепую, как пьяный сапёр на минном поле. Пришло время прокачать этот процесс и добавить ему мозгов с помощью машинного обучения (ML).

Почему классический фаззинг заходит в тупик?
Стандартный фаззер, даже с учётом покрытия кода, — это по большей части генератор случайных чисел. Он бездумно переворачивает биты, меняет байты и склеивает куски данных. Это эффективно для простых форматов, но когда дело доходит до сложной логики, фаззер начинает буксовать.
• Магические числа и чек-суммы: Если программа в начале файла ожидает конкретную сигнатуру (например, PK для ZIP-архива) или проверяет контрольную сумму, случайные мутации почти никогда не пройдут эту проверку. Фаззер будет топтаться на месте, не в силах проникнуть глубже.
• Сложные форматы: Попробуйте натравить стандартный фаззер на парсер JavaScript или XML. Он сгенерирует синтаксически некорректный бред, который будет отбраковываться на самых ранних стадиях, не доходя до интересного кода.
• Состояние программы: Для некоторых багов нужно выполнить сложную последовательность действий. Случайные мутации редко создают такие цепочки.
ML решает эти проблемы, превращая фаззер из генератора шума в интеллектуального охотника за багами.

Как машинное обучение делает фаззинг умнее
Идея проста: вместо того чтобы мутировать данные вслепую, мы используем ML-модель, которая учится на ходу. Она анализирует, какие изменения в данных приводят к открытию нового кода, и начинает генерировать более “осмысленные” входные данные.

Генерация структурированных данных
Забудьте о случайном перевороте битов. Мы можем обучить нейронную сеть (например, рекуррентную (RNN) или генеративно-состязательную (GAN)) на наборе валидных файлов. Модель изучит их структуру — заголовки, чанки, синтаксис — и начнёт генерировать новые, синтаксически корректные, но неожиданные для программы входные данные.
Представьте, что мы фаззим парсер JSON. Вместо мусора типа {"key":val%&ue} модель сгенерирует что-то вроде {"key": {}, {}, 1e1000} — синтаксически верный, но потенциально опасный ввод.

Предсказание “перспективных” мутаций
Это самое мясо. Здесь часто используют обучение с подкреплением (Reinforcement Learning).
1. Агент: Наш фаззер.
2. Среда: Целевая программа.
3. Действие: Применение определённой мутации к входным данным.
4. Награда: Обнаружение нового пути выполнения кода (увеличение покрытия) или, что ещё лучше, — крэш.

Модель учится предсказывать, какие участки входного файла и какие типы мутаций с наибольшей вероятностью принесут “награду”. Она видит, что изменение байтов с 12-го по 16-й в PNG-файле часто открывает новые ветки кода в libpng, и начинает целенаправленно работать с этой областью. Это больше не случайность, а выверенная стратегия.

Проект NEUZZ — отличный тому пример. Он использует нейросеть для выявления “узких мест” в бинарнике — тех самых проверок, которые сложно пройти. Затем он целенаправленно генерирует данные для преодоления этих барьеров.

Практический пример: интеграция с AFL++
Современные фаззеры, вроде AFL++, уже имеют встроенные механизмы для интеграции кастомных мутаторов, в том числе на основе ML. Вы можете написать свой мутатор на Python с использованием TensorFlow или PyTorch и подключить его к AFL++.
Вот упрощённый концептуальный код такого мутатора:

Этот код — лишь верхушка айсберга, но он показывает принцип: мы перехватываем данные у фаззера, применяем к ним свою ML-логику и возвращаем результат. AFL++ делает остальную грязную работу.

Что в итоге?
Интеграция ML в фаззинг — это не панацея, но мощный апгрейд.
• Скорость: Вы находите баги в сложных парсерах и протоколах на порядки быстрее.
• Глубина: Фаззер проникает в такие дебри кода, куда случайные мутации не доберутся и за миллион лет.
• Эффективность: Меньше времени тратится на бессмысленные итерации, больше — на исследование перспективных направлений.

Классический фаззинг никуда не денется, но будущее за умными, гибридными системами. Перестаньте бросать спагетти в стену — возьмите в руки скальпель.