
EF/CF - Extrem schnelles Smart-Contract-Fuzzing
EF/CF ist ein neuer Ansatz zum Fuzzing von Smart Contracts: Anstatt einen neuen eigens entwickelten Fuzzer zu verwenden, wird die bestehende Fuzzing-Infrastruktur für C/C++-Code auf Smart Contracts übertragen. Derzeit ist AFL++ der primär unterstützte Fuzzer, obwohl es auch eine sehr rudimentäre Unterstützung für libfuzzer und honggfuzz gibt.
Warum bestehende Fuzzing-Infrastruktur verwenden?
Welche Probleme treten dabei auf?
./src/ethmutator/./src/evm2cpp/Dieses Repository ist der primäre Einstiegspunkt für das EF/CF-Projekt. Es enthält den gesamten
relevanten Code als Unterprojekte in ./src/ sowie mehrere praktische Skripte für die
Installation, Skripte zum Starten von Fuzzing-Kampagnen und verschiedene Datensätze zum Testen
des Fuzzers (und zum Vergleich mit anderen Werkzeugen).
./src/ - enthält den gesamten Quellcode, der zum Erstellen und Ausführen von EF/CF erforderlich ist;
zur Reproduzierbarkeit sind alle direkten Abhängigkeiten als Git-Submodule hinzugefügt../data/ - enthält die Datensätze, die bei der Evaluierung verwendet wurden./scripts - enthält Skripte zum Ausführen von Experimenten, zur Installation usw../docker - Dockerfile für einen containerbasierten Workflow
./docker/tools/ enthält Dockerfiles für Werkzeuge, mit denen wir EF/CF verglichen
haben. Wir haben unser Bestes getan, um die Versionen zu fixen, die wir in unserer Arbeit
evaluiert haben, in den Dockerfiles../EXPERIMENTS.md - enthält eine Anleitung zur
Reproduktion der Experimente aus unserer Arbeit../examples - enthält Beispielausgaben, die von EF/CF erzeugt wurdenWir beschreiben die Architektur und Implementierung von EF/CF und fassen unsere Evaluierungsergebnisse in unserem Papier zusammen: arxiv.org-Preprint
Wenn Sie sich in wissenschaftlichen Arbeiten auf EF/CF beziehen, verwenden Sie bitte den folgenden BibTeX-Eintrag für die Zitierung:```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", }
## Quickstart
Die empfohlene Methode ist, EF/CF als interaktiven Docker-Container auszuführen.
1. Betreten Sie den Container mit einer Shell ```
docker run --rm -it ghcr.io/uni-due-syssec/efcf-framework
oder baue den Container aus dem geklonten Repository ``` make gitmodules # to fetch the git submodules make container-enter
1. Kompiliere und fuzze dann einen Solidity-Vertrag, bis der erste Absturz/Fehler
entdeckt wird: ```
efcfuzz --until-crash --out ./baby_bank_results/ --source ./data/examples/baby_bank.sol
Kein Git? Wenn du ein Tarball-/Docker-Release verwendest, ignoriere das.
Führe git submodule update --init aus, um die neuesten Submodule-Commits in bereits geklonten Repositorys abzurufen.
Stelle sicher, dass du dies auch in ./src/eEVM ausführst.```
git submodule update --init; cd src/eEVM/; git submodule update --init; cd ../../
*Warnung:* Die Ausführung von `git clone --recursive $repo` oder die Übergabe des Arguments `--recursive` an `git sumbodule (update|init)` veranlasst git, rekursiv in Submodule des AFL++-Repositorys einzudringen, die für dieses Projekt nicht benötigt werden. Um Speicherplatz zu sparen, ist es daher besser, die rekursiven Submodule-Checkouts zu vermeiden.
### Container
Wir bieten die folgenden praktischen Make-Targets für containerbasierte Workflows an:```sh
make container-build # build default efcf container
make container-enter # enter default efcf container in current working dir
Wenn Sie einen sauberen Build sicherstellen möchten, können Sie den folgenden Befehl verwenden```sh make container-build CLEAN_CHECKOUT=1
Alternativ kann der Container mit folgendem Docker-Befehl erstellt werden:```sh
docker build \
-f docker/ubuntu.Dockerfile \
-t efcf:latest \
.
Beachte, dass es auch ein Archlinux- und Fedora-basiertes Dockerfile gibt. Sie sollten ebenfalls funktionieren, sind aber nicht so gut getestet.
Zur manuellen Verteilung eines Docker-Images (z. B. wenn lokale Änderungen enthalten sein sollen), verwende:``` make container-release docker load -i ./efcf*.tar
Wir empfehlen die folgenden Docker-Optionen zum Start:
* `--security-opt seccomp=unconfined` – bessere Fuzzing-Leistung
* `--net=host` – für einfachen Zugriff auf einen lokalen Ethereum-Knoten
* `--tmpfs "/tmp/efcf/":exec,size=6g` – legt die temporären Dateien von EF/CF wenn möglich auf eine RAM-Disk (weniger Verschleiß der Festplatte)
* `--privileged` – zum Ausführen von `afl-system-config` oder `efcfuzz --configure-system`
* `-v` – zum Speichern der Ausgabedaten von EF/CF
### VM / Bare-Metal
Für Workflows auf VM- oder Bare-Metal-Basis:```sh
make system-install # install efcf to current system (requires root or sudo rights)
Beachte, dass viele der Skripte ohnehin mit dem relativen Verzeichnislayout funktionieren, daher installiert dies hauptsächlich Abhängigkeiten und einige Werkzeuge, die nützlich in deinem PATH zu haben sind. Wir haben EF/CF auf den folgenden Linux-Distributionen getestet:
(Die Distribution spielt keine so große Rolle, wir haben LLVM 13 und 14 getestet, wobei 14 die bevorzugte Wahl ist. LLVM 11 oder 12 könnte ebenfalls noch funktionieren, aber wie immer – je neuer, desto besser. Wichtig ist, dass es ein LLVM gibt, das mit unserem Fork von AFL++ kompatibel ist.)