Фаззинг 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.