Данный режим позволяет избежать целый ряд конфликтов за ресурсы (например, файлы и порты) между разными процессами исследуемого приложения. Подробнее - см. раздел "Фаззинг в докер-контейнерах" в документации.
Рассмотрим фаззинг сервера 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
- см. Приложение А
документации.