FuzzingBrain
Введение
В рамках программы DARPA AI Cyber Challenge (AIxCC) команда исследователей из Texas A&M University, City University of Hong Kong и Imperial College London разработала систему FuzzingBrain — полностью автоматизированную платформу, использующую большие языковые модели (LLM) для поиска и исправления уязвимостей в реальных проектах на C и Java.
Ссылка на хранилище проекта на GitHub
Архитектура FuzzingBrain
Система состоит из четырёх взаимосвязанных компонентов:
- CRS WebService — координирует задания, строит тестовые окружения.
- Static Analysis Service — выполняет статический анализ кода.
- Worker Services — запускают fuzzing и LLM модули для генерации тестов и патчей.
- Submission Service — отправляет результаты и устраняет дубликаты.
Стратегии исследования
Фаззинг
Главная задача фаззинга - подобрать данные для Proofs-of-Vulnerability
Система сочетает в себе два подхода:
- Традиционный фаззинг c использованием libFuzzer
- LLM-подход, в котором модели (GPT-4o, Claude, Gemini и др.) анализируют код, создают тесты, изучают ошибки и итеративно улучшают входные данные.
В общей сложности реализовано 10 стратегий фазинга:
- две разработаны для дельта-сканирования (анализ изменений в конкретном коммите)
- шесть для полного сканирования (анализа всей кодовой базы целиком, без ограничений на конкретный коммит.)
- одна для задач на основе отчетов (анализ внешних отчётов статического анализа в формате SARIF (Static Analysis Results Interchange Format))
- одна для неиспользуемых задач (анализ когда в проекте отсутствует специальная тест-оболочка, через которую передаются входные данные)
Патчинг
После выявления уязвимости система переходит к её исправлению.
Патчи создаются в формате .diff и проходят валидацию по четырём критериям:
- Применимость к коду.
- Успешная компиляция.
- Устранение ошибки (POV больше не воспроизводится).
- Сохранение функциональности.
- patch_delta / patch_full
- LLM получает diff коммита + crash-лог.
- Определяет функции, которые могли вызвать ошибку.
- Генерирует исправленную версию функции и diff-файл.
- Использует итеративную схему с обратной связью (ошибки сборки, POV, тесты).
- patch0_delta / patch0_ful
- Считает, что все функции, изменённые в коммите, потенциально уязвимы.
- Пропускает фазу LLM-анализа для определения цели
- Автоматически применяет патч ко всем изменённым функциям
- patch1_delta / patch1_full
- Комбинирует анализ diff’а и результаты LLM-идентификации функций
- Формирует объединённое множество кандидатов
- patch2_delta / patch2_full
SARIF Анализ
FuzzingBrain рассматривает SARIF-отчёты как дополнительный источник знаний о коде. Для этого реализован SARIF Analysis Service в составе Static Analysis Service.
Весь процесс состоит из пяти этапов:
- Получение SARIF-отчета, содержащего множество записей, из внешнего анализатора (например, CodeQL или другого SAST-инструмента).
- SARIF-парсер извлекает необзодимые данные (имя функции, путь к файлу, строку/позицию, тип CWE, текст описания проблемы, call-trace, если он есть)
- LLM верефицирует запись SARIF и решает, настоящая ли это уязвимость (true positive) или ложная тревога (false positive) путём анализа контекста кода и сообщение анализатора.
- Сохранение подтверждённых (true positive) отчёты в базе и создание задания для следующего этапа (LLM-based POV generation или LLM-based patching)
- Передача контекста в фаззинг / патчинг:
Результат
Всего разработано 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 из рекомендательной системы в кибер-исследовательский комплекс, способный выполнять сложные задачи по анализу программного кода без участия человека.