
WuppieFuzz v1.7.1
基于 LibAFL 开发的覆盖率引导型 REST API 模糊测试器
WuppieFuzz v1.7.1
TNO 开发了 WuppieFuzz,这是一个基于 LibAFL 构建的覆盖引导型 REST API 模糊测试工具,面向广泛的最终用户群体,重点关注易用性、已发现缺陷的可解释性和模块化。WuppieFuzz 支持所有三种测试模式(黑盒、灰盒和白盒)。
[!NOTE]
如需快速、跟随式指导,请参阅教程!
媒体报道
WuppieFuzz 已在以下媒体中亮相:
- 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
学术出版物
如果您想在学术工作中引用 WuppieFuzz,请使用 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 采用 Apache-2.0 许可证;请参阅 LICENSE。
第三方许可证声明列于 THIRD_PARTY_NOTICES 中。
快速安装
如需在主流操作系统(MacOS、Windows、Linux)上快速安装 WuppieFuzz,请参阅 releases 或使用 brew install wuppiefuzz
简要使用指南
开发前置条件
要构建该项目,您需要安装以下依赖项和工具:
- 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
运行
在运行 WuppieFuzz 之前,您必须启动您的(已插桩的)目标应用程序。
此外,您必须向 WuppieFuzz 提供一份 OpenAPI 规范,以便它知道如何生成和变异其请求。如需了解命令行参数的帮助,请使用以下命令:
$ cargo run -- --help # 显示所需参数和标志的帮助信息
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
例如,要对附加了 JaCoCo 代理的 Java 目标运行 WuppieFuzz,您需要指定其 OpenAPI 文件(在 API 规范中包含目标运行时的 URL)。此外,您还需要指定覆盖率格式为 JaCoCo,并按如下方式给出类目录:
cargo run -- fuzz openapi.yaml --coverage-format jacoco --jacoco-class-dir ../Targets/app/target/classes/
配置文件
如果您想使用配置文件来代替/结合命令行参数,可以使用 --config <CONFIG_FILE> 标志。如果您将命令行参数与配置文件结合使用,命令行参数将优先。
配置文件应为 yaml 文件,并为每个您想指定的命令行参数包含一行,例如:
coverage_format: jacoco
output_format: human-readable
source_dir: "/swagger-petstore/src/main/java"
jacoco_class_dir: "/swagger-petstore/target"
timeout: 20
在这种情况下,示例运行命令可以是:
$ cargo run -- fuzz --config=config.yaml --report --coverage-host=localhost:6300 --timeout=10 ./openapi.yaml
此行将结合命令行和配置文件中的参数。由于 --timeout 标志在两者中均有指定,命令行中指定的超时时间(10 秒)将优先。
在 example_configs/ 目录中,您会找到两个示例配置文件,分别用于为 Java 代码生成 JaCoCo 覆盖率报告和为 Python 代码生成 LCOV 覆盖率报告。
报告
当您使用 --report 标志运行 WuppieFuzz 时,会在 reports/ 内创建一个以时间戳命名的子目录。所有受支持的覆盖率报告都会写入此子目录。有两种类型的覆盖率报告:
- 端点覆盖率:此报告始终可以生成,因为它只需要 OpenAPI 规范。
- 代码覆盖率:目前仅支持 JaCoCo,但我们计划支持更多。难点在于这需要覆盖率到源文件的映射,以及使用此映射的稳健报告生成。
此外,还会填充一个数据库,其中包含与您的模糊测试活动相关的所有请求信息。该数据库可以通过 Grafana 仪表板进行可视化和探索。
本仓库的结构
- assets:徽标、图片等。
- coverage_agents:用于附加到各种目标上的覆盖率跟踪代码和说明。
- example_configs:用于配置 WuppieFuzz 的示例配置文件。
- src:WuppieFuzz 的源代码。
- tutorial:关于如何对特定目标进行模糊测试以及如何解释模糊测试结果的深入、底层教程。
- dashboard:用于分类模糊测试结果和性能的工具。
有关每一项的更多信息,请参阅这些目录中的 README。
开发构建
默认情况下,WuppieFuzz 会内置其 C 依赖项(OpenSSL、SQLite、Z3),因此常规的 cargo build 即可开箱即用。为了在开发期间加快编译速度,您可以禁用所有内置依赖项,改为链接系统安装的库。
[!NOTE]
z3crate 需要 Z3 4.15+,这比大多数 Linux 发行版包管理器提供的版本更新。请通过 Homebrew(brew install z3)安装 Z3 以获取兼容版本。
系统依赖项
在您的系统上安装以下库:
Debian/Ubuntu:
sudo apt install libssl-dev libsqlite3-dev
brew install z3 # apt 的 libz3-dev 太旧;请改用 Homebrew
在 Linux 上,Homebrew 安装到非标准路径。请将其库目录添加到您的环境中,以便编译器和运行时链接器能够找到 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] 将上述行添加到您的
~/.bashrc或~/.zshrc中,使其永久生效。
Fedora (42+):
sudo dnf install openssl-devel sqlite-devel z3-devel
macOS (Homebrew):
brew install openssl sqlite z3
Cargo 别名
本仓库在 .cargo/config.toml 中包含 cargo 别名,这些别名使用 --no-default-features 构建,链接所有系统库:
cargo dev-build # 不使用内置依赖项构建
cargo dev-run -- <args> # 不使用内置依赖项运行
cargo dev-test # 不使用内置依赖项测试
生成文档
运行 cargo doc --no-deps 可从源代码中的注释生成文档。文档的主页将是 target/doc/wuppiefuzz/index.html。
