Skip to content

Latest commit

 

History

History

pytorch

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

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

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

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

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

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

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

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

$ docker build -f Dockerfile -t pytorch-fuzz .

В докер устанавливаются зависимости, а также копируются необходимые для фаззинга файлы, включая фаззинг-цель и корпус начальных входных данных, который состоит из файла model - сериализованная PyTorch-модель, созданная на основе данного примера - https://pytorch.org/tutorials/beginner/saving_loading_models.html

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

  1. Создание контейнера:
$ 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).

  1. Необходимо дополнительно установить atheris (с применением соответствующих патчей) в python3 фаззера и зависимости фаззинг-цели:
$ /opt/crusher/tools/install_atheris.sh
$ /opt/crusher/bin_x86-64/python-3.9_x86_64/bin/pip3 install numpy torch

3. Фаззинг

  1. Запуск фаззинга.
$ /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 раз - в начале фаззинга.

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

Запустите в другом терминале UI фаззера:

$ docker exec -ti pytorch-fuzz /bin/bash
$ /opt/crusher/bin_x86-64/ui -o out

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

Прервать фаззинг (в первом терминале, Ctrl + С).