TNO 开发了 WuppieFuzz,这是一个基于 LibAFL 构建的覆盖率引导型 REST API 模糊测试器。它面向广泛的终端用户,重点关注易用性、 所发现缺陷的可解释性和模块化。WuppieFuzz 支持三种测试模式(黑盒、灰盒和白盒)。
[!NOTE]
如需快速上手的分步指南,请参阅教程!
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
要构建该项目,你需要安装以下依赖项和工具:
sudo apt install build-essentialsudo apt install pkg-configcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh在运行 WuppieFuzz 之前,你必须先启动你的(已插桩的)目标 应用程序。
此外,你必须向 WuppieFuzz 提供 OpenAPI 规范, 以便它知道如何生成和变异请求。如需命令行参数的帮助, 请使用以下命令:
$ cargo run -- --help # shows help for required parameters and flags
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
例如,要对带有 JaCoCo 代理的 Java 目标运行 WuppieFuzz, 你需要指定其 OpenAPI 文件(该文件中包含目标在 API 规范中运行 的 URL)。此外,你还需要指定覆盖率格式为 JaCoCo, 并按如下方式给出 classes 目录:
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/ 下会生成一个
以时间戳命名的子目录。所有支持的覆盖率报告都会写入
该子目录。覆盖率报告有两种类型:
此外,一个数据库会记录与你的模糊测试活动相关的所有请求信息。 你可以通过 Grafana 仪表盘可视化和探索 该数据库。
有关各项的更多信息,请参阅这些目录中的 README。
默认情况下,WuppieFuzz 会内置其 C 语言依赖项(OpenSSL、SQLite、Z3),
因此普通的 cargo build 即可开箱即用。为了在开发期间加快编译速度,
你可以禁用所有内置依赖项,改为链接系统安装的
库。
[!NOTE]
z3crate 需要 Z3 4.15+,这比大多数 Linux 发行版软件包管理器 提供的版本更新。请通过 Homebrew 安装 Z3 (brew install z3)以获取兼容版本。
在你的系统上安装以下库:
Debian/Ubuntu:
sudo apt install libssl-dev libsqlite3-dev
brew install z3 # apt's libz3-dev is too old; use Homebrew instead
在 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/config.toml 中包含 cargo 别名,这些别名使用
--no-default-features 构建,并链接所有系统库:
cargo dev-build # build without vendored dependencies
cargo dev-run -- <args> # run without vendored dependencies
cargo dev-test # test without vendored dependencies
运行 cargo doc --no-deps 可从源代码中的注释生成文档。
文档主页将是
target/doc/wuppiefuzz/index.html