
Un fuzzer de API REST guiado por cobertura desarrollado sobre LibAFL
TNO desarrolló WuppieFuzz, un fuzzer de API REST guiado por cobertura construido sobre LibAFL, dirigido a un amplio público de usuarios finales, con un fuerte enfoque en la facilidad de uso, la explicabilidad de los fallos descubiertos y la modularidad. WuppieFuzz admite los tres modos de pruebas (caja negra, caja gris y caja blanca).
[!NOTE]
Para una guía rápida y paso a paso, ¡sigue el tutorial!
WuppieFuzz ha aparecido en:
Si deseas citar WuppieFuzz en un trabajo académico, utiliza la publicación preferida que figura en 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 está licenciado bajo Apache-2.0; consulta LICENSE.
Los avisos de licencias de terceros se enumeran en THIRD_PARTY_NOTICES.
Para una instalación rápida de WuppieFuzz en los sistemas operativos más populares (MacOS,
Windows, Linux), consulta releases o usa brew install wuppiefuzz
Puedes construir la imagen de Docker con docker build . -t wuppiefuzz:local. Para usarla, debes montar una carpeta que contenga tu especificación OpenAPI. Al hacer fuzzing de un servicio que se ejecuta localmente (no en Docker), debes especificar el modo de red del 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
Para construir el proyecto necesitas instalar las siguientes dependencias y herramientas:
sudo apt install -y build-essential pkg-config cmake # General build tools
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Rust
Antes de ejecutar WuppieFuzz, debes iniciar tu aplicación objetivo (instrumentada).
Además, debes proporcionar a WuppieFuzz una especificación OpenAPI para que sepa cómo generar y mutar sus peticiones. Para obtener ayuda sobre los argumentos de línea de comandos, usa lo siguiente:
$ cargo run -- --help # shows help for required parameters and flags
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
Por ejemplo, para ejecutar WuppieFuzz contra un objetivo Java con el agente JaCoCo adjunto, especificas su archivo OpenAPI (que contiene la URL en la que se ejecuta el objetivo en la especificación de la API). Además, especificas que el formato de cobertura es JaCoCo y proporcionas el directorio de clases de la siguiente manera:
cargo run -- fuzz openapi.yaml --coverage-format jacoco --jacoco-class-dir ../Targets/app/target/classes/
Si deseas usar un archivo de configuración en lugar de (o en combinación con) los argumentos
de línea de comandos, puedes usar el flag --config <CONFIG_FILE>. En caso de que uses
argumentos de línea de comandos junto con un archivo de configuración, los argumentos de línea
de comandos tienen prioridad.
El archivo de configuración debe ser un archivo yaml y contener una línea por cada argumento de línea de comandos que desees especificar, por ejemplo:
coverage_format: jacoco
output_format: human-readable
source_dir: "/swagger-petstore/src/main/java"
jacoco_class_dir: "/swagger-petstore/target"
timeout: 20
Un comando de ejecución de ejemplo podría ser en este caso:
$ cargo run -- fuzz --config=config.yaml --report --coverage-host=localhost:6300 --timeout=10 ./openapi.yaml
Esta línea combinaría los argumentos de la línea de comandos y del archivo de
configuración. Dado que el flag --timeout se especifica en ambos, el timeout especificado en
la línea de comandos (10 segundos) tendrá prioridad.
En el directorio example_configs/ encontrarás dos archivos de configuración de ejemplo para
usar al generar informes de cobertura con JaCoCo para código Java y para generar
informes de cobertura con LCOV para código Python.
Cuando ejecutas WuppieFuzz con el flag --report, se crea un subdirectorio dentro de
reports/ con una marca de tiempo como nombre. Todos los informes de cobertura admitidos se
escriben en este subdirectorio. Hay dos tipos de informes de cobertura:
Además de esto, se llena una base de datos con toda la información de las peticiones relacionada con tu campaña de fuzzing. Esta base de datos se puede visualizar y explorar a través del panel de Grafana.
Para más información sobre cada uno de estos, consulta los README en estos directorios.
Por defecto, WuppieFuzz incluye sus dependencias de C (OpenSSL, SQLite, Z3) para que
un cargo build normal funcione sin configuración adicional. Para una compilación más rápida durante
el desarrollo, puedes deshabilitar todas las dependencias incluidas y enlazar contra
bibliotecas instaladas en el sistema en su lugar.