TNO-S3/WuppieFuzz

GitHub: TNO-S3/WuppieFuzz

基于 LibAFL 框架的覆盖率引导 REST API 模糊测试工具,通过 OpenAPI 规范自动生成测试请求,支持黑盒到白盒多种测试场景。

Stars: 169 | Forks: 7

# WuppieFuzz v1.4.1 Logo of WuppieFuzz. TNO 开发了 WuppieFuzz,这是一个基于 LibAFL 的覆盖率引导 REST API fuzzer,面向广泛的最终用户,重点关注易用性、发现缺陷的可解释性和模块化。WuppieFuzz 支持所有三种测试设置(黑盒、灰盒和白盒)。WuppieFuzz 曾在 [the ONE Conference e-magazine 2024](https://emagazine.one-conference.nl/2024/finally-validate-your-publicly-exposed-interfaces-with-ease/) 中亮相。 ## 快速安装 要在流行的操作系统(MacOS、Windows、Linux)上快速安装 WuppieFuzz,请查看 [releases](https://github.com/TNO-S3/WuppieFuzz/releases/) 或使用 [`brew install wuppiefuzz`](https://formulae.brew.sh/formula/wuppiefuzz) ### 简要指南 [![How to use WuppieFuzz? - YouTube](https://raw.githubusercontent.com/TNO-S3/WuppieFuzz/main/assets/demo_video.png)](https://www.youtube.com/watch?v=-oR4d9aXrqo) ## 开发前置条件 要构建项目,你需要安装以下依赖和工具 - 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 in action. 在运行 WuppieFuzz 之前,你必须启动你的(已插桩的)目标应用程序。 此外,你必须为 WuppieFuzz 提供一个 **OpenAPI-specification**,以便它知道如何生成和变异其请求。有关命令行参数的帮助,请使用以下命令: ``` $ cargo run -- --help # shows help for required parameters and flags Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML] ... ``` 例如,要针对附带 JaCoCo agent 的 Java 目标运行 WuppieFuzz,你需要指定其 OpenAPI 文件(其中包含目标运行 URL 的 API 规范)。此外,你需要指定 coverage format 为 JaCoCo,并按如下方式给出 classes 目录: ``` cargo run -- fuzz openapi.yaml --coverage-format jacoco --jacoco-class-dir ../Targets/app/target/classes/ ``` ## 配置文件 如果你想使用配置文件代替/结合命令行参数,可以使用标志 `--config `。如果你将命令行参数与配置文件结合使用,命令行参数具有优先权。 配置文件应为 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` 在两者中都有指定,因此命令行中指定的 timeout(10 秒)将具有优先权。 在 `example_configs/` 目录中,你会发现两个示例配置文件,分别用于使用 JaCoCo 为 Java 代码生成覆盖率报告,以及使用 LCOV 为 Python 代码生成覆盖率报告。 ## 报告 当你使用 `--report` 标志运行 WuppieFuzz 时,会在 `reports/` 内部创建一个以时间戳命名的子目录。所有支持的覆盖率报告都会写入此子目录。有两种类型的覆盖率报告: 1. **endpoint coverage**:这总是可以生成的,因为它只需要 OpenAPI-spec。 2. **code coverage**:目前仅支持 JaCoCo,但我们的目标是支持更多。棘手的部分是这需要从覆盖率到源文件的映射,以及使用此映射的稳健报告生成。 在此基础上,数据库会填充与你的 fuzzing 活动相关的所有请求信息。该数据库可以通过 Grafana dashboard 进行可视化和探索。 ## 仓库结构 - **assets**: logos, images, etc. - **coverage_agents**: 用于覆盖率跟踪的代码和说明,可附加到各种目标上 - **example_configs**: 用于配置 WuppieFuzz 的示例配置文件 - **src**: WuppieFuzz 的源代码 - **tutorial**: 关于如何 fuzz 特定目标以及如何解释 fuzzing 结果的深入且底层的教程 - **dashboard**: 用于分类 fuzzing 结果和性能的工具 有关每项的更多信息,请参阅这些目录中的 README。 ## 生成文档 `cargo doc --no-deps` 用于从源代码中的注释生成文档。文档的主页面将是 `target/doc/wuppiefuzz/index.html`
标签:API 安全, CISA项目, Fuzzing, LibAFL, OpenAPI, REST API, Rust, TNO, Web 安全, WuppieFuzz, 代码生成, 可视化界面, 安全性分析, 安全测试, 接口测试, 攻击性安全, 渗透测试工具, 灰盒测试, 白盒测试, 端点模糊测试, 网络流量审计, 覆盖率引导, 通知系统, 通知系统, 黑盒测试