Данный режим позволяет избежать целый ряд конфликтов за ресурсы (например, файлы и порты) между разными процессами исследуемого приложения. Подробнее - см. раздел "Фаззинг в докер-контейнерах" в документации.
Рассмотрим фаззинг сервера nginx.
Перед созданием докер-образа необходимо создать файл docker/licence/hasplm.ini, скопировать в него содержимое файла docker/licence/hasplm-template.ini
и в поле serveraddr заменить X.X.X.X на ip-адрес сервера с сетевым hasp-ключом (красной флешкой). Если hasp-ключ подключен к машине, где производится запуск, то hasplm.ini не нужно использовать. В таком случае нужно внести соответствующие изменения и в Dockerfile.
Необходимо создать докер-образ с исследуемым ПО и настроенным для него окружением:
cd docker
docker build --network host -f Dockerfile . -t nginx-demo
В поддиректории in находятся входные данные для фаззинга.
- Пример запуска фаззинга:
crusher/bin_x86-64/fuzz_manager --start 4 --eat-cores 2 --dse-cores 0 --docker nginx-demo \
-i $PWD/in -o $PWD/out --ip 127.0.0.1 --port 8080 -I StaticForkSrv \
--pre-run ./docker/license/license.sh -T NetworkTCP --delay 3000 \
-t 10000 --wait-next-instance 2000 -F \
--clean-binary /root/target/nginx-clean/sbin/nginx \
--bitmap-size 65536 \
-- /root/target/nginx-fuzz/sbin/nginxЗдесь используются следующие опции фаззера:
--start <num>- число экземпляров фаззинга (fuzz-процессов);--eat-cores <num>- число процессов доп. анализа (EAT - Extra Analysis Tool);--dse-cores <num>- число процессов динамического символьного выполнения (DSE);--docker <name>- докер-образ с подготовленным окружением для nginx;--pre-run <path>- указанный sh-скрипт будет запускаться в докер-контейнере перед запуском fuzz- или eat-процесса;-i <path>- путь до директории с начальными входными данными;-o <path>- путь до директории с результатами фаззинга;-F- удалить результаты предыдущего запуска (если соответствующая директория не пуста);--ip X.X.X.X- IP-адрес машины, на которой запускается целевая программа (т.е. localhost);--port <num>- порт, который слушает целевая программа;-I <type>- тип инструментации;-T <type>- тип транспорта (способ передачи данных в исследуемое приложение);--delay <msecs>- в течение<msecs>миллисекунд фаззер пытается установить tcp-соединение с целевой программой (ожидание готовности целевой программы);-t <msecs>- таймаут в миллисекундах (если приложение не отработало за указанное время, то результат запуска классифицируется как зависание);--wait-next-instance <msecs>- временной интервал (в миллисекундах) между запусками процессов fuzz, eat и др.;--clean-binary <path>- путь до бинаря без инструментации для получения, например, lighthouse- и valgrind-отчётов;--bitmap-size <num>- размер битовой карты покрытия в байтах;-- <target args>- команда запуска целевого приложения (в докер-режиме - пути указываются внутри докер-контейнера).
Для быстрого запуска демо-теста используйте скрипт fuzz.sh. Данный скрипт принимает на вход 1 аргумент - путь до директории crusher/. Обращаем Ваше внимание, что данный скрипт можно запускать только из директории, в которой он находится.
- Мониторинг:
crusher/bin_x86-64/ui -o outДля более детального ознакомления с фаззингом в докер-режиме - см. раздел Фаззинг в докер-контейнерах документации.
Для ознакомления с другими опциями Crusher - см. Приложение А документации.