Фаззинг Python-библиотеки torch
.
В качестве целевого выбран метод load()
, который загружает сериализованную PyTorch-модель.
Фаззинг-цель - torch_load_fuzz.py.
Вызов atheris.instrument_imports()
обеспечивает инструментацию модуля torch
, а декоратор atheris.instrument_func
- ф-ции TestOneInput
.
Корпус начальных входных данных состоит из файла model
- сериализованной PyTorch-модели, созданной на основе данного примера
Подробнее про фаззинг приложений на языке Python - см. раздел "Инструментация Python" в документации к Crusher.
Фаззинг будет проводиться в докер-контейнере на основе образа pytorch-fuzz:latest
, собранного следующей командой:
$ ./docker/docker_build.sh
- Создать контейнер (укажите актуальный путь до директории
crusher
):
$ /docker/docker_run.sh <crusher_dir> [hasp_ip]
где:
crusher_dir
- директорияcrusher/
(обязательная опция)hasp_ip
- IP сервера лицензий (необязательная опция)
- Установить адаптированный для крашера
atheris
:
$ /opt/crusher/tools/install_atheris.sh /usr/bin/python3
- Установить библиотеки
torch
(объект анализа) иnumpy
вpython3
:
$ pip3 install torch numpy
- Проверка фаззинг-цели.
Запустите на начальном файле и убедитесь, что таргет работает корректно и выводится информация об инструментации (
INFO: Instrumenting ...
):
$ cd /path/to/pytorch
$ python3 torch_load_fuzz.py in/model
- Запуск фаззинга.
$ ./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
- наверху справа) станет ненулевым.
- Анализ результатов.
Пример воспроизведения найденного исключения:
$ python3 torch_load_fuzz.py out/EAT_OUT/crashes/id_crash_000000
Прервать фаззинг можно по Ctrl + С
(1-й терминал) или через UI.