Фа́ззинг () — техника тестирования программного обеспечения, часто автоматическая или полуавтоматическая, заключающаяся в передаче приложению на вход неправильных, неожиданных или случайных данных. Предметом интереса являются падения и зависания, нарушения внутренней логики и проверок в коде приложения, утечки памяти, вызванные такими данными на входе. Фаззинг является разновидностью выборочного тестирования (), часто используемого для проверки проблем безопасности в программном обеспечении и компьютерных системах.

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

История 
Случайные данные применялись при тестировании приложений и раньше. К примеру, приложение «Обезьяна» () под Mac OS, созданное Стивом Капсом ещё в 1983 году, генерировала случайные события, которые направлялись на вход тестируемым программам для поиска багов. Оно использовалось, в частности, при тестировании .

Термин «fuzz» появился в 1988 году на семинаре Бартона Миллера в Университете Висконсина, во время которого была создана простая программа fuzzer, предназначенная для командной строки, с целью тестирования надежности приложений под Unix. Она генерировала случайные данные, которые передавались как параметры для других программ до тех пор, пока они не останавливались с ошибкой. Это стало не только первым в истории тестированием с использованием случайных неструктурированных данных, но и первым специализированным приложением для тестирования широкого круга программ под разнообразные операционные системы, и с систематическим анализом типов ошибок, возникающих при таком тестировании. Создатели проекта открыли исходные коды своего приложения, а также публичный доступ к процедурам тестирования и сырым результатам. Тест был повторен в 1995 году — приложение доработали для тестирования приложений с GUI, сетевых протоколов и системных библиотек под MacOS и Windows.

Стоит отметить, что схожие техники тестирования существовали задолго до появления термина и формализации процедуры. Так, известно, что Джерри Вейнберг использовал набор карт со случайными числами, чтобы передавать их на вход программ ещё в 1950-х годах.

В 1991 году было выпущено приложение crashme, созданное для тестирования надежности операционных систем путем исполнения случайного набора процессорных инструкций.

В настоящее время фаззинг является составной частью большинства проверок безопасности и надёжности программного обеспечения и компьютерных систем.

См. также 
 Переполнение буфера
 Код ошибки
 Обратная разработка
 Утечка динамической памяти
 Динамический анализ кода
 Статический анализ кода
 Синий экран смерти (BSoD)
 Control-flow integrity

Примечания

Ссылки 
 University of Wisconsin Fuzz Testing (the original fuzz project) Source of papers and fuzz software.
 Look out! It's the Fuzz! (IATAC IAnewsletter 10-1)
 Designing Inputs That Make Software Fail, conference video including fuzzy testing
 Link to the Oulu (Finland) University Secure Programming Group 
 Building 'Protocol Aware' Fuzzing Frameworks
 Video training series about Fuzzing, Fuzz testing, and unknown vulnerability management

Тестирование программного обеспечения
Информационная безопасность