Блог

Незаменимый фаззинг

Фаззинг – это неотъемлемая часть цикла безопасной разработки. Это процедура подачи большого количества, порядка миллиарда, образцов входных данных программному коду, выполняющему их обработку. При этом для каждого образца входных данных выполняется отдельный запуск кода и верификация его корректной работы.

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

[...]

Процедура фаззинг-тестирования направлена на две цели:

  • формирование набора образцов входных данных, приводящего к выполнению наибольшего количества фрагментов кода (достижение большого покрытия по строкам кода);
  • мутирование входных данных так, чтобы они не соответствовали ограничениям и, гипотетически, могли бы приводить к недекларированному поведению и проверка корректности функционирования при их обработке.

[...]

Три ящика

Выделяются три метода фаззинг-тестирования: белый ящик, черный ящик и серый ящик. Они отличаются доступными ресурсами тестируемого объекта.

[...]

Фаззинг на уровне кода подходит для проверки различных парсеров, санитайзеров, валидаторов на предмет их корректности. Также он позволяет найти такие ошибки, как:

  • попадание в некорректные условия;
  • бесконечные циклы;
  • обход регулярных выражений;
  • обход корректности валидированных значений;
  • переполнение буфера.

Кроме того, фаззеры разделают по цели, например, source-based, когда есть исходники проекта или binary-based, когда нет исходников проекта. Еще фаззинг можно разделить на два виду по наличию обратной реакции от тестируемого приложения – есть обратная реакция (feedback driven) или ее нет (not feedback driven). Ну и по операциям над входными данными. Генерационные, мутационные и комбинированные.

[...]

В каких случаях фаззинг не эффективен

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

Фаззинг может оказаться неэффективным или неприменимым в следующих случаях:

  • если программа не имеет входных данных или не может быть запущена без особых условий;
  • если программа работает с данными, которые нельзя изменить (например, защищенные файлы или данные, хранящиеся в зашифрованном виде);
  • если программа слишком сложная и имеет много возможных комбинаций входных данных, что делает фаззинг неэффективным и неоправданным по времени и ресурсам;
  • если команда разработки не обладает достаточными знаниями и навыками для проведения фаззинга или не может исправить обнаруженные ошибки и уязвимости.

Денис Исангулов, руководитель отдела тестирования NGR Softlab:

Не существует одного лучшего метода фаззинга, так как каждый подход имеет свои преимущества в зависимости от того, что нужно проверить в программе. Некоторые методы могут быть быстрыми (случайный и символьный фаззинг), но не обнаруживать сложные ошибки, в то время как другие – гибридный и мутационный фаззинг – могут быть более эффективными в обнаружении разных типов ошибок.

Использование только фаззинг-тестирования может привести к пропуску реальных ошибок или ложным срабатываниям. Нет универсального метода. Каждый подход имеет свои преимущества в зависимости от конкретных целей тестирования программы.

Вывод

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

Эксперты уверены в том, что главные правила эффективного фаззинга – это непрерывность, корректно задаче подобранный метод фаззинга и комбинирование с другими видами тестирования.

Подробнее на сайте издания по ссылке.