ФАЗЗИНГ. МЕТОДЫ И СРЕДСТВА ФАЗЗИНГА
Е.А. Ефремов, студент А.Е. Ковалевский, студент
Московский государственный технический университет им. Н.Э. Баумана (Россия, г. Москва)
Аннотация. В статье рассматриваются методы анализа программного обеспечения, методика исследования программного обеспечения на наличие уязвимостей - фаззинг, методы фаззинга, а именно метод случайных данных, мутационного тестирования протокола вручную, мутационного тестирования и автоматически порождающего тестирования протокола, а также некоторые программные средства, позволяющие проводить данные исследования.
Ключевые слова: информационная безопасность, уязвимости, фаззинг, методы фаз-зинга, тестирование.
В настоящее время люди окружены множеством электронных устройств -компьютеры, смартфоны, умные часы, системы видеонаблюдения и различные хозяйственные устройства, которые получили доступ к интернету. В последнее время участились атаки хакеров с использованием устройств умного дома, камер видеонаблюдения и подобных устройств. Это связано с недостаточно хорошо организованной безопасностью программного обеспечения устройств.
Долгое время считалось, что динамический анализ программного обеспечения является слишком тяжеловесным подходом к обнаружению программных дефектов, и полученные результаты не оправдывают затраченных усилий и ресурсов. Однако, две важные тенденции развития современной индустрии производства программного обеспечения позволяют по-новому взглянуть на эту проблему. С одной стороны, при постоянном увеличении объема и сложности ПО любые автоматические средства обнаружения ошибок и контроля качества могут оказаться полезными и востребованными. С другой - непрерывный рост производительности современных вычислительных систем позволяет эффективно решать все более сложные вычислительные задачи.
В качестве более эффективной альтернативы динамическому анализу часто рассматривают статический анализ. В случае статического анализа поиск возможных
ошибок осуществляется без запуска исследуемой программы, например, по исходному коду приложения. Обычно при этом строится абстрактная модель программы, которая, собственно, и является объектом анализа.
При этом следует подчеркнуть следующие характерные особенности статического анализа:
1. Возможен раздельный анализ отдельно взятых фрагментов программы (обычно отдельных функций или процедур), что дает достаточно эффективный способ борьбы с нелинейным ростом сложности анализа.
2. Возможны ложные срабатывания, обусловленные либо тем, что при построении абстрактной модели некоторые детали игнорируются, либо тем, что анализ модели не является исчерпывающим.
3. При обнаружении дефекта возникают, во-первых, проблема проверки истинности обнаруженного дефекта и, во-вторых, проблема воспроизведения найденного дефекта при запуске программы на определенных входных данных.
В отличие от статического анализа, динамический анализ осуществляется во время работы программы. При этом:
1. Для запуска программы требуются некоторые входные данные.
2. Динамический анализ обнаруживает дефекты только на трассе, определяемой конкретными входными данными; дефек-
ты, находящиеся в других частях программы, не будут обнаружены.
3. В большинстве реализаций появление ложных срабатываний исключено, так как обнаружение ошибки происходит в момент ее возникновения в программе; таким образом, обнаруженная ошибка является не предсказанием, сделанным на основе анализа модели программы, а констатацией факта ее возникновения.
Фаззинг - методика тестирования, при которой на вход программы подаются невалидные, непредусмотренные или случайные данные.
Термин Fuzzing появился еще в 1988 году в работе «The Fuzz Generator», опубликованной Бартом Миллером, который решил подсовывать программе заведомо некорректные и зачастую вообще случайные данные, отлавливая ситуации, когда та не сможет их обработать. Эффективность такого подхода до сих пор велика. Точки ввода данных в программу могут быть самые разные: текстовая строка, введенная через графический интерфейс, бинарные данные из файла, значение поля в сетевом запросе. Вместо программы может быть драйвер, ActiveX-компонент или, например, SWF-приложение.
Не смотря на различные методы фаз-зинга, можно выделить несколько основных фаз, которые будут присутствовать всегда:
1. Определение цели. На данном этапе оцениваются особенности исследуемого объекта и выбирается соответствующий метод и инструмент анализа.
2. Определение вводимых значений. Необходимо определить все возможные варианты входных данных.
3. Порождение некорректных данных.
4. Исполнение некорректных данных.
5. Мониторинг исключений. Важный шаг, позволяющий оценить причины возникновения исключений.
6. Определение работоспособности. Определение возможности эксплуатации найденных уязвимостей.
Фаззеры делятся на две категории:
1. Мутационные, которые изменяют существующие образцы данных и создают условия для тестирования.
2. Порождающие, которые создают условия для тестирования с чистого листа, моделируя необходимый протокол или формат файла.
Существует несколько методов фаззин-га: метод случайных данных, мутационного тестирования протокола вручную, мутационного тестирования и автоматически порождающего тестирования протокола.
Метод случайных данных наименее эффективен, однако может быть использован как самый быстрый способ поиска неверного кода. Подход с использованием случайных данных заключается в подстановке псевдослучайных данных в объект исследования. Самый простой пример такого подхода - бесконечный цикл, в котором случайные данные передаются на нужный адрес или порт.
Мутационное тестирование протокола вручную проще в использовании, чем метод случайных чисел. При ручном тестировании протокола автоматические фаззе-ры не применяются. Загрузив тестируемое приложение, тестер вручную вводит некорректные данные в попытке вызвать нежелательное поведение приложения. Чаще всего такой метод фаззинга применяется для веб-приложений.
Мутационное тестирование (тестирование методом грубой силы) представляет собой фаззер, который начинается с действующего образца протокола или формата данных и искажает каждые байт, слово, двойное слово в пакете данных или файле. Охват кода при подходе грубой силы зависит от того, сколько файлов тестируется. Большинство определений файлов довольно сложны, поэтому придется брать множество образцов, чтобы обеспечить сколько-нибудь приемлемый охват.
Автоматическое порождающее тестирование протокола - более продвинутый метод тестирования грубой силы. Для его реализации требуется предварительное исследование. Вместо того чтобы создавать образец для тестирования с жестко заданным кодом, создается грамматика, в
которой описывается работа спецификации протокола. Таким образом определяются те порции пакета или файла, которые должны остаться неизменными, и те, которые служат переменными для фаззинга.
Выше были рассмотрены различные методы тестирования, теперь рассмотрим типы фаззеров.
Часто при запуске приложение выполняет аргументы командной строки, введенные пользователем. Фаззеры командной строки позволяют тестировать уязвимости формата строки и переполнения буфера в приложениях.
Множество приложений имеют дело с вводом и выводом файлов. Например, офисный модуль, который требуется для открытия документа. Приложения такого типа могут оказаться чувствительными к уязвимостям, которые возникают при анализе неверно созданных файлов. Фаззеры формата файлов динамически создают некорректные файлы, которые затем обрабатываются объектом тестирования.
Одна из простейших утилит для реализации фаззинга формата файлов -MiniFuzz. Проект разработан внутри Microsoft для тестирования своих собственных проектов. Дело в том, что использование фаззеров является обязательным этапом методологии SDL, принятой в Microsoft для разработчиков безопасного кода, включающей помимо прочего обильное fuzz-тестирование. С Minifuzz
можно тестировать любое приложение; главное, чтобы в качестве параметра для запуска оно воспринимало указание на файл, который ему необходимо открыть (например, winword.exe test.doc). Для начала работы необходимо набрать несколько образцов «правильных» файлов и переместить их в каталог, обозначенный как Template files, а также выбрать приложение для проверки, указав формат параметров для его запуска.
Сетевые приложения прочно вошли в нашу жизнь, настолько прочно, что мы доверяем им наши конфиденциальные данные (пароли, данные банковских карт и т.д.). Почтовые сервера, веб-сайты, система доменных имен (DNS) - примеры сетевых приложений. Уязвимость в любой из таких систем дает нападающему доступ к важным данным или плацдарм для дальнейших атак на другие серверы. Для тестирования программ, которые занимаются сетевым интерфейсом, используются фаз-зеры удаленного доступа, которые подразделяются следующим образом:
- фаззеры сетевых протоколов;
- фаззеры веб-браузеров;
- фаззеры веб-приложений.
Фаззинг позволяет определить слабые места в программном обеспечении и предупредить их эксплуатацию в дальнейшем. Применение данного метода исследования программ на уязвимости является актуальным.
Библиографический список
1. Саттон М. Грин А. Амини П. Fuzzing: Исследование уязвимостей методом грубой силы, "Символ Плюс". - СПб.-Москва; 2009. - 560 с.
FUZZING. METHODS AND TOOLS FOR FUZZING
E.A. Efremov, student A.Y. Kovalevsky, student Bauman Moscow state technical university (Russia, Moscow)
Abstract. The article deals with methods of software analysis, methods of research of software for vulnerabilities is fuzzing, fazzinga methods, namely the method of random data, mutation testing of Protocol manually, mutation testing, and automatically generate test Protocol, as well as some software tools to conduct these studies.
Keywords: information security, vulnerabilities, fuzzing, methods fazzinga, testing.