В В этой статье в Учебнике по тестированию программного обеспечения мы узнаем, что такое нечеткое тестирование, этапы нечеткого тестирования, как его выполнять и следующее.
Что такое нечеткое тестирование с примерами?
Нечеткое тестирование — это тип тестирования безопасности, который обнаруживает ошибки кода и лазейки в системе безопасности программного обеспечения, операционных систем или сетей.
Нечеткое тестирование тестирование или фаззинг включает в себя ввод огромного количества случайных данных, называемых фаззом, в тестируемое программное обеспечение, чтобы вызвать его сбой или пробить его защиту.
Проще говоря, большое количество неожиданных или случайных входных данных подается в тестируемое программное обеспечение. системы, что может привести к неожиданным результатам.
Фаззинг часто выявляет уязвимости, которые могут быть использованы путем внедрения SQL, переполнения буфера, отказа в обслуживании (DOS) и межсайтового скриптинга. Злоумышленники могут нарушить работу системы, используя эти уязвимости в системе безопасности.
Нечеткое тестирование выполняется с помощью фаззера, это программа, которая автоматически вводит полуслучайные данные в программу и обнаруживает ошибки.
Нечеткое тестирование обычно выполняется автоматически.
Этапы нечеткого тестирования
Целью этого нечеткого тестирования является выявление критических ошибок уровня безопасности в программном приложении.
Определить целевую системусильный>
Здесь целевой системой будет разрабатываемое программное обеспечение или его внешняя зависимость. Целевой компонент обычно может быть доступен через несколько интерфейсов и протоколов.
Идентификация входов
После выбора целевой системы, т. е. интерфейса, через который вставлены входные данные, мы создали входные данные для таких полей. Случайные входные данные создаются для тестирования приложения.
Создать нечеткие данные
Случайные входные данные, созданные на предыдущем шаге, подвергаются фаззингу, т. е. вставляются неожиданные недопустимые значения. >
Эти нечеткие данные используются для целей тестирования. Приложение выполняется с нечеткими данными в качестве входных значений. уязвимости системы безопасности, утечки памяти и сбои после выполнения тестового примера.
Дефекты журнала
На этом этапе регистрируются дефекты. Эти проблемы решаются для повышения качества продукта.
Преимущества Fuzz-тестирования
- Fuzz-тестирование защищает приложение от злонамеренных действий хакеров, выявляя уязвимости в системе безопасности.
- Fuzz-тестирование обычно дополняет другие методы тестирования (например, Black Box Testing), при таких сочетаниях можно выявить больше ошибок.
- Путем фаззинга системы будут срабатывать неожиданные выходные данные, такие выходные данные никогда не планируются разработчиком.
- Фазз-тестирование часто выявляет серьезные дефекты, которые обычно упускаются из виду при разработке программного обеспечения, поэтому оно обеспечивает высокое соотношение выгод и затрат. .
Зачем мы проводим Fuzz-тестирование?
- Чтобы выявить серьезные ошибки или дефекты безопасности.
- Чтобы защитить приложение от нарушений безопасности.
- Чтобы проверить уязвимость программного обеспечения.
- Чтобы обеспечить максимальное покрытие приложения.
- Найти максимальный дефект по низкой цене.
- Для обеспечения надежности системы.
- Для обнаружения ошибок, связанных с памятью, в приложении.
- Для обнаружения состояний гонки и взаимоблокировок в системных потоках.
- Для проверки неопределенного поведения в выходных данных.
- Для управлять утечками памяти в приложении.
- Чтобы понять проблемы, связанные с целостностью потока управления.
Как выполнить Fuzz-тестированиесильный>
Fuzz-тестирование происходит в интерфейсе, который принимает данные. Здесь интерфейс может быть внешней ссылкой, такой как сетевое соединение или файл, или чем-то внутренним, например соглашениями о вызовах функций в служебной библиотеке.
Для выбранного интерфейса вставляются нечеткие данные, чтобы увидеть, как интерфейс обрабатывает эти недопустимые входные данные.
Моделирование угроз и набросок диаграммы потока данных могут помочь нам обнаружить потенциальный интерфейс.
За каждым интерфейсом может скрываться множество уровней программного обеспечения. Крайне важно определить, на какой уровень программного обеспечения мы ориентируемся, чтобы создать ввод, который может пройти все проверки на предыдущих уровнях.
Давайте рассмотрим пример: HTTP-сервер принимает подписанный BLOB (большой двоичный файл). Объект) данных. В этом большом двоичном объекте у нас есть строка JSON, содержащая значения, используемые нашим приложением.
В этом примере у нас есть четыре возможных слоя для фаззинга:
1. HTTP-сообщения для сервера
2. Проверка подписи для большого двоичного объекта данных
3. Анализ строки JSON
4. Наш код обрабатывает фактические значения
В этом примере мы не ориентируемся на наши библиотеки HTTP, подписи и JSON.
Мы фаззим наш код, чтобы сгенерировать значения, упаковать значения в строку JSON, подписать большой двоичный объект, создать HTTP-сообщение и отправьте его в целевую реализацию.
Если у нас нет надлежащего пакета автоматизации, нам придется создавать эти кейсы и внедрять в них фазз, это может занять значительное время. Здесь не следует фаззить весь стек, это может привести к постоянным накладным расходам и может сломаться при изменении некоторых слоев.
Основное внимание уделяется пропускной способности тестовых случаев, и мы также должны учитывать функциональные возможности целевой программы, которые можно отключить или обойти, чтобы уменьшить накладные расходы и увеличить покрытие, достигаемое фаззером.
Глядя на наш пример, мы должны создать программа, которая напрямую передает значения в наш код обработки, минуя сетевое сообщение, пару вычислений хеширования, криптографическую проверку, преобразование JSON в строку и анализ JSON.
Мы должны убедиться, что эти изменения не скроют и не создадут новых ошибок, потому что при оптимизации фаззинга может быть изменено поведение цели.
Эффективный способ начать фаззинг – передавать случайные данные на любой доступный нам интерфейс. find вместо внедрения тысяч тестовых случаев в секунду в оптимизированную среду фаззинга.
Примеры фаззеров
Фаззеры на основе мутаций:
Этот тип фаззера проще всего создать, поскольку он изменяет существующие выборки данных для создания новых тестовых данных. Он подпадает под тупой фаззинг, но его можно использовать с более интеллектуальными фаззерами. Мы можем сделать это, выполнив некоторый уровень синтаксического анализа образцов, чтобы убедиться, что он изменяет только определенные части или не нарушает общую структуру ввода.
На основе генерации Фаззеры:
Этот тип фаззера требует большего интеллекта для создания тестовых данных с нуля, т. е. новые тестовые данные создаются на основе входной модели. Обычно он разбивает протокол или формат файла на фрагменты, которые затем выстраиваются в правильном порядке, и эти фрагменты произвольно фаззятся независимо
Фаззеры на основе протокола:
Это эффективный метод, основанный на знании формата протокола, который разрабатывает и подготавливает новые тестовые данные. Обычно это включает в себя запись спецификации в форме массива в инструмент, а затем на основе спецификации добавление искажений или недостатков во входные данные, шаблон, серию и т. д.
Типы ошибок, обнаруженных с помощью Fuzz-тестирования
Fuzz-тестирование традиционно проводится для проверки ошибок, связанных с повреждением памяти. В настоящее время в современных приложениях мы фокусируемся не только на ошибках безопасности. Вот некоторые типы ошибок, которые можно обнаружить, комбинируя фаззинг с другими типами тестирования:
Ошибки, связанные с повреждением памяти и безопасностью:< /h3>
Могут быть обнаружены критические ошибки безопасности, такие как переполнение буфера в куче, переполнение буфера в стеке, использование после освобождения вместе с неинициализированными переменными и целочисленное переполнение.
Ошибки планирования:
Ошибки типа Race Condition, Hang, Livelock могут быть обнаружены благодаря нечеткому тестированию.
Утверждения:
Некоторые утверждения ошибки могут быть обнаружены в рабочей среде (веб-браузер), обычно они обнаруживаются в отладочной сборке.
Ошибки производительности:
Продолжительное использование ОС без перезагрузки может повлиять на дисковую операционную систему ОС, что приведет к утечке памяти. /strong>
Он также может выявить такие ошибки, как межсайтовый скриптинг (XSS), внедрение SQL, внедрение XPATH, внедрение кода PHP и внедрение команд оболочки.
Преимущества Fuzz-тестирования
- Повышает безопасность приложения
- Это помогает выявлять критические нарушения безопасности, включая утечку памяти, необработанное исключение и т. д.
- Нечеткое тестирование помогает нам убедиться в надежности и безопасности нашего приложения.
- Нечеткое тестирование выявляет серьезные уязвимости в приложении, которые можно легко устранить. используется хакерами.
- Он помогает выявить проблемы, которые полностью игнорируются группой тестирования.
- Он дает нам четкое представление об общей надежности программного приложения.
- Нечеткое тестирование может выявлять даже логические ошибки, если реализовано на уровне приложения.
Недостатки нечеткого тестирования
- Он не выявляет угрозы безопасности, которые не вызывают сбоев программы, такие как некоторые вирусы, черви, троянские программы и т. д.
- Очень сложно установить граничные условия со случайными входными данными.
- Нечеткое тестирование требует значительное количество времени на правильное выполнение, оно не будет эффективным, если у вас меньше времени
- Обычно он выявляет очень простые ошибки, которые могут быть легко обнаружены с помощью тестирования на проникновение.
- Интерпретировать данные нечеткого тестирования может быть сложно.
- Для его эффективного внедрения требуются время, усилия и труд.
- Это трудно анализировать аварийный тестовый пример, и это не дает нам много знаний о том, как программное обеспечение работает внутри
Инструменты Fuzz-тестирования
Открытый исходный код
Мутационные фаззеры:
- Американский нечеткий цикл
- Radamsa — сборище фаззеров
- APIFuzzer — фаззинг-тест без написания кода
- Jazzer — фаззинг для JVM
Fuzzing Frameworks
- Sulley Fuzzing Framework< li>Boofuzz
- BFuzz
Доменные фаззеры
- Майкрософт SDL MiniFuzz File Fuzzer
- Майкрософт SDL Regex Fuzzer
- ABNF Fuzzer
Коммерческие продукты
- Набор продуктов Codenomicon
- Peach Fuzzing Platform
- Spirent Avalanche NEXT
- Продукт beSTORM компании Beyond Security
- Продукт ForAllSecure Mayhem
- CI Fuz
Заключение
Короче говоря, нечеткое тестирование можно сделать, вставив искаженные, неожиданные, иногда случайные входные данные в программу в надежде вызвать новые или непредвиденные пути кода и ошибки. Фаззинг — старая, но широко используемая техника, так как это очень эффективный метод поиска ошибок. Фазз-тестирование должно быть интегрировано в наш процесс разработки, чтобы получить максимальные результаты.
TAG: qa