Нахождение аварийного завершения OpenSSL-сервера (v1.1.0a), соответствующего уязвимости CVE-2016-6309.
Демонстрируются следующие возможности фаззера:
-
Описание формата данных с помощью Peach Pit (модифицированного для Crusher).
-
Замена вызовов некоторых функций целевой программы пользовательскими во время фаззинга. Это может ускорить запуски (особенно сетевых приложений). Более подробно - см. раздел
"PRELOAD"в документации.
Ниже представлены все этапы от подготовки к фаззингу до воспроизведения креша.
Фаззинг будет проводиться в докер-контейнере на основе образа openssl-fuzz:latest, собранного следующей командой:
$ ./docker/docker_build.shБолее подробно этапы сборки можно изучить в Dockerfile (оставлены комментарии).
- Создать контейнер (укажите актуальный путь до директории
crusher):
$ /docker/docker_run.sh <crusher_dir> [hasp_ip]где:
crusher_dir- директорияcrusher/(обязательная опция)hasp_ip- IP сервера лицензий (необязательная опция)
- Подготовка к запуску. Для оптимизации обработки аварийных завершений целевой программы со статической инструментацией необходимо выполнить:
$ sudo su
$ echo core >/proc/sys/kernel/core_pattern
$ exit- Запуск фаззинга.
$ ./fuzz.shОпции фаззера:
--start <num>- число fuzz-процессов (экземпляры фаззинга);--eat-cores <num>- число eat-процессов (процессы доп. анализа);--dse-cores <num>- число dse-процессов (динамическое символьное выполнение), в данном режиме не поддерживается;-I <type>- тип инструментации;--peach-pit <path>- файл с описанием формата данных (адаптированный для Crusher формат Peach Pit);-i <path>- путь до директории с начальными образцами входных данных;-o <path>- путь к выходной директории с результатами фаззинга.
- Мониторинг.
Запустите в другом терминале UI фаззера (укажите актуальные пути):
$ sudo -E /path/to/crusher/bin_x86-64/ui -o outКак только будут найдены креши, значение поля unique_crashes (в окне UI - наверху справа) станет ненулевым.
- Анализ результатов.
Воспроизведение креша:
- Получить список креш-файлов:
$ find out -name id_crash_*- Запуск сервера:
$ ./server.sh- Запуск клиента (в другом терминале):
$ python3 client.py <crash_file>где <crash_file> - один из файлов, полученных в п. 1.
- В терминале с сервером наблюдаем его аварийное завершение.