September 28, 2025

FuzzingBrain

Введение

В рамках программы DARPA AI Cyber Challenge (AIxCC) команда исследователей из Texas A&M University, City University of Hong Kong и Imperial College London разработала систему FuzzingBrain — полностью автоматизированную платформу, использующую большие языковые модели (LLM) для поиска и исправления уязвимостей в реальных проектах на C и Java.

Ссылка на хранилище проекта на GitHub

Архитектура FuzzingBrain

Система состоит из четырёх взаимосвязанных компонентов:

  1. CRS WebService — координирует задания, строит тестовые окружения.
  2. Static Analysis Service — выполняет статический анализ кода.
  3. Worker Services — запускают fuzzing и LLM модули для генерации тестов и патчей.
  4. Submission Service — отправляет результаты и устраняет дубликаты.
Архитектура системы

Стратегии исследования

Фаззинг

Главная задача фаззинга - подобрать данные для Proofs-of-Vulnerability

Система сочетает в себе два подхода:

  • Традиционный фаззинг c использованием libFuzzer
  • LLM-подход, в котором модели (GPT-4o, Claude, Gemini и др.) анализируют код, создают тесты, изучают ошибки и итеративно улучшают входные данные.

В общей сложности реализовано 10 стратегий фазинга:

  • две разработаны для дельта-сканирования (анализ изменений в конкретном коммите)
  • шесть для полного сканирования (анализа всей кодовой базы целиком, без ограничений на конкретный коммит.)
  • одна для задач на основе отчетов (анализ внешних отчётов статического анализа в формате SARIF (Static Analysis Results Interchange Format))
  • одна для неиспользуемых задач (анализ когда в проекте отсутствует специальная тест-оболочка, через которую передаются входные данные)

Патчинг

После выявления уязвимости система переходит к её исправлению.
Патчи создаются в формате .diff и проходят валидацию по четырём критериям:

  1. Применимость к коду.
  2. Успешная компиляция.
  3. Устранение ошибки (POV больше не воспроизводится).
  4. Сохранение функциональности.

Подходы для патчинга:

  • patch_delta / patch_full
    • LLM получает diff коммита + crash-лог.
    • Определяет функции, которые могли вызвать ошибку.
    • Генерирует исправленную версию функции и diff-файл.
    • Использует итеративную схему с обратной связью (ошибки сборки, POV, тесты).
  • patch0_delta / patch0_ful
    • Считает, что все функции, изменённые в коммите, потенциально уязвимы.
    • Пропускает фазу LLM-анализа для определения цели
    • Автоматически применяет патч ко всем изменённым функциям
  • patch1_delta / patch1_full
    • Комбинирует анализ diff’а и результаты LLM-идентификации функций
    • Формирует объединённое множество кандидатов
  • patch2_delta / patch2_full
    • Использует динамический анализ потока управления
    • При неудачных патчах собирает данные о выполненных ветвях и передаёт их LLM в следующем промпте
  • patch3_delta / patch3_full
    • Добавляет к стандартному процессу знания из экспертных шаблонов и примеров
    • Использует анализ уязвимости из этапа POV
    • Использует каталог примерных исправлений, отсортированных по типу уязвимости
    • Использует возможность запроса дополнительного контекста
  • XPatch
    • Активируется, если за половину времени задачи POV не найден
    • Патч генерируется без подтверждения ошибки
    • LLM оценивает все функции по шкале 1–10 и выбирает top-k

SARIF Анализ

FuzzingBrain рассматривает SARIF-отчёты как дополнительный источник знаний о коде. Для этого реализован SARIF Analysis Service в составе Static Analysis Service.

Весь процесс состоит из пяти этапов:

  1. Получение SARIF-отчета, содержащего множество записей, из внешнего анализатора (например, CodeQL или другого SAST-инструмента).
  2. SARIF-парсер извлекает необзодимые данные (имя функции, путь к файлу, строку/позицию, тип CWE, текст описания проблемы, call-trace, если он есть)
  3. LLM верефицирует запись SARIF и решает, настоящая ли это уязвимость (true positive) или ложная тревога (false positive) путём анализа контекста кода и сообщение анализатора.
  4. Сохранение подтверждённых (true positive) отчёты в базе и создание задания для следующего этапа (LLM-based POV generation или LLM-based patching)
  5. Передача контекста в фаззинг / патчинг:
    • Для POV LLM получает SARIF-данные как часть промпта, чтобы сфокусироваться на конкретной функции и типе уязвимости.
    • Для патча SARIF помогает LLM выбрать правильную цель и тип исправления.

Результат

Всего разработано 23 стратегии из них 10 для создания POV и 13 для патчинга.

Разработанные стратегии

FuzzingBrain был развёрнут на кластерной инфраструктуре, предоставленной для участников соревнования DARPA AI Cyber Challenge (AIxCC), где у команды было примерно около 100 виртуальных машин. В соревновании команды получали задачи , каждая из которых включала:

  • Исходный код на C/C++ или Java
  • Специальные точки входа для фаззинга
  • Сommit diff для Delta-Scan задач
  • SARIF-отчёты для Report-Based задач.


В результате использования системы обнаружены 28 уязвимостей, включая 6 нулевых дней, и 14 успешно исправленных.

Выводы

FuzzingBrain реализует полный цикл автоматического поиска и исправления уязвимостей, где LLM анализирует причины сбоя, подбирает конкретную уязвимую функцию, создает корректирующий diff, проверяет его на уровне компиляции, безопасности и функциональности.

Вероятнее всего такой подход превращают LLM из рекомендательной системы в кибер-исследовательский комплекс, способный выполнять сложные задачи по анализу программного кода без участия человека.