Использование файлового фаззера MiniFuzz Небольшой и

advertisement
Использование файлового фаззера MiniFuzz
Небольшой и простой файловый фаззер
ВВЕДЕНИЕ
MiniFuzz – это программа, реализующая фаззинг (искажение) файлов, используемых в качестве
входных данных для тестирования программного обеспечения и позволяющая выявить ошибки
безопасности и надежности тестируемого ПО. Основной идеей файлового фаззинга является
искажение заранее подготовленных шаблонных файлов случайными данными, и обработка
тестируемым программным обеспечением большого количества искаженных таким образом
входных данных с целью выявления ошибок. Применение этой методики на практике позволило
выявить реальные ошибки безопасности и надежности. Ниже приведены некоторые примеры
выявленных при помощи фаззинга ошибок разбора форматов файлов (parsing) в программном
обеспечении Microsoft:

ANI (MS07-017)

JPG (MS04-028)

XLS (MS06-012)

ICC (MS05-036)

BMP (MS06-005, MS05-002)

ICO (MS05-002)

TNEF (MS06-003)

CUR (MS05-002)

EOT (MS06-002)

ANI (MS05-002)

WMF (MS06-001, MS05-053)

DOC (MS05-035)

EMF (MS06-053)

ZIP (MS04-034)

PNG (MS05-009)

ASN.1 (MS04-007)

GIF (MS05-052, MS04-025)
Фаззинг является высокоэффективным средством обнаружения ошибок в программном
обеспечении. Применение фаззинга на этапе Верификации (Verification Phase) Жизненного цикла
безопасного программного обеспечения (Microsoft Security Development Lifecycle - SDL) является
обязательным требованием. Выпустив MiniFuzz, мы сделали простой файловый фаззинг
доступным для Вас, способствуя Вашему стремлению найти как можно большее количество
ошибок в созданном Вами коде прежде, он будет передан заказчикам.
MiniFuzz может функционировать как самостоятельное приложение (standalone application) или
интегрированный инструмент Visual Studio. Также MiniFuzz может быть интегрирован с Шаблоном
Процесса Microsoft SDL или любым другим шаблоном процесса VSTS и способен сохранять
результаты своей работы в Team Foundation Server.
Более подробно фаззинг определен в разделе “Краткий обзор фаззинга и MiniFuzz.”.
ДЛЯ КОГО ПРЕДНАЗНАЧЕН MINIFUZZ
MiniFuzz реализует очень простой фаззинг, позволяющий применять фаззинг специалистам,
прежде незнакомым с концепциями создания безопасного ПО или не использовавшими ранее
фаззинг в своей работе.
ОБЗОР ФАЗЗИНГА И MINIFUZZ
Фаззинг представляет технику тестирования, помогающую выявить уязвимости в безопасности и
возможные отказы в обслуживании (DoS) программного обеспечения. Принцип фаззинга очень
прост: сформировать искаженные данные, заставить приложение обработать искаженные данные,
отлеживать поведение приложения в процессе обработки искаженных данных. Аварийное
завершение приложения, указывает на возможную ошибку в ПО. Информация о сбое приложения
позволит Вам быстро выявить проблемы в коде и, возможно, ввести соответствующие
исправления (возможно также выявление проблем с безопасностью приложения).
MiniFuzz – это небольшая утилита-исказитель (fuzzer), созданная командой SDL в Microsoft с
целью демонстрации концепций файлового фаззинга и помощи разработчикам в выявлении
уязвимостей безопасности и возможных отказов обслуживания (DoS) программного обеспечения,
прежде чем приложения будут переданы заказчикам.
Существуют два класса фаззеров - “простые” (dumb) и “интеллектуальные” (smart). “Простой”
фаззинг ничего не знает о структуре файлов и меняет содержимое случайным образом. Напротив,
“интеллектуальный” фаззинг использует знания о внутренней структуре файлов данных.
Текущая версия MiniFuzz поддерживает “простой” фаззинг, но, возможно, будущие версии будут
поддерживать “интеллектуальный” фаззинг, позволяющий искажать данные на основе
информации о формате файла.
SDL требует, при выполнении фаззинга, прогонки минимум 100000 разборов файлов на один тип
файла. Так, если Ваше приложение поддерживает 2 различных формата файлов (.FOO, .BAR, .),
то успешное прохождение фаззинга предполагает создание 100.000 файлов типа .FOO и 100.000
файлов типа .BAR их обработку без сбоев. Выявленный сбой на этапе обработки файла
предполагает исправление ошибки и повторение цикла фаззинга на минимум 100.000 файлов.
Сам процесс фаззинга относительно прост и может быть описан как последовательность шагов:
1. Создание (или получение) достаточно представительного набора корректных файлов
исходных данных (этот набор является эталонным – template files set)
2. Фаззер случайным образом выбирает файл из эталонного набора
3. Фаззер сохраняет выбранный файл во временном каталоге (создает временный файл)
4. Фаззер искажает временный файл
5. Фаззер загружает тестируемое приложение и передает ему имя временного файла с
искаженными данными как аргумент командной строки
6. Фаззер запускает приложение с использованием возможностей отладчика Windows, что
позволяет ему определить и перехватить ошибки, возникающие при выполнении
приложения
7. Если приложение выполняется без сбоев на протяжении определенного промежутка
времени (По-умолчанию 2 сек.), то фаззер завершает приложение и удаляет временный
файл.
8. Если при выполнении приложения возник сбой, то информация об ошибке и временный
файл сохраняются либо в каталоге файлов, либо базе данных Team Foundation Server (bug
tracking database)
9. Возврат на шаг 2
УСТАНОВКА MINIFUZZ
Просто запустите setup.exe
Для того, чтобы включить MiniFuzz в набор инструментов Visual Studio, требуется выполнить
setup.exe и далее следующие шаги, чтобы включить MiniFuzz в раздел меню Tools:

Запустить Visual Studio

Вызвать пункт меню Tools | External Tools

Нажать Add

Ввести следующие значения полей:
o
Title: MiniFuzz
o
Command: указать расположение исполняемого файла minifuzz.exe
o
В поле Arguments указать: $(TargetPath) %1
o
Initial directory: указать папку, в которую был установлен MiniFuzz
Строка %1 обозначает аргумент командной строки, который будет передан тестируемому
приложению, при этом MiniFuzz автоматически использует в качестве параметра правильное имя
файла.
ЗАПУСК MINIFUZZ
MiniFuzz является простым фаззером, который использует набор эталонных файлов как основу
для проведения фаззинга. MiniFuzz может быть стартован как отдельное приложение, или как
инструмент Visual Studio. Вне зависимости от способа запуска MiniFuzz может быть интегрирован с
Team Foundation Server, что позволяет заносить в TFS информацию о сбоях приложения,
возникших в процессе фаззинга, как ошибки.
Запуск MiniFuzz как отдельного приложения
Для запуска MiniFuzz как отдельного приложения, просто откройте папку
files\microsoft\minifuzz в которую был установлен MiniFuzz и стартуйте minifuzz.exe.
c:\program
Запуск MiniFuzz из Visual Studio
В том случае, если MiniFuzz добавлен в список инструментов Visual Studio, MiniFuzz может быть
запущен из непосредственно из меню Tools | MiniFuzz, при этом тестируемый процесс будет
назначен автоматически.
Интеграция с Visual Studio Team Foundation Server
Вне зависимости от способа запуска MiniFuzz будет пытаться определить подключение
пользователя к Team Foundation Server и использовать существующее подключение. При этом
пользователь может подсоединяться и отсоединяться от TFS в любой момент.
ИСПОЛЬЗОВАНИЕ MINIFUZZ ДЛЯ ТЕСТИРОВАНИЯ ПРИЛОЖЕНИЯ
Для тестирования приложения с использованием фаззинга необходимо выполнить ряд
подготовительных действий. В данном разделе описаны предварительные шаги и действия,
необходимые для начала тестирования приложения:
Шаг 1: Собрать представительный набор эталонных файлов
Нет правила, четко определяющего, сколько именно эталонных файлов должно входить в
тестовый набор, но рекомендуется больше 100. Также эти файлы должны представлять по
возможности наибольшее число вариантов. Так, например, для приложения, отображающего
снимки, сделанные цифровой камерой, рекомендуется включить в шаблон файлы:

для каждой модели камеры, поддерживаемой приложением (как новых так и старых
моделей);

в различных поддерживаемых приложением форматах (обычно JPEG, TIFF и RAW);

различных поддерживаемых размеров (часто мелкий, средний, большой);

различных поддерживаемых установок качества (обычно низкое, среднее, высокое и
высшее);

во всех возможных форматах сжатия;

и так далее.
В дальнейшем следует использовать полученные таким образом файлы в качестве эталонного
набора; чем больше вариантов включено в Вашу коллекцию, тем больше шансов обнаружить
ошибку в коде с использованием MiniFuzz;
Шаг 2: Конфигурирование MiniFuzz
Конфигурацию MiniFuzz надо определить хотя бы один раз. При этом надо определить папки, из
которых будет считываться и в которые будет записываться информация в процессе фаззинга.
Конфигурационный файл, имеющий имя minifuzz.cfg, содержиться в той же папке, что и бинарные
файлы и загружаемые модули, используемые MiniFuzz (обычно c:\progam files\microsoft\minifuzz).
По умолчанию конфигурационный файл содержит:
<?xml version="1.0" encoding="utf-8"?>
<config>
<folders>
<templates location="%desktop%\minifuzz\templates" />
<temp location="%desktop%\minifuzz\temp"/>
<log location="%desktop%\minifuzz\logs"/>
<crashedfiles location="%desktop%\minifuzz\crashes"/>
<postprocess location="%desktop%\minifuzz\postprocess"/>
</folders>
<extensions>
</extensions>
</config>
Ниже в таблице определены xml-элементы конфигурационного файла:
Элемент
Комментарий
<templates location>
Folder that holds the file templates, this can be changed in the
MiniFuzz user interface.
Папка,
содержащая
эталонные
файлы,
настройка
может
быть
изменена
в
пользовательском интерфейсе MiniFuzz.
<temp location>
Папка, содержащая временные файлы.
<log location>
Папка, содержащая файл журнала (в том случае, если не
используется Team Foundation Server)
<crashedfiles location>
Местонахождение, куда записываются файлы, вызвавшие
сбой
<postprocess location>
Не используется в текущей версии
Не используется в текущей версии
<extensions>
Конфигурационная строка может ссылаться на предопределенное
указывающее на рабочий стол текущего пользователя.
значение
%desktop%,
ПРИМЕЧАНИЕ: Несуществующие папки будут созданы MiniFuzz автоматически.
Шаг 3: Запуск MiniFuzz и задание параметров фаззинга
Запустите MiniFuzz, в разделе “Запуск MiniFuzz” настоящего руководства, и Вы увидите окно
программы.
Теперь следует изменить некоторые параметры фаззинга, описание которых приведено ниже:
Поле
Описание
Process to fuzz
Полный путь и имя исполняемого файла, подлежащего тестированию.
Command line args
Параметр (placeholder) и другие опции командной строки, передающиеся тестируемому
процессу. %1 является параметром, соответствующим имени искаженного файла (поскольку
имя временного искаженного файла является случайным). В том случае, если приложение
требует задания имени файла данных через опцию командной строки, например /F:<имя
файла>, воспользоваться параметром следует в форме /F:%1
Allow process to run
Определяет максимальное время исполнения процесса в секундах, по завершению которого
for
процесс будет принудительно завершен. Установленное время должно быть достаточным для
обработки файла.
Важно: Не следует устанавливать слишком маленький интервал, поскольку приложению может
не хватить времени на инициализацию, обработку файла и отображение результатов.
Рекомендуется начать с двух секунд, далее, возможно снизить интервал до 1.5 секунды, потом,
при необходимости, до 1 секунды, но не менее 0.5 секунды.
Кроме того, для больших файлов, с размером более 1Мб, следует соответственно увеличить
время исполнения (с учетом времени обработки и загрузки файла с диска)
Shutdown method
MiniFuzz может принудительно завершить тестируемое приложение (по истечению временного
интервала) одним из трех способов:
1)
Внедрение потока (thread injection) – в тестируемый процесс добавляется поток и,
внутри потока выполняется вызов ExitProcess(), который приводит к нормальному
завершению процесса.
2)
WM_CLOSE
–
оптимальный
метод
завершения
приложения,
приложению завершиться самостоятельно. Метод работает
позволяющий
только для GUI-
приложений (не подходит для консольных приложений).
3)
TerminateProcess – вызов функции Windows API, принудительно завершающей
процесс. Может использоваться для всех типов приложений. Следует иметь в виду,
что этот метод наиболее жесткий и некоторые ресурсы при таком методе завершения
процесса могут не освобождаться. Данный способ завершения тестируемого процесса
является наименее предпочтительным.
При выполнении фаззинга в памяти может быть порядка десятка тестируемых процессов. Такое
поведение связано с тем, что закрытие каждого процесса требует времени. Тем не менее, если
количество одновременно выполняющихся целевых процессов велико (сотни экземпляров), это
означет, что MiniFuzz не может корректно закрыть приложение (или приложение предотвращает
завершение)
Template Files
Папка содержащая эталонные файлы.
Temporary files
Месторасположение временных (искаженных) файлов. MiniFuzz удаляет временные файлы в
фоновом потоке. При завершении MiniFuzz удаляет все файлы из этой папки. Параметр,
определяющий месторасположение временной папки, храниться в файле конфигурации XML
(описан на “Шаге 2: Конфигурирование MiniFuzz”).
Log files
Месторасположение файлов журнала фаззинга, содержащих информацию по всем выявленным
сбоям приложения.
Crash files
Папка, содержащая все файлы, вызвавшие сбой при выполнении фаззинга.
Aggressiveness
Параметр определяет степень искажения входящего файла. Единого наилучшего значения не
существует, поскольку изменение одного бита может привести к сбою приложения, но слишком
сильное
искажение
может
привести
к
преждевременным
обнаружениям
внутренних
несоответствий в структуре файла. Параметр следует определить с учетом специфики
тестируемого приложения.
Always on Top
Опция “поверх всех окон”
Start Fuzzing
Запуск процесса фаззинга
Stop Fuzzing
Остановка фаззинга (при этом итоговые показатели не сбрасываются)
View Log Dir
Открывает папку, содержащую файлы журналов.
TFS Settings
Открывает диалоговое окно, позволяющее просматривать и определять связь с Visual Studio
Team Foundation Server
About
Открывает диалоговое окно About.
Progress section
Данная секция содержит текущую общую информацию, такую как количество обработанных
файлов и количество сбоев.
Шаг 4. Запуск процесса фаззинга
После того, как Вы задали параметры MiniFuzz нажмите кнопку Start, убедитесь, что приложение
правильно загружается и завершается, и, если все идет как надо, оставьте MiniFuzz работать на
несколько часов. Если фаззинг для приложения ранее не проводился, то, вероятнее всего,
несколько ошибок будет выявлено сразу же.
В разделе Progress окна MiniFuzz отображаются возникшие сбои приложения, время и имя
соответствующего файла.
Шаг 5. Сортировка результатов
В том случае, если проведение фаззинга в течение нескольких часов привело к появлению одного
или нескольких сбоев, очень важно провести анализ информации об ошибках, записанных
MiniFuzz:

Файл, вызвавший сбой (храниться в папке, содержащей файлы, вызвавшие ошибку (crash)

Информация об ошибках и исключениях (храниться в папке журналов (log))
Далее способ анализа зависит от того, насколько возможно специалисту, выполняющему анализ,
интерпретировать параметры исключения, содержащиеся в файле журнала. На основе
информации об исключении можно сгруппировать идентичные сбои и определить различные
варианты ошибок. Например, в процессе фаззинга можно получить 134 сбоя, но только 7
различных ошибок (обуславливающих эти сбои). При этом следует ориентироваться на адрес
инструкции, вызвавшей сбой (EIP или RIP в зависимости от типа CPU).
Если Вы эксперт по то отладке кода, то Вам следует сохранить для дальнейшего тестирования по
одному файлу, вызвавшему сбой.
Вне зависимости от того, являетесь ли Вы экспертом по отладке или нет, Вам следует запустить
отладочную сборку с каждым файлом, вызвавшим сбой (используя отладчик Visual Studio или
WinDbg). В случае сбоя приложения Вам следует локализовать место в коде, ответственное за
сбой.
Шаг 6. Регистрация ошибки(ок)
В том случае, если Вы используйте Visual Studio Team Foundation Server, MiniFuzz будет
регистрировать ошибку для каждого сбоя приложения, что может привести к большому количеству
подобных ошибок. Эти ошибки следует не удалять, а, после анализа, отмечать как устраненные,
сопоставив их самой первой аналогичной ошибке (что даст информацию о частоте проявления
ошибки).
Шаг 7. Исправьте ошибку(и)
Описания способа, который будет Вами избран для исправления ошибки, не является задачей
данного документа. Для исправления ошибки можно воспользоваться множеством источников, и, в
частности, важные рекомендации приведены в разделе SDL на сайте Microsoft,
http://www.microsoft.com/sdl.
Шаг 8. Повторите все с Шага 3
После исправления выявленных ошибок в коде, следует повторить процесс, и добиться обработки
не менее 100000 искаженных файлов без сбоев.
ИНТЕГРАЦИЯ С MICROSOFT TEAM FOUNDATION SERVER
MiniFuzz интегрируется с системой ведения ошибок TFS, заполняя информацию по каждому сбою
в процессе фаззинга, как отдельную ошибку. Использование TFS требует учетной записи
пользователя в TFS (учетную запись можно получить у администратора TFS). Также для связи с
TFS потребуется программное обеспечение – клиент TFS, осуществляющее связь с TFS сервером,
такое, как Visual Studio Team Explorer (может быть свободно загружен с сайта www.microsoft.com)
Для конфигурирования связи с TFS необходимо в основном диалоговом окне MiniFuzz нажать
кнопку ”TFS Settings…”, после чего будет открыто приведенное ниже диалоговое окно
настройки. Требуется задать поля:

Имя TFS сервера. Можно выбрать из списка или внести вручную

Порт соединения (обычно 8080)

Имя проекта
Далее, после нажатия кнопки ”Connect” потребуется ввести учетную запись.
ПРИЛОЖЕНИЕ A: ИНТЕГРАЦИЯ С !EXPLOITABLE
Утилита !exploitable, разработана той же самой командой Microsoft, которая разработала MiniFuzz.
!exploitable является расширением отладчика Windows (например WinDbg) позволяетвыполнить
автоматически анализ сбоя и оценку связанных рисков безопасности.
MiniFuzz не использует !exploitable напрямую, но пользователь может явно вызвать !exploitable
после выявления сбоя на этапе фаззинга. После того, как MiniFuzz выявил сбой и записал файл в
папку crashes, загрузите приложение с соответствующим файлом в WinDbg:
windbg badapp.exe \users\mike\desktop\minifuzz\crashes\foobar8776.bad
Загрузите !exploitable:
!load winext\msec.dll
Запустите процесс обработки файла приложением:
g
Запустите !exploitable для выполнения анализа:
!exploitable
ПРИЛОЖЕНИЕ B: РЕСУРСЫ

The Security Development Lifecycle, Microsoft Press, Howard and Lipner, Chapter 12

The Security Development Lifecycle version 4.1 documentation – http://www.microsoft.com/sdl

!exploitable Crash Analyzer - MSEC Debugger Extensions http://msecdbg.codeplex.com/

The History of the !exploitable Crash Analyzer http://blogs.technet.com/srd/archive/2009/04/08/thehistory-of-the-exploitable-crash-analyzer.aspx
Download