Fuzzing - технология

Майкл Ховард: Если у вас произошел сбой программы, не думайте, что это просто сбой. Вполне возможно, что некая часть так именуемых сбоев – это приглашение для злоумышленника написать атакующий код. Не воспринимайте сбой, как «просто сбой»


Fuzzing технология


Fuzzing: Исследование уязвимости методом ошибок

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

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

Fuzzing: Специфика способа тестирования

В академическом мире фаззинг связан с анализом граничных значений (Boundary Value Analysis (BVA), при котором рассматривается диапазон вероятных значений
При фаззинге мы генерируем все возможные значения, которые могут вызвать непредсказуемое либо небезопасное поведение системы.

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

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

 Рекомендуемый этапы проверки исходного кода:

1. Проверка на наличие ошибок человеком
2. Проверка средствами статического анализатора


Внедрение фаззинга для проверки ПО:

— Вызывает выполнения большинства проверок в приложении

— Находит очень много ошибок

— Большой объем тестирования с множеством вариантов

— Находит огромное количество проблем связанных с надежностью (многие из них являются и возможными проблемами безопасности)


Программы для фаззинга

Фаззер – средство (приложение или фреймворк), позволяющее проводить автоматизированный фаззинг исходного кода, файлов, приложений и прочего:

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

— Межсайтовый скриптинг (Cross Site Scripting — XSS)

— SQL инъекции (SQL-inj)

— Переполнения буфера (buffer overflows — BFO)

— Ошибки форматной строки (format string errors — FSE)

— Целочисленное переполнение (integer overflows — INT)

— и многие другие уязвимости крайне нестандартными способами.

Отличительной особенностью этого фаззера является возможность редактировать содержимое генераторов, на основе которых и производится анализ. 
 Bunny the Fuzzer

Bunny the Fuzzer — предназначен для анализа приложений, написанных на C. Работает на уровне компилятора, устанавливая «ловушки» на вызываемые функции, имея возможность исследовать передаваемые характеристики и результаты работы. Такой подход позволяет проводить глубокий и последовательный анализ, что положительно отражается на результатах тестирования. Работает под Linux, FreeBSD, OpenBSD и Cygwin. 

 Проект SPIKE — удобный и универсальный фаззер, созданный для тестирования новых и неизвестных сетевых протоколов. Включает в себя тестирование NTLM аутентификации методом грубой силы, проверку на переполнение буфера, парсер web приложений и DCE-RPC (MSRPC), а так же много другого полезного функционала для профессионального специалиста по тестированию безопасности. Работает только под управление Linux. 

 PFF (Php Fuzzing Framework)

Данная утилита разработана с целью поиска ошибок в PHP коде. Написана на C, работает под управлением unix-based систем.

Данный фаззер, написанный на Python, предназначен для случайного изменения сетевого трафика., что позволяет тестировать сетевые протоколы. Работает по принципу man-in-the-middle, поддерживает TCP и UDP протоколы (причем можно настроить на фаззнг только опредеденного протокола). 

AFL (American fuzzy lop) — это направленный на поиск ошибок инструмент анализа ПО, который использует широкий список типов инструментации кода для получения данных о покрытии и огромное количество генетических алгоритмов мутации для автоматического обнаружения различных тестовых примеров, которые вызывают новые внутренние состояния в бинарном коде ПО. Фаззер AFL поддерживает инструментацию, реализующуюся на шаге компиляции из исходного кода при помощи оберток afl-gcc/afl-g++. afl-gcc/afl-g++ заменяет вызываемую команду на обертку, переписывающую ассемблерный код, сгенерированный компилятором. Для фаззинга уже скомпилированных бинарных файлов используется qemu mode — это патч к QEMU, эмулирующий запуск одного процесса и реализующий требуемую для анализа инструментацию кода. Вначале QEMU предназначалась для того, чтобы запускать отдельные процессы, собранные для другой архитектуры, используя ядро целевой операционной системы. На официальном веб-сайте фаззера размещены разные «трофеи» данного инструмента. С его помощью были обнаружены уязвимости в последующем ПО: LibreOffice, GnuPG, OpenSSH, nginx, Internet Explorer, sqlite и др.

LibFuzzer — это инструмент анализа ПО, являющийся частью проекта LLVM, позволяющий производить анализ ПО без его перезапуска, осуществляя мутацию напрямую в памяти. Данный инструмент собирает информацию о покрытии (пройденных базовых блоках) и накапливает тестовые примеры, приводящие к его увеличению. В этом фаззере используется технология белого ящика, поэтому инструментация осуществляется средствами LLVM после компиляции исходного кода. LibFuzzer позволяет осуществлять фаззинг различных компонентов браузера Google Chrome, что освобождает от необходимости генерировать HTML страницу или полезную нагрузку, а также перезапускать браузер целиком. Это позволяет существенно сократить накладные расходы. LibFuzzer имеет возможность осуществлять анализ функций API напрямую. Благодаря перечисленным особенностям данный инструмент позволяет проводить анализ в несколько раз быстрее чем традиционные инструменты фаззинга. Данный инструмент используется в открытой разработке браузера Chromium, каждое изменение кода которого, вносимое разработчиками, проверяется на кластере с использованием LibFuzzer.

Syzkaller — это инструмент, предназначенный для поиска ошибок в ядрах ОС. Данный инструмент в различной степени поддерживает множество различных ОС, таких как akaros, freebsd, fuchsia, netbsd, windows и linux. Изначально syzkaller разрабатывался для анализа ядра ОС Linux, но со временем он стал поддерживать большее количество операционных систем.


Главные этапы фаззинга:

– Определение протокола и типа входных данных. Для старта анализа требуются начальные входные данные.

– Изменение данных с учетом особенностей протокола передачи и типа данных. Изменение входных данных производится двумя методами — мутацией и генерацией.

– Исполнение программы с подачей ей на вход некорректных данных.

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

– Исследование уязвимости на возможность её эксплуатации.