TNO-S3/WuppieFuzz
GitHub: TNO-S3/WuppieFuzz
基于 LibAFL 框架的覆盖率引导 REST API 模糊测试工具,通过 OpenAPI 规范自动生成测试请求,支持黑盒到白盒多种测试场景。
Stars: 169 | Forks: 7
# WuppieFuzz v1.4.1
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)
### 简要指南
[](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 之前,你必须启动你的(已插桩的)目标应用程序。
此外,你必须为 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, 代码生成, 可视化界面, 安全性分析, 安全测试, 接口测试, 攻击性安全, 渗透测试工具, 灰盒测试, 白盒测试, 端点模糊测试, 网络流量审计, 覆盖率引导, 通知系统, 通知系统, 黑盒测试