
Un fuzzer per API REST guidato dalla copertura, sviluppato sulla base di LibAFL
TNO ha sviluppato WuppieFuzz, un fuzzer REST API coverage-guided sviluppato su LibAFL, rivolto a un'ampia platea di utenti finali, con una forte attenzione alla facilità d'uso, all'esplicabilità dei difetti individuati e alla modularità. WuppieFuzz supporta tutte e tre le modalità di testing (black box, grey box e white box).
[!NOTE]
Per una guida rapida e passo-passo, segui il tutorial!
WuppieFuzz è stato presentato in:
Se desideri citare WuppieFuzz in un lavoro accademico, utilizza la pubblicazione preferita elencata in CITATION.cff:
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 è distribuito con licenza Apache-2.0; vedi LICENSE.
Le note sulle licenze di terze parti sono elencate in THIRD_PARTY_NOTICES.
Per un'installazione rapida di WuppieFuzz sui sistemi operativi più diffusi (MacOS,
Windows, Linux) vedi releases oppure usa brew install wuppiefuzz
Puoi creare l'immagine docker con docker build . -t wuppiefuzz:local. Per usarla, devi montare una cartella contenente la tua specifica openapi. Quando fai fuzzing su un servizio in esecuzione localmente (non in Docker), devi specificare il networking dell'host:
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
Per compilare il progetto devi installare le seguenti dipendenze e strumenti:
sudo apt install -y build-essential pkg-config cmake # General build tools
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Rust
Prima di eseguire WuppieFuzz, devi avviare la tua applicazione target (strumentata).
Inoltre, devi fornire a WuppieFuzz una specifica OpenAPI in modo che sappia come generare e mutare le sue richieste. Per assistenza sugli argomenti della riga di comando, usa quanto segue:
$ cargo run -- --help # shows help for required parameters and flags
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
Ad esempio, per eseguire WuppieFuzz contro un target Java con l'agente JaCoCo collegato, specifichi il suo file OpenAPI (contenente l'URL su cui è in esecuzione il target nella specifica API). Inoltre, specifichi che il formato di coverage è JaCoCo e indichi la directory delle classi come segue:
cargo run -- fuzz openapi.yaml --coverage-format jacoco --jacoco-class-dir ../Targets/app/target/classes/
Se vuoi usare un file di configurazione invece di/in combinazione con gli argomenti
della riga di comando, puoi usare il flag --config <CONFIG_FILE>. Nel caso in cui usi
argomenti della riga di comando in combinazione con un file di configurazione, gli argomenti della riga di comando hanno la precedenza.
Il file di configurazione deve essere un file yaml e contenere una riga per ogni argomento della riga di comando che vuoi specificare, ad esempio:
coverage_format: jacoco
output_format: human-readable
source_dir: "/swagger-petstore/src/main/java"
jacoco_class_dir: "/swagger-petstore/target"
timeout: 20
Un esempio di comando di esecuzione potrebbe in questo caso essere:
$ cargo run -- fuzz --config=config.yaml --report --coverage-host=localhost:6300 --timeout=10 ./openapi.yaml
Questa riga combinerebbe gli argomenti dalla riga di comando e dal file di
configurazione. Poiché il flag --timeout è specificato in entrambi, il timeout specificato nella
riga di comando (10 secondi) avrà la precedenza.
Nella directory example_configs/ troverai due file di configurazione di esempio da
usare per generare report di coverage con JaCoCo per codice Java e per generare
report di coverage con LCOV per codice Python.
Quando esegui WuppieFuzz con il flag --report, viene creata una sottodirectory all'interno di
reports/ con un timestamp come nome. Tutti i report di coverage supportati vengono
scritti in questa sottodirectory. Esistono due tipi di report di coverage:
Inoltre, un database viene popolato con tutte le informazioni sulle richieste relative alla tua campagna di fuzzing. Questo database può essere visualizzato ed esplorato tramite la dashboard Grafana.
Per maggiori informazioni su ciascuno di questi, vedi i README in queste directory.
Per impostazione predefinita, WuppieFuzz include le sue dipendenze C (OpenSSL, SQLite, Z3) in modo che
un normale cargo build funzioni subito. Per una compilazione più rapida durante
lo sviluppo, puoi disabilitare tutte le dipendenze incluse e collegarti invece alle
librerie installate nel sistema.
[!NOTE] Il crate
z3richiede Z3 4.15+, che è più recente della versione fornita dalla maggior parte dei gestori di pacchetti delle distribuzioni Linux. Installa Z3 tramite Homebrew (brew install z3) per ottenere una versione compatibile.
Installa le seguenti librerie sul tuo sistema:
Debian/Ubuntu: