Фаззинг: что стоит за техникой автоматизированного тестирования

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

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

Примечание

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

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

Что такое фаззинг (фазз-тестирование)?

Фаззинг или фазз-тестирование был первоначально разработан компьютерным ученым Бартоном Миллером и представляет собой метод, используемый для систематического тестирования программного обеспечения на наличие уязвимостей. Фаззинг не пытается интерпретировать исходный код программы. Вместо этого он рассматривает программное обеспечение как «черный ящик», а его содержимое — как данность. При фазз-тестировании автоматически вызываются все возможные интерфейсы ввода данных и подаются случайные данные. Этот процесс может занять несколько часов или даже дней, в зависимости от размера тестируемого программного проекта.

Цель fuzz-тестирования — определить, содержит ли программа необходимые реакции для всех возможных вариантов ввода данных. Нелепые или некорректные входные данные должны быть отловлены, если это возможно, с помощью процедур обработки ошибок. Если подпрограммы обработки ошибок не существуют для определенных входов или работают неправильно, программа может аварийно завершиться. Техника тестирования программного обеспечения на все возможные варианты уже давно является неотъемлемой частью среды веб-разработки. Например, кросс-браузерное тестирование уже много лет используется для тестирования веб-приложений на нескольких веб-клиентах или версиях браузеров.

Какие существуют типы фаззинга?

В основном существует три типа фаззинга:

Фаззинг приложений

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

Фаззинг протоколов

Такие протоколы, как протокол передачи гипертекста (HTTP), используются для обмена данными в Интернете. Передаваемые данные должны быть в определенном формате. Фаззинг протокола используется для проверки поведения программного обеспечения при отправке неправильно отформатированного содержимого. Основная цель этого типа фаззинга — убедиться, что отправленный контент не будет случайно интерпретирован как команда и затем выполнен на сервере.

Фаззинг формата файлов

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

Как именно работает фаззинг?

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

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

Области применения фазз-тестирования

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

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

Плюсы и минусы фаззинга с первого взгляда

Преимущества фаззинга Недостатки фаззинга
Позволяет обеспечить единый стандарт качества с помощью подготовленных тестов Тестирование программного обеспечения иногда бывает сложным
Повышает стабильность программного обеспечения Дополнительная работа
Повышает безопасность Не сужает круг причин обнаруженных ошибок
Инструменты бесплатны и хорошо зарекомендовали себя Могут быть использованы разработчиками вредоносного ПО

Лучшие инструменты для фаззинга с первого взгляда

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

  • American Fuzz Lop: Может самостоятельно компилировать исходный код и затем тестировать его, поэтому этот тип программы называют grey-box fuzzzer. Если исходный код недоступен, он эмулируется с помощью QEMU (сокращение от Quick Emulator).
  • Fuzzino: Предоставляет библиотеку для генерации входных данных, которые могут быть использованы для тестирования приложений с помощью моделей протоколов.
  • LibFuzzer: Библиотека, являющаяся частью инфраструктуры компилятора LLVM.
  • ClusterFuzz: Тестовая среда, первоначально разработанная Google для тестирования браузера Chrome.
  • Sulley: Предоставляет набор инструментов на языке сценариев Python; особенно полезен для простых тестовых случаев, таких как генерация случайных данных.
  • Peach: Высокоавтоматизированное решение для фазз-тестирования аппаратного и программного обеспечения.
  • Powerfuzzer: Предоставляет различные сценарии атак, например, SQL-инъекции; имеет графический пользовательский интерфейс на базе веб-интерфейса.
Инструмент для фазз-тестирования Разработчик Лицензия Категория Уникальные возможности
American Fuzz Lop (AFL) Майкл Залевски Открытый исходный код Приложение Grey-box подход
Fuzzino Институт Фраунгофера Открытый источник Протокол Подходит для специальных тестовых случаев
LibFuzzer Команда LLVM Открытый исходный код Приложение Интегрирован в компилятор
ClusterFuzz Google Открытый исходный код Приложение Интегрирует такие инструменты, как AFL
Sulley OpenRCE Открытый источник Протокол Файл, легко интегрируется
Peach Peachtech Коммерческий Приложение Высокоавтоматизированный
Powerfuzzer Марчин Козловски Открытый исходный код Приложение Интегрировано в Kali Linux

Возможные альтернативы fuzz-тестированию

В зависимости от цели применения, существуют альтернативы fuzz-тестированию, которые используют другой подход и дают другие результаты. Ниже мы обобщили наиболее важные из них.

Обратное проектирование

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

Отладка

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

Модульные тесты

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

Резюме

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

Оцените статью
cdelat.ru
Добавить комментарий