Skip to content

Latest commit

 

History

History

nginx_docker

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

Фаззинг сервера nginx в докер-режиме

Данный режим позволяет избежать целый ряд конфликтов за ресурсы (например, файлы и порты) между разными процессами исследуемого приложения. Подробнее - см. раздел "Фаззинг в докер-контейнерах" в документации.

Рассмотрим фаззинг сервера nginx.

1. Создание докер-образа с исследуемым ПО

Перед созданием докер-образа необходимо создать файл 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

2. Запуск фаззинга

В поддиректории in находятся входные данные для фаззинга.

  1. Пример запуска фаззинга:
    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/. Обращаем Ваше внимание, что данный скрипт можно запускать только из директории, в которой он находится.

  1. Мониторинг:
crusher/bin_x86-64/ui -o out

Для более детального ознакомления с фаззингом в докер-режиме - см. раздел Фаззинг в докер-контейнерах документации. Для ознакомления с другими опциями Crusher - см. Приложение А документации.