
WuppieFuzz v1.7.1
Un fuzzer de API REST guiado por cobertura desarrollado sobre LibAFL
WuppieFuzz v1.7.1
TNO desarrolló WuppieFuzz, un fuzzer de API REST guiado por cobertura desarrollado sobre LibAFL, dirigido a una amplia audiencia de usuarios finales, con un fuerte enfoque en la facilidad de uso, la explicabilidad de las fallas descubiertas y la modularidad. WuppieFuzz admite las tres modalidades de pruebas (caja negra, caja gris y caja blanca).
[!NOTE]
Para una guía rápida paso a paso, siga el tutorial!
Cobertura mediática
WuppieFuzz ha aparecido en:
- The ONE Conference e-magazine 2024
- Test your APIs easily with TNO's new REST API fuzzer
- OpenAPI.tools listing: WuppieFuzz
- Automated REST API Vulnerability Detection with WuppieFuzz (Nordic APIs on YouTube)
- Thoughtworks Technology Radar: WuppieFuzz
Publicación científica
Si desea citar WuppieFuzz en trabajos académicos, utilice la publicación preferida que se indica 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
Licencia
WuppieFuzz está licenciado bajo Apache-2.0; consulte LICENSE.
Los avisos de licencias de terceros se enumeran en THIRD_PARTY_NOTICES.
Instalación rápida
Para la instalación rápida de WuppieFuzz en sistemas operativos populares (MacOS,
Windows, Linux), consulte releases o use brew install wuppiefuzz
Breve guía de uso
Requisitos previos para el desarrollo
Para compilar el proyecto, debe instalar las siguientes dependencias y herramientas:
- 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
Ejecución
Antes de ejecutar WuppieFuzz, debe iniciar su aplicación objetivo (instrumentada).
Además, debe proporcionar a WuppieFuzz una especificación OpenAPI para que sepa cómo generar y mutar sus solicitudes. Para obtener ayuda sobre los argumentos de la línea de comandos, use lo siguiente:
$ cargo run -- --help # muestra ayuda para los parámetros y banderas requeridos
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
Por ejemplo, para ejecutar WuppieFuzz contra un objetivo Java con el agente JaCoCo adjunto, especifique su archivo OpenAPI (que contiene la URL donde se ejecuta el objetivo en la especificación de la API). Además, especifique que el formato de cobertura es JaCoCo y proporcione el directorio de clases de la siguiente manera:
cargo run -- fuzz openapi.yaml --coverage-format jacoco --jacoco-class-dir ../Targets/app/target/classes/
Archivo de configuración
Si desea usar un archivo de configuración en lugar de/en combinación con los argumentos
de la línea de comandos, puede usar la bandera --config <CONFIG_FILE>. Si usa
argumentos de la línea de comandos en combinación con un archivo de configuración, los
argumentos de la línea de comandos tienen prioridad.
El archivo de configuración debe ser un archivo yaml y contener una línea para cada argumento de la línea de comandos que desee 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 en este caso podría ser:
$ 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 la bandera --timeout se especifica en ambos, el tiempo de
espera especificado en la línea de comandos (10 segundos) tendrá prioridad.
En el directorio example_configs/ encontrará dos archivos de configuración de ejemplo
para generar informes de cobertura con JaCoCo para código Java y para generar
informes de cobertura con LCOV para código Python.
Informes
Cuando ejecute WuppieFuzz con la bandera --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:
- cobertura de endpoints: siempre se puede generar, ya que solo requiere la especificación OpenAPI.
- cobertura de código: actualmente solo es compatible con JaCoCo, pero nuestro objetivo es admitir más. La parte complicada es que requiere un mapeo de la cobertura a los archivos fuente y una generación robusta de informes que lo utilice.
Además, se llena una base de datos con toda la información de solicitudes relacionada con su campaña de fuzzing. Esta base de datos se puede visualizar y explorar a través del panel de Grafana.
Estructura de este repositorio
- assets: logotipos, imágenes, etc.
- coverage_agents: código e instrucciones para el seguimiento de cobertura que se aplican a varios objetivos
- example_configs: archivos de configuración de ejemplo para configurar WuppieFuzz
- src: código fuente de WuppieFuzz
- tutorial: un tutorial detallado y de bajo nivel sobre cómo hacer fuzzing a un objetivo específico y cómo interpretar los resultados del fuzzing
- dashboard: herramientas para clasificar los resultados del fuzzing y el rendimiento
Para obtener más información sobre cada uno de estos, consulte los README en estos directorios.
Compilación de desarrollo
De forma predeterminada, WuppieFuzz incluye sus dependencias C (OpenSSL, SQLite, Z3) para que
una compilación regular con cargo build funcione sin configuración adicional. Para una
compilación más rápida durante el desarrollo, puede deshabilitar todas las dependencias incluidas
y vincular con las bibliotecas instaladas en el sistema.
[!NOTE] La crate
z3requiere Z3 4.15+, que es más reciente que la versión incluida por la mayoría de los gestores de paquetes de distribuciones Linux. Instale Z3 mediante Homebrew (brew install z3) para obtener una versión compatible.
Dependencias del sistema
Instale las siguientes bibliotecas en su sistema:
Debian/Ubuntu:
sudo apt install libssl-dev libsqlite3-dev
brew install z3 # apt's libz3-dev is too old; use Homebrew instead
En Linux, Homebrew instala en una ruta no estándar. Agregue su directorio de bibliotecas a su entorno para que el compilador y el enlazador en tiempo de ejecución puedan encontrar Z3:
eval "$(brew shellenv)"
export LIBRARY_PATH="$(brew --prefix z3)/lib:$LIBRARY_PATH"
export LD_LIBRARY_PATH="$(brew --prefix z3)/lib:$LD_LIBRARY_PATH"
[!TIP] Agregue las líneas anteriores a su
~/.bashrco~/.zshrcpara que sean permanentes.
Fedora (42+):
sudo dnf install openssl-devel sqlite-devel z3-devel
macOS (Homebrew):
brew install openssl sqlite z3
Alias de Cargo
El repositorio incluye alias de cargo en .cargo/config.toml que compilan con
--no-default-features, vinculando con todas las bibliotecas del sistema:
cargo dev-build # compilar sin dependencias incluidas
cargo dev-run -- <args> # ejecutar sin dependencias incluidas
cargo dev-test # probar sin dependencias incluidas
Generación de documentación
cargo doc --no-deps para generar documentación a partir de los comentarios en el código
fuente. La página principal de la documentación será
target/doc/wuppiefuzz/index.html
