Фаззинг (fuzz-тестирование) — автоматизированная методика тестирования, при которой программе подают массу некорректных, неожиданных или случайных входных данных, чтобы найти сбои, ошибки работы с памятью и уязвимости.
Как работает фаззинг
Фаззер многократно генерирует входные данные, запускает с ними целевую программу и следит за падениями, зависаниями и срабатыванием проверок (assertions). Интересные входные данные сохраняются, чтобы разработчики могли воспроизвести ошибку. Идея появилась в 1988 году, когда студенты Бартона Миллера из Висконсинского университета «роняли» множество утилит Unix случайным вводом. Основные подходы:
- На основе мутаций — образцы файлов или сообщений изменяются: инвертируются биты, вставляются байты, склеиваются фрагменты разных входов.
- На основе генерации — входные данные строятся по грамматике или спецификации протокола; это полезно для сложных форматов.
- С обратной связью по покрытию — программа инструментируется, и сохраняются входы, которые открывают новые пути выполнения. Этот подход популяризировали American Fuzzy Lop (AFL, 2013) и libFuzzer из LLVM.
Фаззеры обычно сочетают с санитайзерами, например AddressSanitizer, которые превращают незаметное повреждение памяти в немедленный и понятный сбой.
Почему это важно
Фаззинг — один из самых эффективных способов найти переполнения буфера, ошибки use-after-free и дефекты парсеров в коде на C и C++. Сервис Google OSS-Fuzz, запущенный в 2016 году, непрерывно фаззит сотни проектов с открытым кодом и нашёл многие тысячи ошибок, значительная часть которых — уязвимости. Атакующие и брокеры эксплойтов тоже фаззят популярное ПО, а исследователи используют фаззинг в программах bug bounty, чтобы находить проблемы в браузерах, операционных системах и сетевых протоколах.
Как применяют фаззинг на практике
- Встраивать фазз-цели в CI/CD, чтобы каждое изменение тестировалось непрерывно.
- В первую очередь фаззить код, разбирающий недоверенные данные: форматы файлов, сетевые протоколы, библиотеки изображений и шрифтов.
- Запускать фаззеры с санитайзерами и поддерживать корпус качественных начальных входов.
- Сочетать фаззинг с ревью кода, статическим анализом и языками с безопасной работой с памятью.





