Фаззинг Python-библиотеки torch
.
В качестве целевого выбран метод load()
, который загружает сериализованную PyTorch-модель.
Фаззинг-цель - torch_load_fuzz.py.
Вызов atheris.instrument_imports()
обеспечивает инструментацию модуля torch
, а декоратор atheris.instrument_func
- ф-ции TestOneInput
.
Подробнее про фаззинг приложений на языке Python - см. раздел "Инструментация Python" в документации к Crusher.
Фаззинг будет проводиться в докер-контейнере на основе образа, собранного следующей командой:
$ docker build -f Dockerfile -t pytorch-fuzz .
В докер устанавливаются зависимости, а также копируются необходимые для фаззинга файлы, включая фаззинг-цель и корпус начальных входных данных, который состоит из файла model
- сериализованная PyTorch-модель, созданная на основе данного примера - https://pytorch.org/tutorials/beginner/saving_loading_models.html
- Создание контейнера:
$ docker run --name pytorch-fuzz --rm --privileged \
--network host -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 \
-v /path/to/crusher/:/opt/crusher \
-ti pytorch-fuzz:latest /bin/bash
Обратите внимание, что в контейнер монтируется директория с фаззером в качестве докер-вольюма (-v
).
- Необходимо дополнительно установить atheris (с применением соответствующих патчей) в python3 фаззера и зависимости фаззинг-цели:
$ /opt/crusher/tools/install_atheris.sh
$ /opt/crusher/bin_x86-64/python-3.9_x86_64/bin/pip3 install numpy torch
- Запуск фаззинга.
$ /opt/crusher/bin_x86-64/fuzz_manager --start 4 --eat-cores 2 \
--dse-cores 0 -I pyinst -i in/ -o out -t 120000 \
-- ./torch_load_fuzz.py @@
Опции фаззера:
--start <num>
- число fuzz-процессов (экземпляры фаззинга);--eat-cores <num>
- число eat-процессов (процессы доп. анализа);--dse-cores <num>
- число dse-процессов (динамическое символьное выполнение), в данном режиме не поддерживается;-I <type>
- тип инструментации;-i <path>
- путь до директории с начальными образцами входных данных;-o <path>
- путь к выходной директории с результатами фаззинга;-t <milliseconds>
- таймаут на запуск приложения (в миллисекундах).
В данном примере указан довольно большой таймаут, т.к. инструментация фаззинг-цели выполняется долго, но только 1 раз - в начале фаззинга.
- Мониторинг.
Запустите в другом терминале UI
фаззера:
$ docker exec -ti pytorch-fuzz /bin/bash
$ /opt/crusher/bin_x86-64/ui -o out
Как только будут найдены необработанные исключения, значение поля unique_crashes
(в окне UI
- наверху справа) станет ненулевым.
Прервать фаззинг (в первом терминале, Ctrl + С
).