
Ein coverage-gesteuerter REST-API-Fuzzer, entwickelt auf Basis von LibAFL
TNO hat WuppieFuzz entwickelt, einen coverage-gesteuerten REST-API-Fuzzer, der auf LibAFL aufbaut und sich an eine breite Zielgruppe von Endanwendern richtet, mit starkem Fokus auf Benutzerfreundlichkeit, Erklärbarkeit der entdeckten Fehler und Modularität. WuppieFuzz unterstützt alle drei Test-Szenarien (Black Box, Grey Box und White Box).
[!NOTE]
Für eine schnelle, mitverfolgbare Anleitung folgen Sie bitte dem Tutorial!
WuppieFuzz wurde vorgestellt in:
Wenn Sie WuppieFuzz in wissenschaftlichen Arbeiten zitieren möchten, verwenden Sie bitte die bevorzugte Publikation, die in CITATION.cff aufgeführt ist:
Rooijakkers, T., Nijsten, A., Daniele, C., Weitenberg, E., Groenewegen, R., & Melissen, A. (2026). WuppieFuzz: Coverage-Guided, Stateful REST API Fuzzing. In Proceedings of the 12th International Conference on Information Systems Security and Privacy (ICISSP), Volume 2, 221-231. SciTePress. https://doi.org/10.5220/0000217100004061
WuppieFuzz ist unter Apache-2.0 lizenziert; siehe LICENSE.
Lizenzhinweise Dritter sind in THIRD_PARTY_NOTICES aufgeführt.
Für eine schnelle Installation von WuppieFuzz auf gängigen Betriebssystemen
(MacOS, Windows, Linux) siehe releases oder verwenden Sie brew install wuppiefuzz
Sie können das Docker-Image mit docker build . -t wuppiefuzz:local erstellen. Um es zu verwenden, müssen Sie einen Ordner einbinden, der Ihre OpenAPI-Spezifikation enthält. Beim Fuzzing eines Dienstes, den Sie lokal ausführen (nicht in Docker), müssen Sie Host-Netzwerk angeben:
docker run \
--network host \
-v ./fuzzing-folder:/fuzzing-folder \ # The folder will be populated with wuppiefuzz outputs
-w /fuzzing-folder \
wuppiefuzz:local fuzz --timeout 60 --report openapi.json
Um das Projekt zu bauen, müssen Sie die folgenden Abhängigkeiten und Werkzeuge installieren:
sudo apt install -y build-essential pkg-config cmake # General build tools
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Rust
Bevor Sie WuppieFuzz ausführen, müssen Sie Ihre (instrumentierte) Zielanwendung starten.
Zusätzlich müssen Sie WuppieFuzz eine OpenAPI-Spezifikation bereitstellen, damit es weiß, wie es seine Anfragen generieren und mutieren soll. Für Hilfe zu den Kommandozeilenargumenten verwenden Sie Folgendes:
$ cargo run -- --help # shows help for required parameters and flags
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
Um beispielsweise WuppieFuzz gegen ein Java-Ziel mit angehängtem JaCoCo-Agent auszuführen, geben Sie dessen OpenAPI-Datei an (die die URL enthält, unter der das Ziel läuft, in der API-Spezifikation). Zusätzlich geben Sie an, dass das Coverage-Format JaCoCo ist, und geben das Klassenverzeichnis wie folgt an:
cargo run -- fuzz openapi.yaml --coverage-format jacoco --jacoco-class-dir ../Targets/app/target/classes/
Wenn Sie eine Konfigurationsdatei anstelle von bzw. in Kombination mit
Kommandozeilenargumenten verwenden möchten, können Sie das Flag --config <CONFIG_FILE> verwenden. Falls Sie Kommandozeilenargumente in Kombination mit einer Konfigurationsdatei verwenden, haben die Kommandozeilenargumente Vorrang.
Die Konfigurationsdatei sollte eine YAML-Datei sein und für jedes Kommandozeilenargument, das Sie angeben möchten, eine Zeile enthalten, zum Beispiel:
coverage_format: jacoco
output_format: human-readable
source_dir: "/swagger-petstore/src/main/java"
jacoco_class_dir: "/swagger-petstore/target"
timeout: 20
Ein Beispiel-Ausführungsbefehl könnte in diesem Fall sein:
$ cargo run -- fuzz --config=config.yaml --report --coverage-host=localhost:6300 --timeout=10 ./openapi.yaml
Diese Zeile würde die Argumente von der Kommandozeile und aus der
Konfigurationsdatei kombinieren. Da das Flag --timeout in beiden angegeben ist,
hat der in der Kommandozeile angegebene Timeout (10 Sekunden) Vorrang.
Im Verzeichnis example_configs/ finden Sie zwei Beispiel-Konfigurationsdateien
zur Verwendung für die Generierung von Coverage-Berichten mit JaCoCo für Java-Code
und für die Generierung von Coverage-Berichten mit LCOV für Python-Code.
Wenn Sie WuppieFuzz mit dem Flag --report ausführen, wird ein Unterverzeichnis
innerhalb von reports/ mit einem Zeitstempel als Namen erstellt. Alle
unterstützten Coverage-Berichte werden in dieses Unterverzeichnis geschrieben.
Es gibt zwei Arten von Coverage-Berichten:
Darüber hinaus wird eine Datenbank mit allen Anfrageinformationen zu Ihrer Fuzzing-Kampagne gefüllt. Diese Datenbank kann über das Grafana-Dashboard visualisiert und erkundet werden.
Weitere Informationen zu jedem dieser Punkte finden Sie in den READMEs in diesen Verzeichnissen.
Standardmäßig vendort WuppieFuzz seine C-Abhängigkeiten (OpenSSL, SQLite, Z3), sodass
ein regulärer cargo build out of the box funktioniert. Für eine schnellere Kompilierung während
der Entwicklung können Sie alle vendorten Abhängigkeiten deaktivieren und stattdessen gegen
systeminstallierte Bibliotheken linken.