atesting.ru Блог Руководство по тестированию Fuzz | То, что вы должны знать

Руководство по тестированию Fuzz | То, что вы должны знать

Руководство по тестированию Fuzz | Что Вы должны знать

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

Что такое нечеткое тестирование с примерами?

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

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

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

Фаззинг часто выявляет уязвимости, которые могут быть использованы с помощью SQL-инъекции, переполнения буфера, отказа в обслуживании (DOS) и межсайтовых сценариев. Злоумышленники могут разрушить систему, используя эти уязвимости.

 Руководство по тестированию Fuzz | Что вы должны знать

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

Fuzz-тестирование обычно выполняется автоматически.

Этапы Fuzz-тестирования

Цель этого Fuzz-тестирования — выявить критические ошибки уровня безопасности в программном приложении.

 Руководство по тестированию Fuzz | Что вы должны знать

Определить целевую систему

В данном случае целевая система — это разрабатываемое программное обеспечение или его внешняя зависимость. Целевой компонент обычно может быть достигнут через несколько интерфейсов и протоколов.

Определить входы

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

Генерация нечетких данных

Случайные входные данные, созданные на предыдущем шаге, нечеткие, т.е. вставляются неожиданные недопустимые значения.

Выполнить тест с использованием нечетких данных

Эти нечеткие данные используются в целях тестирования. Приложение выполняется с нечеткими данными в качестве входных значений.

Мониторинг поведения системы

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

Регистрировать дефекты

На этом этапе дефекты регистрируются. Эти проблемы устранены для повышения качества продукта.

Преимущества нечеткого тестирования

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

Зачем мы проводим Fuzz-тестирование?

  • Для выявления серьезных сбоев или дефектов безопасности.
  • < li> Чтобы уберечь приложение от нарушений безопасности.

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

Как выполнять Fuzz-тестирование

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

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

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

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

Давайте рассмотрим пример, HTTP-сервер принимает подписанный BLOB (большой двоичный объект). Объект) данных. В этом большом двоичном объекте у нас есть строка JSON, содержащая значения, которые используются нашим приложением.

В этом примере у нас есть четыре потенциальных уровня для фазирования:

1. HTTP-сообщения для сервера
2. Проверка подписи для нашего большого двоичного объекта
3. Разбор строки JSON
4. Наш код обрабатывает фактические значения

В этом примере мы не нацелены на наши библиотеки HTTP, подписи и JSON.

Мы проводим фаззинг нашего кода для генерации значений, упаковки значений в строку JSON, подпишите большой двоичный объект, создайте сообщение HTTP и отправьте его целевой реализации.

Если у нас нет подходящего пакета автоматизации, нам придется создавать эти кейсы и внедрять в них нечеткие схемы, это может занять много времени. Здесь мы не должны фазировать весь стек, это может привести к постоянным накладным расходам и может сломаться при изменении некоторых слоев.

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

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

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

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

Примеры фаззеров

Фаззеры на основе мутаций:

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

Фаззеры на основе генерации:

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

На основе протокола Фаззеры:

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

Типы ошибок, обнаруженных Fuzz Testing

Fuzz-тестирование традиционно используется для проверки ошибок, связанных с повреждением памяти. В настоящее время в современных приложениях мы фокусируемся не только на ошибках безопасности. Вот некоторые типы ошибок, которые можно обнаружить, комбинируя фаззинг с другими типами тестирования:

Ошибки, связанные с повреждением памяти и безопасностью :

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

Планирование ошибок:

Ошибки, такие как Race Condition, Hang, Livelock, могут быть обнаружены с помощью нечеткого тестирования.

Утверждения:

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

Ошибки производительности:

Продолжительное использование ОС без перезагрузки может повлиять на дисковую операционную систему ОС, что приведет к утечке памяти.

Интернет и Ошибки безопасности мобильного графического интерфейса:

Он также может обнаруживать ошибки, такие как межсайтовый скриптинг (XSS), SQL-инъекция, XPATH-инъекция, PHP-код инъекция и инъекция команд оболочки.

Преимущества Fuzz Testing

  • Повышает безопасность приложения.
  • Помогает выявлять критические нарушения безопасности, включая утечку памяти , необработанное исключение и т. д.
  • Fuzz-тестирование помогает нам убедиться в надежности и безопасности нашего приложения.
  • Нечеткое тестирование выявляет серьезные уязвимости в приложении, которые могут быть легко использованы хакерами.
  • Это помогает выявить проблемы, которые полностью игнорируются командой тестирования.
  • Это дает нам четкую картину общей надежности программного приложения.
  • Тестирование с помощью нечеткого алгоритма может выявить даже логические ошибки, если оно реализовано на уровне приложения.

Недостатки нечеткого тестирования

  • Он не определяет угрозы безопасности, которые не вызывают сбоев программы, такие как некоторые вирусы, черви, трояны и т. Д.
  • Очень сложно установить граничные условия со случайными входными данными.
  • < li> Fuzz-тестирование требует значительного количества времени для правильного выполнения, оно не будет эффективным, если у вас меньше времени.

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

Инструменты тестирования Fuzz

Открытый исходный код

Мутационные фаззеры:

  • американский пушистик
  • Радамса — стая фаззеров
  • APIFuzzer — тест фазз без кодирования
  • Jazzer — фаззинг для JVM

Fuzzing Frameworks

  • Sulley Fuzzing Framework
  • Boofuzz ​​
  • BFuzz

Фаззеры для конкретных доменов

  • Microsoft SDL MiniFuzz File Fuzzer
  • Microsoft SDL Regex Fuzzer
  • ABNF Fuzzer

Коммерческие продукты

  • Пакет продуктов Codenomicon
  • Платформа Peach Fuzzing
  • Продукт Spirent Avalanche NEXT
  • Продукт BeSTORM от Beyond Security
  • Продукт ForAllSecure Mayhem
  • < li> CI Fuz

Заключение

Короче говоря, тестирование фаззинга можно выполнить, вставив неверно сформированный, неожиданный входы в программу, иногда случайные, в надежде вызвать новые или непредвиденные пути кода и ошибки. Фаззинг — старый, но широко используемый метод, так как это очень эффективный метод поиска ошибок. Чтобы получить максимальные результаты, тестирование Fuzz должно быть интегрировано в наш процесс разработки.