Torna agli aggiornamenti
New releaseAug 30, 2026

WuppieFuzz v1.7.1

Un fuzzer per API REST guidato dalla copertura, sviluppato sulla base di LibAFL

Condividi

WuppieFuzz v1.8.0

Logo di WuppieFuzz.

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!

Copertura mediatica

WuppieFuzz è stato presentato in:

Pubblicazione scientifica

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

Licenza

WuppieFuzz è distribuito con licenza Apache-2.0; vedi LICENSE.
Le note sulle licenze di terze parti sono elencate in THIRD_PARTY_NOTICES.

Installazione rapida

Per un'installazione rapida di WuppieFuzz sui sistemi operativi più diffusi (MacOS, Windows, Linux) vedi releases oppure usa brew install wuppiefuzz

Docker

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

Breve guida pratica

How to use WuppieFuzz? - YouTube

Prerequisiti per lo sviluppo

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

Esecuzione

WuppieFuzz in azione.

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/

File di configurazione

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.

Report

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:

  1. endpoint coverage: può essere sempre generato poiché richiede solo la specifica OpenAPI.
  2. code coverage: attualmente supportato solo per JaCoCo, ma puntiamo a supportarne altri. La parte complicata è che questo richiede una mappatura dal coverage ai file sorgente, e una generazione di report robusta che la utilizzi.

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.

Struttura di questo repository

  • assets: loghi, immagini, ecc.
  • coverage_agents: codice e istruzioni per il tracciamento del coverage da applicare a vari target
  • example_configs: file di configurazione di esempio per configurare WuppieFuzz
  • src: codice sorgente di WuppieFuzz
  • tutorial: un tutorial approfondito e di basso livello su come fare fuzzing di uno specifico target e su come interpretare i risultati del fuzzing
  • dashboard: strumenti per il triage dei risultati del fuzzing e delle prestazioni

Per maggiori informazioni su ciascuno di questi, vedi i README in queste directory.

Build di sviluppo

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 z3 richiede 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.

Dipendenze di sistema

Installa le seguenti librerie sul tuo sistema:

Debian/Ubuntu:

Categorie