
EF/CF — Экстремально быстрый фаззинг смарт-контрактов
EF/CF — это новый подход к фаззингу смарт-контрактов: вместо создания нового фаззера с нуля, он переиспользует существующую инфраструктуру фаззинга кода на C/C++ для смарт-контрактов. В настоящее время основным поддерживаемым фаззером является AFL++, хотя также есть некоторая базовая поддержка libfuzzer и honggfuzz.
Зачем использовать существующую инфраструктуру фаззинга?
С какими проблемами мы сталкиваемся на этом пути?
./src/ethmutator/./src/evm2cpp/Этот репозиторий — основная точка входа для проекта EF/CF. Он содержит весь соответствующий код в виде подпроектов в ./src/, а также несколько вспомогательных скриптов для установки, скриптов для запуска фаззинг-кампаний и различные наборы данных для тестирования фаззера (и сравнения с другими инструментами).
./src/ — содержит весь исходный код, необходимый для сборки и запуска EF/CF; для воспроизводимости все прямые зависимости добавлены как git-подмодули../data/ — содержит наборы данных, использованные при оценке./scripts — содержит скрипты для запуска экспериментов, установки и т.д../docker — Dockerfile для работы в контейнере
./docker/tools/ содержит docker-файлы для инструментов, с которыми мы сравнивали EF/CF. Мы постарались зафиксировать в docker-файлах версии, которые использовали в нашей оценке в статье../EXPERIMENTS.md — содержит руководство по воспроизведению экспериментов из нашей статьи./examples — содержит примеры результатов, созданных EF/CFМы описываем архитектуру и реализацию EF/CF, а также обобщаем результаты нашей оценки в нашей статье: препринт arxiv.org
При ссылке на EF/CF в академических работах, пожалуйста, используйте следующую bibtex-запись для цитирования:```bibtex @InProceedings{efcf2023, author = "Michael Rodler and David Paaßen and Wenting Li and Lukas Bernhard and Thorsten Holz and Ghassan Karame and Lucas Davi", title = "EF/CF: High Performance Smart Contract Fuzzing for Exploit Generation", booktitle = "{IEEE} European Symposium on Security and Privacy ({EuroS&P})", publisher = "{IEEE}", year = "2023", }
## Быстрый старт
Рекомендуемый способ — запустить EF/CF как интерактивный docker-контейнер.
1. Войдите в контейнер с оболочкой ```
docker run --rm -it ghcr.io/uni-due-syssec/efcf-framework
или соберите контейнер из клонированного репозитория ``` make gitmodules # to fetch the git submodules make container-enter
1. Скомпилируйте, а затем фаззите контракт solidity до тех пор, пока не будет
обнаружен первый сбой/баг: ```
efcfuzz --until-crash --out ./baby_bank_results/ --source ./data/examples/baby_bank.sol
Нет git? если вы используете tarball/docker release, игнорируйте это.
Выполните git submodule update --init, чтобы получить последние коммиты подмодулей в уже клонированных репозиториях.
Убедитесь, что вы также выполните это в ./src/eEVM.```
git submodule update --init; cd src/eEVM/; git submodule update --init; cd ../../
*Предупреждение:* Выполнение `git clone --recursive $repo` или передача аргумента `--recursive` команде `git sumbodule (update|init)` приведёт к рекурсивному переходу git в подмодули репозитория AFL++, которые не нужны для этого проекта. Поэтому для экономии места лучше избегать рекурсивной проверки подмодулей.
### Контейнер
Мы предоставляем следующие удобные make-цели для рабочих процессов на основе контейнеров:```sh
make container-build # build default efcf container
make container-enter # enter default efcf container in current working dir
Если вы хотите обеспечить чистую сборку, вы можете использовать следующую команду```sh make container-build CLEAN_CHECKOUT=1
В качестве альтернативы контейнер можно собрать с помощью следующей команды docker:```sh
docker build \
-f docker/ubuntu.Dockerfile \
-t efcf:latest \
.
Обратите внимание, что существует также Dockerfile на основе Archlinux и Fedora. Они должны работать, но не так хорошо протестированы.
Для ручного распространения Docker-образа (например, если вы включаете некоторые локальные изменения), используйте:``` make container-release docker load -i ./efcf*.tar
Рекомендуем следующие параметры Docker для запуска:
* `--security-opt seccomp=unconfined` — лучшая производительность фаззинга
* `--net=host` — для удобного доступа к локальному узлу Ethereum
* `--tmpfs "/tmp/efcf/":exec,size=6g` — поместить временные файлы EF/CF на ramdisk, если возможно (меньше износ диска)
* `--privileged` — для запуска `afl-system-config` или `efcfuzz --configure-system`
* `-v` — для сохранения выходных данных EF/CF
### VM / Bare-Metal
Для рабочих процессов на основе VM или bare-metal:```sh
make system-install # install efcf to current system (requires root or sudo rights)
Обратите внимание, что многие скрипты в любом случае работают с относительной структурой каталогов, так что в основном это устанавливает зависимости и некоторые инструменты, которые полезно иметь в вашем PATH. Мы тестировали запуск EF/CF на следующих дистрибутивах Linux:
(Дистрибутив не так важен: мы тестировали LLVM 13 и 14, причём 14 предпочтительнее. LLVM 11 или 12, возможно, всё ещё работают, но, как всегда, чем новее, тем лучше. Важно, чтобы был LLVM, совместимый с нашим форком AFL++.)
Мы не тестировали EF/CF на Mac OS нативно. Вероятно, что-то не заработает (например, afl-clang-lto на Mac OS, похоже, не работает). Лучший вариант — использовать docker.```sh
make gitmodules
docker pull ubuntu:jammy --platform linux/amd64
docker build -t efcf:latest -f docker/ubuntu.Dockerfile --platform linux/amd64 .
docker run --tmpfs "/tmp/efcf/":exec,size=8g --platform linux/amd64 --rm -it -v $(pwd):$(pwd) -w $(pwd) efcf:latest
Мы тестировали с использованием docker desktop v4.21.1, и базовое использование EF/CF работает. Однако учтите следующее:
* Если при сборке вы видите segfault: попробуйте увеличить лимит памяти виртуальной машины, которую docker использует в Mac OS.
* Попробуйте включить ускорение с помощью rosetta в docker — возможно, так будет немного быстрее.
### Настройка окружения для разработки