Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

README.md

1. Фаззинг-цель

Фаззинг Python-библиотеки pdfquery. В качестве целевого выбран метод load(). Фаззинг-цель (таргет) - testpdf.py.

Вызов atheris.instrument_imports() обеспечивает инструментацию модуля pdfquery, а декоратор atheris.instrument_func - ф-ции TestOneInput.

Подробнее про фаззинг приложений на языке Python - см. раздел "Инструментация Python" в документации к Crusher.

2. Подготовка к фаззингу

2.1. Сборка докер-образа

Фаззинг будет проводиться в докер-контейнере на основе образа pdfquery-fuzz:latest, собранного следующей командой:

$ ./docker/docker_build.sh

2.2. Подготовка докер-контейнера

  1. Создать контейнер (укажите актуальный путь до директории crusher):
$ /docker/docker_run.sh <crusher_dir> [hasp_ip]

где:

  • crusher_dir - директория crusher/ (обязательная опция)
  • hasp_ip - IP сервера лицензий (необязательная опция)
  1. Установить адаптированный для крашера atheris:
$ /opt/crusher/tools/install_atheris.sh /usr/bin/python3
  1. Установить библиотеки pdfquery (объект анализа) и six в python3:
$ pip3 install pdfquery six

3. Фаззинг

  1. Проверка фаззинг-цели. Запустите на начальном файле и убедитесь, что таргет работает корректно и выводится информация об инструментации (INFO: Instrumenting ...):
$ cd /path/to/python_fuzz
$ python3 testpdf.py in/ccitt.pdf
  1. Запуск фаззинга.
$ ./fuzz.sh

Опции фаззера:

  • --start <num> - число fuzz-процессов (экземпляры фаззинга);
  • --eat-cores <num> - число eat-процессов (процессы доп. анализа);
  • --dse-cores <num> - число dse-процессов (динамическое символьное выполнение), в данном режиме не поддерживается;
  • -I <type> - тип инструментации;
  • -i <path> - путь до директории с начальными образцами входных данных;
  • -o <path> - путь к выходной директории с результатами фаззинга;
  • -t <milliseconds> - таймаут на запуск приложения (в миллисекундах).
  1. Мониторинг.

Запустите в другом терминале UI фаззера (укажите актуальные пути):

$ sudo -E /path/to/crusher/bin_x86-64/ui -o out

Как только будут найдены необработанные исключения, значение поля unique_crashes (в окне UI - наверху справа) станет ненулевым.

  1. Анализ результатов.

Пример воспроизведения найденного исключения:

$ python3 testpdf.py out/EAT_OUT/crashes/id_crash_000000 

Прервать фаззинг можно по Ctrl + С (1-й терминал) или через UI.