Zurück zu den Updates
New releaseAug 30, 2026

WuppieFuzz v1.7.1

Ein coverage-gesteuerter REST-API-Fuzzer, entwickelt auf Basis von LibAFL

Teilen

WuppieFuzz v1.7.1

Logo of WuppieFuzz.

TNO entwickelte WuppieFuzz, einen coverage-gesteuerten REST-API-Fuzzer, der auf LibAFL aufbaut und sich an ein breites Publikum von Endanwendern richtet, mit starkem Fokus auf Benutzerfreundlichkeit, Erklärbarkeit der entdeckten Schwachstellen und Modularität. WuppieFuzz unterstützt alle drei Testumgebungen (Black Box, Grey Box und White Box).

[!NOTE]
Für eine schnelle Schritt-für-Schritt-Anleitung folgen Sie bitte dem Tutorial!

Medienberichterstattung

WuppieFuzz wurde vorgestellt in:

Wissenschaftliche Veröffentlichung

Wenn Sie WuppieFuzz in akademischen Arbeiten zitieren möchten, verwenden Sie bitte die bevorzugte Veröffentlichung, 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

Lizenz

WuppieFuzz ist unter Apache-2.0 lizenziert; siehe LICENSE.
Hinweise zu Lizenzen Dritter sind in THIRD_PARTY_NOTICES aufgeführt.

Schnellinstallation

Für eine schnelle Installation von WuppieFuzz auf gängigen Betriebssystemen (MacOS, Windows, Linux) siehe releases oder verwenden Sie brew install wuppiefuzz

Kurzanleitung

How to use WuppieFuzz? - YouTube

Voraussetzungen für die Entwicklung

Um das Projekt zu erstellen, müssen Sie die folgenden Abhängigkeiten und Werkzeuge installieren:

  • build-essential sudo apt install build-essential
  • pkg-config sudo apt install pkg-config
  • Rust curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Ausführen

WuppieFuzz in action.

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. Hilfe zu den Kommandozeilenargumenten erhalten Sie wie folgt:

$ cargo run -- --help # zeigt Hilfe zu erforderlichen Parametern und Flags

Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...

Um WuppieFuzz beispielsweise gegen ein Java-Ziel mit angehängtem JaCoCo-Agent auszuführen, geben Sie dessen OpenAPI-Datei an (die die URL enthält, auf der das Ziel in der API-Spezifikation läuft). 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/

Konfigurationsdatei

Wenn Sie eine Konfigurationsdatei anstelle von/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 eine Zeile für jedes Kommandozeilenargument enthalten, das Sie angeben möchten, 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 aus der Kommandozeile und aus der Konfigurationsdatei kombinieren. Da das Flag --timeout in beiden angegeben ist, hat das in der Kommandozeile angegebene Timeout (10 Sekunden) Vorrang.

Im Verzeichnis example_configs/ finden Sie zwei Beispiel-Konfigurationsdateien zur Erstellung von Coverage-Berichten mit JaCoCo für Java-Code und zur Erstellung von Coverage-Berichten mit LCOV für Python-Code.

Berichte

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:

  1. Endpoint-Coverage: Dies kann immer generiert werden, da es nur die OpenAPI-Spezifikation erfordert.
  2. Code-Coverage: Derzeit nur für JaCoCo unterstützt, aber wir streben an, mehr zu unterstützen. Der knifflige Teil ist, dass dies eine Zuordnung von Coverage zu Quelldateien sowie eine robuste Berichtsgenerierung erfordert, die diese nutzt.

Darüber hinaus wird eine Datenbank mit allen Anfrageinformationen Ihrer Fuzzing-Kampagne gefüllt. Diese Datenbank kann über das Grafana-Dashboard visualisiert und erkundet werden.

Struktur dieses Repositorys

  • assets: Logos, Bilder usw.
  • coverage_agents: Code und Anweisungen für die Coverage-Verfolgung, um sie auf verschiedene Ziele anzuwenden
  • example_configs: Beispiel-Konfigurationsdateien zur Konfiguration von WuppieFuzz
  • src: Quellcode von WuppieFuzz
  • tutorial: ein ausführliches und detailliertes Tutorial zum Fuzzing eines bestimmten Ziels und zur Interpretation von Fuzzing-Ergebnissen
  • dashboard: Werkzeuge zum Triage der Fuzzing-Ergebnisse und der Leistung

Weitere Informationen zu jedem dieser Punkte finden Sie in den READMEs in diesen Verzeichnissen.

Entwicklungs-Build

Standardmäßig bündelt WuppieFuzz seine C-Abhängigkeiten (OpenSSL, SQLite, Z3), sodass ein reguläres cargo build sofort funktioniert. Für schnellere Kompilierung während der Entwicklung können Sie alle gebündelten Abhängigkeiten deaktivieren und stattdessen gegen systeminstallierte Bibliotheken linken.

[!NOTE] Die z3-Crate erfordert Z3 4.15+, das neuer ist als die Version, die von den meisten Paketverwaltern der Linux-Distributionen ausgeliefert wird. Installieren Sie Z3 über Homebrew (brew install z3), um eine kompatible Version zu erhalten.

Systemabhängigkeiten

Installieren Sie die folgenden Bibliotheken auf Ihrem System:

Debian/Ubuntu:

sudo apt install libssl-dev libsqlite3-dev
brew install z3  # apt's libz3-dev is too old; use Homebrew instead

Unter Linux installiert Homebrew in einen nicht standardmäßigen Pfad. Fügen Sie dessen Bibliotheksverzeichnis zu Ihrer Umgebung hinzu, damit der Compiler und der Laufzeit-Linker Z3 finden können:

eval "$(brew shellenv)"
export LIBRARY_PATH="$(brew --prefix z3)/lib:$LIBRARY_PATH"
export LD_LIBRARY_PATH="$(brew --prefix z3)/lib:$LD_LIBRARY_PATH"

[!TIP] Fügen Sie die obigen Zeilen zu Ihrer ~/.bashrc oder ~/.zshrc hinzu, um sie dauerhaft zu machen.

Fedora (42+):

sudo dnf install openssl-devel sqlite-devel z3-devel

macOS (Homebrew):

brew install openssl sqlite z3

Cargo-Aliase

Das Repository enthält Cargo-Aliase in .cargo/config.toml, die mit --no-default-features bauen und gegen alle Systembibliotheken linken:

cargo dev-build          # build without vendored dependencies
cargo dev-run -- <args>  # run without vendored dependencies
cargo dev-test           # test without vendored dependencies

Dokumentation generieren

cargo doc --no-deps, um Dokumentation aus Kommentaren im Quellcode zu generieren. Die Hauptseite der Dokumentation wird target/doc/wuppiefuzz/index.html sein.

Kategorien