Что такое fuzzy - тестирование и где его применяют?


Fuzzy-тестирование (или fuzzing, fuzz testing) — это тип тестирования программного обеспечения, при котором в систему намеренно подаются некорректные, случайные, неожиданные или плохо сформированные данные с целью выявления ошибок, сбоев, уязвимостей и нестабильного поведения. Fuzzing активно применяется в тестировании безопасности, надежности и устойчивости программных систем.

🔧 Суть метода

Идея проста: вместо предсказуемых входных данных, как в классических тестах, система «заливается» массой случайных или специально сгенерированных данных, чтобы посмотреть, как она поведёт себя в экстремальных условиях.

Сценарий может быть такой:

  1. Генерация случайных входных данных.

  2. Подстановка этих данных в интерфейс программы (например, через API, CLI, GUI, сеть, файл).

  3. Отслеживание поведения программы: сбой, исключение, зависание, утечка памяти, падение процесса, нарушение логики.

📌 Где применяют fuzzy-тестирование

1. Тестирование безопасности (Security testing)

Наиболее частое применение. Fuzzing помогает находить:

  • уязвимости переполнения буфера (buffer overflow),

  • неправильную обработку форматов данных (XML, JSON),

  • инъекции (SQL, командные),

  • краши при атаке на API или бинарные протоколы,

  • обход авторизации или логики проверки.

Примеры:

  • Fuzzing входов в веб-приложение (URL, формы).

  • Подмена HTTP-заголовков или тел запросов.

  • Сетевая нагрузка на серверы.

2. Тестирование форматов и парсеров

Особенно эффективно при проверке:

  • компиляторов и интерпретаторов (C/C++, JavaScript и т. д.),

  • парсеров бинарных и текстовых протоколов,

  • медиапроигрывателей (форматы MP4, PNG, PDF),

  • браузеров и рендереров.

Пример:
Для PDF-парсера генерируются файлы с некорректной структурой — наблюдают, что будет: падение, утечка, ошибка?

3. Протоколы и сетевые интерфейсы

Применяется к TCP/IP-стекам, Bluetooth-реализациям, WebSocket-обработчикам и т. д.
Цель — найти сбои в обработке нестандартных сетевых пакетов.

4. Системное ПО и драйверы

Fuzz-тестирование на уровне ядра ОС, драйверов устройств и библиотек низкого уровня позволяет найти критические сбои, приводящие к BSOD, kernel panic, и прочим фатальным ошибкам.

5. Web API и REST-сервисы

Fuzzer может отправлять в API запросы с:

  • невалидными схемами JSON/XML,

  • некорректными параметрами,

  • неправильными кодировками и заголовками.

🔍 Что можно найти с помощью fuzzing

  • Переполнения буфера

  • NullPointerException, segmentation fault

  • Утечки памяти (memory leak)

  • Аномалии в логике

  • Краши и зависания

  • Инъекционные уязвимости

  • Некорректная обработка пользовательского ввода

  • Неправильные коды ответов

  • Потеря данных

⚙️ Как работает fuzzer

Fuzzer может быть:

  • Генеративным — создает данные "с нуля" (полностью случайные строки, байты, структуры).

  • Мутационным — берёт валидные данные и мутирует (добавляет шум, меняет поля, байты, последовательности).

  • Осведомлённым (инструментированным) — использует знания о структуре программы, например, через анализ байткода или байндинги (coverage-guided).

🧪 Типы fuzzing

Тип Описание
Black-box Fuzzer ничего не знает о внутреннем устройстве программы. Генерирует случайные данные и просто смотрит на поведение.
--- ---
White-box Fuzzer анализирует исходный код, логику или путь исполнения. Может использовать инструментирование (например, с помощью LLVM, AFL).
--- ---
Grey-box Компромиссный вариант — fuzzer использует частичную информацию о коде (например, трассировку покрытия кода).
--- ---

🛠️ Инструменты для fuzzing

Общие инструменты:

  • AFL (American Fuzzy Lop) – grey-box fuzzer, использует покрытие кода.

  • LibFuzzer – встроенный в Clang fuzzer.

  • Honggfuzz – поддерживает coverage-guided fuzzing и динамический анализ.

  • Boofuzz – Python-библиотека, преемник Sulley, используется для сетевого fuzzing.

  • zzuf – простой инструмент для мутаций входных файлов.

Для веба и API:

  • Burp Suite Intruder – модуль для fuzzing в Burp.

  • Wfuzz, DirBuster, ffuf – для веб-приложений и обнаружения каталогов/векторов атаки.

  • Restler (от Microsoft) – для REST API.

Для безопасности:

  • Peach Fuzzer – коммерческий, мощный фреймворк.

  • FuzzDB – база данных полезных строк для fuzzing.

🧠 Примеры применений в реальных кейсах

  • Google Project Zero использует fuzzing для нахождения 0-day уязвимостей в Chrome, Android, Windows.

  • Microsoft применяет fuzzing в SDL-процессе для всех новых продуктов (Windows, Office).

  • OSS-Fuzz от Google обеспечивает непрерывный fuzzing для open-source проектов (например, SQLite, libpng, cURL).

📉 Ограничения и недостатки

  • Ложноотрицательные: не все баги проявятся, особенно если нет контроля покрытия кода.

  • Трудности интерпретации ошибок: не всегда ясно, является ли ошибка багом или допустимым поведением.

  • Низкая точность без направленного fuzzing: случайные данные могут не достигать критичных участков кода.

  • Сложно тестировать бизнес-логику: fuzzing хорош для структур и входов, но не для сложных сценариев использования.

📌 Где fuzzy неэффективен

  • Когда тесты требуют строгой последовательности действий (например, логика покупки товара).

  • Когда важна семантика, а не структура данных.

  • При проверке юзабилити или визуальных интерфейсов.

Таким образом, fuzzing — это мощная техника автоматизированного тестирования, особенно эффективная в областях, где важна устойчивость к внешнему вводу, безопасность и низкоуровневая стабильность. При правильной настройке может значительно повысить надёжность программного обеспечения и выявить скрытые уязвимости, которые не видны в стандартном тестировании.