Фаззинг с libFuzzer
Находите сбои на крайних случаях, тестируя код с помощью libFuzzer.
«Фаззинг с libFuzzer» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Зачем нужен фаззинг
Фаззинг генерирует случайные входные данные для поиска сбоев, зависаний и уязвимостей. Современные фаззеры используют обратную связь по покрытию, чтобы развивать входные данные, исследующие новые пути выполнения кода.
libFuzzer
libFuzzer входит в состав LLVM и интегрируется с санитайзерами. Напишите одну функцию, которая выполняет фаззинг одной точки входа; среда сама управляет генерацией входных данных.
Написание цели фаззинга
Сигнатура фиксирована: принимайте массив байтов и возвращайте 0.
#include <cstdint>
#include <cstddef>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
parse_input(reinterpret_cast<const char*>(data), size);
return 0;
}Компиляция для libFuzzer
Используйте Clang с комбинацией -fsanitize=fuzzer,address. Выполняйте непосредственную компоновку — функция main не нужна.
clang++ -g -O1 -fsanitize=fuzzer,address fuzz.cpp parser.cpp -o fuzz_target
./fuzz_targetМутация под управлением покрытия
libFuzzer отслеживает, какие пути выполнения кода проходит каждый набор входных данных. Он изменяет перспективные входные данные, чтобы исследовать более глубокие пути, — это гораздо эффективнее слепой случайной генерации.
Корпус входных данных
Инициализируйте фаззер каталогом известных интересных входных данных. Фаззер создаёт новые входные данные, изменяя их.
./fuzz_target corpus/Файлы словаря
Предоставьте словарь распространённых токенов, чтобы ускорить исследование структурно корректных входных данных (HTML, JSON, сообщений протокола).
Сочетание с санитайзерами
Запуск под AddressSanitizer превращает незаметные повреждения данных в немедленные сбои, которые может обнаружить фаззер.
Производительность
Одно ядро может выполнять десятки тысяч запусков в секунду на небольших целях. Запускайте фаззер на часы или дни и оставляйте его работать в фоне CI.
Воспроизведение сбоев
Когда libFuzzer обнаруживает сбой, он сохраняет входные данные на диске. Позже воспроизведите их для отладки.
./fuzz_target crash-abc123OSS-Fuzz
Google OSS-Fuzz непрерывно запускает фаззеры для проектов с открытым исходным кодом и сообщает об ошибках. Многие известные библиотеки интегрированы с ним.
AFL и Honggfuzz
Существуют и другие фаззеры:
- AFL/AFL++ — работают на основе процессов и используют ускорение с сервером разветвления
- Honggfuzz — поддерживает сетевые протоколы
libFuzzer проще всего интегрировать с C++.
Когда использовать фаззинг
Используйте фаззинг для любого кода, который обрабатывает ненадёжные входные данные:
- синтаксические анализаторы (JSON, XML, protobuf)
- декодеры (изображения, аудио, видео)
- обработчики сетевых протоколов
- любой код, читающий внешние данные
Быстрая проверка
Почему фаззинг с управлением по покрытию эффективнее полностью случайного фаззинга?
Итоги
libFuzzer — фаззер с управлением по покрытию, интегрированный с Clang. Напишите небольшую точку входа LLVMFuzzerTestOneInput, соберите её с -fsanitize=fuzzer,address и позвольте фаззеру искать сбои. Сочетайте его с санитайзерами и корпусами входных данных; применяйте фаззинг к любому коду, работающему с ненадёжными входными данными.
Часто задаваемые вопросы
Урок «Фаззинг с libFuzzer» бесплатный?
Да — полный текст урока «Фаззинг с libFuzzer» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Фаззинг с libFuzzer»?
Находите сбои на крайних случаях, тестируя код с помощью libFuzzer. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Фаззинг с libFuzzer»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Инструменты статического анализа: clang-tidy, cppcheck
- Санитайзеры: Address, Thread, UB Sanitizer
- Фаззинг с libFuzzer
- Непрерывная интеграция для проектов C++