0Pricing
C++ Academy · Урок

Фаззинг с 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-abc123

OSS-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 — локальная установка не требуется.

Все уроки этого курса

  1. Инструменты статического анализа: clang-tidy, cppcheck
  2. Санитайзеры: Address, Thread, UB Sanitizer
  3. Фаззинг с libFuzzer
  4. Непрерывная интеграция для проектов C++
← Назад к C++ Academy