Фаззинг

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:36, 5 января 2018.

Фаззинг (англ. fuzzing) — техника тестирования программного обеспечения, часто автоматическая или полуавтоматическая, заключающая в передаче приложению на вход неправильных, неожиданных или случайных данных. Предметом интереса являются падения и зависания, нарушения внутренней логики и проверок в коде приложения, утечки памяти, вызванные такими данными на входе. Фаззинг является разновидностью выборочного тестирования (англ. random testing), часто используемого для проверки проблем безопасности в программном обеспечении и компьютерных системах.

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

История

Случайные данные применялись при тестировании приложений уже давно. К примеру, приложение «Обезьяна» («англ. The Monkey») под Mac OS, созданная Стивом Капсом ещё в 1983 году, генерировала случайные события, которые направлялись на вход тестируемым программам для поиска багов. Оно использовалось в частности при тестировании MacPaint.[1]

Термин «fuzz» появился в 1988 году на семинаре Бартона Миллера в Университете Висконсина[2], во время которого была создана простая программа «fuzzer» для командной строки для тестирования надежности приложений под Unix. Оно генерировало случайные данные, которые передавались как параметры для других программ до тех пор, пока они не останавливались с ошибкой. Это стало не только первым в истории тестированием с использованием случайных неструктурированных данных, но и первым специализированным приложением для тестирования широкого круга программ под разнообразные операционные системы, и с систематическим анализом типов ошибок, возникающих при таком тестировании. Создатели проекта открыли исходные коды своего приложения, а также публичный доступ к процедурам тестирования и сырым результатам. Тест был повторен в 1995 году — приложение доработали для тестирования приложений с GUI, сетевых протоколов и системных библиотек под Mac OS и Windows.

Стоит отметить, что схожие техники тестирования существовали задолго до появления термина и формализации процедуры. Так, известно, что Джерри Вейнберг использовал набор карт со случайными числами, чтобы передавать их на вход программ ещё в 1950-х годах.[3]

В 1991 году было выпущено приложение «crashme», созданное для тестирования надежности программ под Unix и Unix-подобных операционных систем путем исполнения случайного набора процессорных инструкций.[4]

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

Типы Фаззинга

Фаззинг можно разделить на следующие категории:

  1. Фаззинг может быть основан на поколениях или на основе мутаций графа в зависимости от того, как генерируются входы: с нуля или изменяются уже существующие входы;
  2. Фаззинг может быть глупым или умным, в зависимости от того, знает ли он о входной структуре;
  3. Фаззинг может быть белым, серым или чёрным ящиком в зависимости от структура входа программы.

Повторное использование существующих входных данных

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

Фаззинг основанный на генерации генерирует входы с нуля. В отличие от основанного на мутации fuzzers, основанный на генерации fuzzer не зависит от существования или качества корпуса вводов данных.

Софт для фаззинга

Фаззер – приложение или фреймворк, дающие возможность проводить автоматизированный фаззинг приложений, кода, файлов и т.п. В настоящее время фаззеров не много. В большинстве своём фаззеры написаны для UNIX, но есть также и для Windows.

OWASP JBroFuzz – фаззер, позволяющий работать с такими протоколами, как XML, LDAP, HTTP, SOAP и т.д. Этот фаззер поддерживает большое колличество проверок на:

  • XSS
  • SQL-inj
  • BFO
  • FSE
  • INT
  • и множество других уязвимостей крайне не обычными методами.

Отличительно чертой данного фаззера является возможность редактирования содержимого генераторов.

Bunny the Fuzzer

Этот фаззер преднозначен для анализа программ написанных на C. Работает под nix.

SPIKE

SPIKE - приложение для тестрирования новых сетевых протоколов. Работает только на Linux. [Источник 2]

PFF

Утилита, для поиска ошибок в PHP. Работает на UNIX. ProxyFuzz

Фаззер, написанный на питоне, предназначен для тестирования сетевых протоколов. [Источник 3]

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

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

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


Примечания

  1. "Macintosh Stories: Monkey Lives". Folklore.org. 1999-02-22. Retrieved 2010-05-28. 
  2. Michael Sutton; Adam Greene; Pedram Amini (2007). Fuzzing: Brute Force Vulnerability Discovery<span />. Addison-Wesley. ISBN 0-321-44611-9. 
  3. Gerald M. Weinberg. "Fuzz Testing and Fuzz History". Retrieved 2017-02-06. 
  4. "crashme". CodePlex. Retrieved 2012-06-26. 

Источники

  1. Automated Penetration Testing with White-Box Fuzzing // msdn.microsoft.com. [2017—2017]. Дата обновления: 09.06.2017. URL: http://msdn.microsoft.com/en-us/library/cc162782.aspx (дата обращения: 09.06.2017).
  2. Проектирование и рефакторинг // habrahabr. [2017—2017]. Дата обновления: 05.03.2017. URL: https://habrahabr.ru/post/128503// (дата обращения: 05.03.2017).
  3. Проектирование и рефакторинг // habrahabr. [2017—2017]. Дата обновления: 09.06.2017. URL: https://habrahabr.ru/post/128503// (дата обращения: 09.06.2017).

Ссылки