Кейсы рекомендуется помещать в типовые контенеры, за основу оформления взят контейнер Статическое инструментирование и фаззинг Postgres.
Сборка контейнера осуществляется командой наподобие (параметры --build-arg
позволяют пробросить uid/gid в контенер для облегчения файловой синхронизации при небходимости и не влияют на приведенные описания с точки зрения их логики):
docker build --build-arg cuid=$(id -u) --build-arg cgid=$(id -g) --build-arg cuidname=$(id -un) --build-arg cgidname=$(id -gn) -t ИМЯ_ОБРАЗА -f ИМЯ_ДОКЕРФАЙЛА .
Выполнить загрузку и распаковку актуальной версии Crusher в контейнер можно с использованием скрипта загрузки актуальной версии crusher за авторством Николая из компании PostgresPro https://gitlab.com/dhyannataraj
Запуск контейнера для выполнения экспериментов осуществляется командой наподобие:
docker run -it --name=ИМЯ_КОНТЕЙНЕРА ИМЯ_ОБРАЗА /bin/bash
где:
- ИМЯ_ДОКЕРФАЙЛА это выбранный пример докерфайла
- ИМЯ_ОБРАЗА - произвольное, назначаемое экспериментирующим, имя образа
- ИМЯ_КОНТЕЙНЕРА - произвольное, назначаемое экспериментирующим имя контейнера.
Полную очистку результатов работы можно осуществить выполнив команду:
docker kill ИМЯ_КОНТЕЙНЕРА ; docker rm ИМЯ_КОНТЕЙНЕРА ; docker rmi ИМЯ_ОБРАЗА
При использовании Crusher необходимо добавить в строку запуска контенйнера --network host
(для взаимодействия с сетевым (красным) хаспом), либо --privileged
(если хасп локальный (черный) и подключен к хосту, в котором выполняется docker). Также режим --priviliged
позволяет пропатчить отказ от сохранения core dump, что по умолчанию требуется для работы фаззера.
1. Особенности использования clang-компиляторов из комплекта AFL++ при статическом инструментировании
Скрипт загрузки актуальной версии crusher
Вводную лекцию по принципам и целям фаззинга управляемого кода можно посмотреть например здесь.
Основным фаззером - к сожалению с непонятным статусом поддержки - является sharpfuzz. По ссылке приведён подробный пример как его установить и использовать.
Ещё один пример, а также имплементация механизма Structure Aware Fuzzing для C#, доступен в репозитории FuzzedDataProviderCS.
Сбор покрытия для C#-кода можно выполнить с помощью например minicover, по краткой инструкции