Skip to content

Files

Latest commit

5899bd4 · Apr 17, 2025

History

History

pytorch

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

Фаззинг Python-библиотеки torch. В качестве целевого выбран метод load(), который загружает сериализованную PyTorch-модель. Фаззинг-цель - torch_load_fuzz.py.

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

Корпус начальных входных данных состоит из файла model - сериализованной PyTorch-модели, созданной на основе данного примера

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

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

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

Фаззинг будет проводиться в докер-контейнере на основе образа pytorch-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. Установить библиотеки torch (объект анализа) и numpy в python3:
$ pip3 install torch numpy

3. Фаззинг

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

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

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

В данном примере указан довольно большой таймаут, т.к. инструментация фаззинг-цели выполняется долго, но только 1 раз - в начале фаззинга.

  1. Мониторинг.

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

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

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

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

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

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

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