Что такое фаззинг тестирование

Фаззинг — важный этап безопасной разработки

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

И это при том, что в мире разработки достаточно давно появились такие понятия, как Security Development Life Cycle (SDLC), и сравнительно недавно такие, как DevSecOps или SecDevOps, но используются эти техники далеко не всеми. Суть у них одна — внедрять подходы к повышению безопасности с первых этапов разработки, а лучше начинать с обучения сотрудников. И, конечно, важно уделять внимание защищенности продукта от атак на протяжении всего его жизненного цикла. За подробностями — добро пожаловать под кат.

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

Как раз во время написания статьи в ленте твиттера мелькнули заметки на тему использования фаззинга от Дмитрия Вьюкова.

Axiom 1. Untested code contains bugs.

Corollary 1. If only few basic scenarios are tested, that’s all that works.

Corollary 2. Fuzzing/sanitizing always finds bugs.

Corollary 3. If absence of bugs wasn’t proactively ensured, there are bugs.#winrar

Axiom 2. Bugs don’t die of old age.

Corollary 4. Waiting is not a strategy.

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

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

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

Одним из нашумевших случаев, когда фаззинг сделал своё доброе дело, можно назвать обнаружение пятидесяти CVE в Adobe Reader за 50 дней. Исследователи смогли найти такое количество уязвимостей, не имея доступа к исходному коду, и трудно предположить, сколько их обнаружилось бы, будь у них исходники.

Если поискать в открытых источниках информацию на тему использования фаззинга среди разработчиков, то первым попадется Microsoft. Эта компания — одна из пионеров фаззинга в SDLC. У них есть Security Risk Detection — сервис, позволяющий пользователям загружать бинарные файлы для их фаззинга. То, какие данные будут подаваться на вход, решает пользователь. Итогом работы фаззера являются найденные ошибки и данные, которые их породили.

Google тоже использует фаззинг, и у них есть очень много инструментов в открытом доступе. Наиболее интересный из них — OSS-Fuzz. Его суть в том, что любой человек может сделать пулл реквест со своим фаззером. Обычно это фаззеры, когда-то созданные разработчиками для своих небольших проектов. Помимо этих фаззеров, Google использует ClusterFuzz для обнаружения ошибок в Chrome. За несколько лет было обнаружено более 16 тысяч уязвимостей в браузере и более 11 тысяч в 160 опенсурсных проектах.

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

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

Вопросы мы задали следующие:

Используете ли вы fuzzing в процессе разработки своих продуктов?

На этот вопрос положительно ответила треть респондентов.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Если не используете, то почему? Или что, на ваш взгляд, обычно останавливает от включения этапа fuzzing в процесс разработки продукта?

Возможные варианты ответа:

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

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

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

Некоторые из опрошенных, выбравшие вариант ответа «Другое», дали интересные развернутые ответы. Вот некоторые из причин отказа от фаззинга:

Среди ответов были и уточнения о том, что используются AFL-фаззеры и libfuzzer-ы, что не может не радовать.

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

Источник

Автоматическое тестирование программ

Введение

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

Динамический vs Статический анализ

Применение

Автоматическое тестирование в первую очередь предназначено для программ, для которых работоспособность и безопасность при любых входных данных являются наиважнейшими приоритетами: веб-сервер, клиент/сервер SSH, sandboxing, сетевые протоколы.

Fuzz testing (фаззинг)

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

Фаззеры нового поколения (обзор)

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

Отслеживание помеченных данных в программе

Вводится понятие символических или помеченных (tainted) данных – данных, полученных программой из внешнего источника (стандартный поток ввода, файлы, переменные окружения и т. д.). Распространенным решением этой задачи является перехват набора системных вызовов: open, close, read, write, lseek (Avalanche,KLEE).

Инструментация кода

Код исследуемой программы приводится к виду, удобному для анализа. Например, используется внутреннее независимое от аппаратной платформы представление valgrind (Avalanche) или анализируется удобный для разбора сам по себе llvm-байткод программы(KLEE).

Инструментированный код позволяет легко находить потенциально опасные инструкции (например, деление на ноль или разыменование нулевого указателя) и их операнды, а также инструкции ветвления, зависящие от помеченных данных. Анализируя инструкции, инструмент составляет логические условия на помеченные данные и передает запрос на выполнимость “решателю” булевских формул (SAT Solver).

Решение булевских ограничений

SAT Solvers – решают задачи выполнимости булевых формул. Отвечают на вопрос: всегда ли выполнена заданная формула, и если не всегда, то выдается набор значений, на котором она ложна. Результаты работы подобных решателей используется широким набором анализирующих программ, от theorem provers до анализаторов генетического кода в биоинформатике. Подобные программы интересны сами по себе и требуют отдельного рассмотрения. Примеры: STP, MiniSAT.

Моделирование окружения
Перебор путей в программе

O(2^n), где n – количество условных переходов, зависящих от входных данных), но все еще остается значительной. Анализаторы вынуждены использовать различные эвристики для приоритезации анализа некоторых путей. В частности, различают выбор пути, покрывающего наибольшее количество непокрытых (новых) базовых блоков (Avalanche, KLEE) и выбор случайного пути (KLEE).

Avalanche

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

Общая схема работы

Инструмент Avalanche состоит из 4 основных компонент: двух модулей расширения (плагинов) Valgrind – Tracegrind и Covgrind, инструмента проверки выполнимости ограничений STP и управляющего модуля.

Ограничения
Результаты

unsigned mod_opt ( unsigned x, unsigned y ) <
if ( ( y & −y ) == y ) // power of two?
return x & ( y− 1 ) ;
else
return x % y ;
>
unsigned mod ( unsigned x, unsigned y ) <
return x % y ;
>
int main ( ) <
unsigned x,y ;
make symbolic ( & x, sizeof ( x ) ) ;
make symbolic ( & y, sizeof ( y ) ) ;
assert ( mod ( x,y ) == mod_opt ( x,y ) ) ;
return 0 ;
>

Запустив KLEE на данном примере, можно убедится в эквивалентности двух функций во всем диапазоне входных значений (y!=0). Решая задачу на невыполнение условия в ассерте, KLEE на основе перебора всех возможных путей приходит к выводу об эквивалентности двух функций на всем диапазоне значений.

Результаты

Для получения реальных результатов тестирования авторы проанализировали весь набор программ пакета coreutils 6.11. Средней процент покрытия кода составил 94%. Всего программа сгенерировала 3321 набор входных данных, позволяющих покрыть весь указанный процент кода. Так же было найдено 10 уникальных ошибок, которые были признаны разработчиками пакета как реальные дефекты в программах, что является очень хорошим достижением, так как этот набор программ разрабатывается более 20 лет и большинство ошибок было устранено.

Ограничения

Предварительные выводы

Безусловно, динамический анализ найдет свою нишу среди инструментов помогающих отдельным программистам и командам программистов решать поставленную задачу, т.к. является эффективным способом нахождения ошибок в программах, а так же доказательством их отсутствия! В в некоторых случаях подобные инструменты просто жизненно необходимы (Mission critical software: RTOS, системы управления производством, авиационное программное обеспечение и так далее).

Источник

Фаззинг тестирование веб-интерфейса. Расшифровка доклада

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

В начале этого года Тензор проводил митап в городе Иваново, на котором я выступил с докладом про эксперименты с фаззинг-тестированием интерфейса. Тут расшифровка этого доклада.

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

Всем привет! Меня зовут Докучаев Сергей. Последние 7 лет я занимаюсь тестированием во всех его проявлениях в компании Тензор.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

У нас более 400 человек отвечают за качество выпускаемых продуктов. 60 из них занимаются автоматизацией, тестированием безопасности и производительности. Для того, чтобы поддерживать десятки тысяч E2E тестов, контролировать показатели производительности сотен страниц и выявлять уязвимости в промышленном масштабе — нужно применять инструменты и методы, проверенные временем и ни раз испытанные в бою.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

В фильме «Матрица» в одной из сцен Морфеус предлагает Нео выбрать красную или синюю таблетку. Томас Андерсон работал программистом и мы помним какой выбор он сделал. Будь он отъявленным тестировщиком — слопал бы обе таблетки, чтобы посмотреть, как система поведёт себя в нестандартных условиях.

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

Однако, в создании и поддержке автотестов внезапно не так много авто- и довольно много ручной работы:

К счастью, в мире тестирования существует ни две и не три таблетки. А целая россыпь: манки-тестирование, формальные методы, фаззинг-тестирование, решения на основе AI. И ещё больше их комбинаций.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Допустим сделали мы такой TODO и хотим его проверить. Берём подходящий сервис или инструмент и видим обезьянок в действии:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

По такому же принципу мой кот как-то, полежав на клавиатуре, безвозвратно сломал презентацию и её пришлось делать заново:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Удобно, когда после 10 действий приложение выбрасывает исключение. Тут наша обезьянка сразу понимает, что произошла ошибка, а мы по логам можем понять хотя бы приблизительно, как она повторяется. А что если ошибка произошла после 100К случайных кликов и выглядит как валидный ответ? Единственным значимым плюсом этого подхода является максимальная простота — ткнул кнопку и готово.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Противоположностью такого подхода являются формальные методы.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Это фотография Нью-Йорка в 2003 году. Одно из самых ярких и многолюдных мест на планете, Таймс-сквер, освещают только фары, проезжающих мимо машин. В тот год миллионы жителей Канады и США на три дня оказались в каменном веке из-за каскадного отключения электростанций. Одной из ключевых причин произошедшего оказалась race condition ошибка в ПО.

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

На слайде часть модели алгоритма двух рукопожатий, написанной на языке TLA+. Думаю для всех очевидно, что использование этих инструментов при проверке формочек на сайте сравни постройке Боинга 787 для проверки аэродинамических свойств кукурузника.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

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

Фаззинг тестирование сейчас чаще всего рассматривается в контексте тестирования безопасности. И типовую схему, демонстрирующую такой подход, возьмём из OWASP гайда:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Тут у нас есть сайт, который требуется протестировать, есть БД с тестовыми данными и инструменты, при помощи которых будем отправлять указанные данные на сайт. Вектора представляют из себя обычные строки, которые были получены опытным путём. Такие строки с наибольшей вероятностью могут привести к обнаружению уязвимости. Это как та кавычка, которую многие на автомате ставят на место числа в URL из адресной строки.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Пользователь вводит новую дату и нажимает кнопку “Сохранить”. На сервер улетает запрос, с данными в json формате.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

И если всё хорошо, то сервис отвечает двухсотым кодом.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

С json’ами удобно работать программно и мы можем научить наш инструмент для фаззинга находить и определять даты в передаваемых данных. И он начнёт подставлять различные значения вместо них, например будет передавать несуществующий месяц.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

И если мы в ответ вместо сообщения о невалидной дате получили исключение, то фиксируем ошибку.

Фаззить API несложная задача. Вот у нас передаваемые параметры в json’е, вот мы отправляем запрос, получаем ответ и анализируем его. А как быть с GUI?

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

С каждым из контролов мы можем сделать не так-то и много. У нас есть мышка с двумя кнопками, колёсиком и клавиатура. Можно кликать по элементу, наводить на него курсор мыши, в текстовые поля можно вводить текст.

Если мы введём в текстовое поле какой-то текст и нажмём Enter, то наша страница перейдёт из одного состояния в другое:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Схематически это можно изобразить вот так:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Из этого состояния мы можем перейти в третье добавив ещё одну задачу в список:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

А можем удалить добавленную задачу, вернувшись в первое состояние:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Или кликнуть по надписи TODOs и остаться во втором состоянии:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

А теперь попробуем реализовать Proof-of-Concept такого подхода.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Для работы с браузером возьмём chromedriver, работать с диаграммой состояний и переходов будем через python библиотеку NetworkX, а рисовать будем через yEd.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Теперь мы должны описать состояние приложения. Из-за алгоритма сжатия изображения, мы можем использовать размер картинки в формате PNG как идентификатор состояния и через метод __eq__ реализовать сравнение этого состояния с другими. Через атрибут iterated мы фиксируем, что были прокликаны все кнопки, введены значения во все поля в этом состоянии, чтобы исключить повторную обработку.

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

При фаззинге текущего состояния мы должны каждый раз возвращаться в это состояние из нового. Для этого мы используем функцию nx.shortest_path, которая вернёт список элементов, которые нужно прокликать, чтобы перейти из базового состояния в текущее.
Для того, чтобы дождаться окончания реакции приложения на наши действий в функции wait используется Network Long Task API, показывающий занят ли JS какой-либо работой.

Вернёмся к нашему приложению. Исходное состояние имеет следующий вид:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Через 22 итерации вот такой вид:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Если же запустить наш скрипт на несколько часов, то он внезапно сообщит, что обошёл все возможные состояния, получив следующую диаграмму:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Так, с простым демонстрационным приложением мы справились. А что будет, если натравить этот скрипт на реальное веб-приложение. А будет хаос:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Мало того, что на бэкенде происходят изменения, сама по себе страница постоянно перерисывается при реакции на таймеры или события, при выполнении одних и тех же действий мы можем получить разные состояния. Но даже в таких приложениях можно найти куски функционала, с которыми наш скрипт может справиться без значительных доработок.
Возьмём для испытаний страницу аутентификации СБИС:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

И для неё достаточно быстро получилось построить полную диаграмму состояний и переходов:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Отлично! Теперь мы можем обходить все состояния приложения. И чисто в теории найти все ошибки, которые зависят от действий. Но как научить программу понимать, что перед ней ошибка?

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

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Рассмотрим последний паттерн “а раньше было по-другому”. Автотесты ведь регрессионным тестированием занимаются.

Вернёмся к графу после 10 итерации по TODO:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

Сломаем код, который отвечает за открытие корзины и вновь прогоним 10 итераций:

Что такое фаззинг тестирование. Смотреть фото Что такое фаззинг тестирование. Смотреть картинку Что такое фаззинг тестирование. Картинка про Что такое фаззинг тестирование. Фото Что такое фаззинг тестирование

А далее сравним два графа и найдём разницу в состояниях:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *