LibAFLstar/LibAFLstar
GitHub: LibAFLstar/LibAFLstar
基于 LibAFL 的快速状态感知协议模糊测试框架,用于高效发现网络协议实现中的状态相关安全漏洞。
Stars: 15 | Forks: 1
# LibAFLstar: 快速且具备状态感知的协议 Fuzzing
本代码仓库包含即将在 **ESORICS 2025** 发表的论文 **LibAFLstar: Fast and State-aware Protocol Fuzzing** 的工件和资源。
如果您使用本代码,请按如下格式引用该论文:
```
@inproceedings{libaflstar,
title = {LibAFLstar: Fast and State-Aware Protocol Fuzzing},
author = {Daniele, Cristian and Bethe, Timme and Maugeri, Marcello and Continella, Andrea and Poll, Erik},
year = {2025},
}
```
**注意:** 该引用为占位符,将在论文正式发表后更新。
### 代码仓库结构
- `case_studies`:包含运行 LibAFLstar 的案例研究,包括 Dockerfile 和初始语料库。
- `benchmark`:包含每个案例研究中 AFLNet、ChatAFL 和 LibAFLstar 的部分结果。
- `src`:包含 LibAFLstar 的源代码。
- `Dockerfile`:包含用于构建 Fuzzer 镜像的 Dockerfile。
### 快速入门
为了保证可复现性,我们提供了一些 Dockerfile 来构建环境并运行示例。
在根目录下,您可以找到用于构建 Fuzzer 镜像的 Dockerfile。
在 `case_studies` 目录中,您可以找到每个案例研究的 Dockerfile,这些文件需要以 Fuzzer 镜像作为基础镜像。
构建并运行后,每个案例研究都有一个 `run.sh` 脚本,用于以所需的配置运行 Fuzzer。
#### 如何构建基础镜像
`docker build -t libaflstar .`
#### 构建所有案例研究
```
./build_all.sh
```
此脚本将构建基础镜像和所有案例研究。
#### 如何运行案例研究(例如 live555)
```
docker run -d -v "$(pwd)/benchmark/live555":/results --rm libaflstar_live555 -b mcsm-cy -l 1000 -t 24h
```
此命令将使用 `mcsm-cy` 二进制文件运行 `live555` 案例研究,循环次数为 1000 次,超时时间为 24 小时。结果将存储在 `benchmark/live555` 目录中。
#### 运行案例研究的选项
##### 配置
`-b` 或 `--bin` 指定 Fuzzer 运行的具体配置。
每个配置都是状态感知级别和 Fuzzer 使用的状态调度器的组合。
###### 状态感知选项
- `mcmm`:多语料库和多(边覆盖率)Map (Multiple Corpora and Multiple Map)
- `mcsm`:多语料库和单(边覆盖率)Map (Multiple Corpora and Single Map)
- `sc`:单语料库(以及单元数据;隐含)
###### 状态调度器选项
- `cy`:Cycler - Fuzzer 将在协议的状态之间循环,试图覆盖所有状态。
- `oe`:Outgoing Edges - Fuzzer 将优先关注具有更多出边的状态(如语料库中每个状态的 `metadata` 文件中所标识)。
- `ns`:Novelty Search - Fuzzer 将关注尚未探索的状态,试图覆盖所有状态。
- `no`:Novelty Search + Outgoing Edges - Fuzzer 将关注尚未探索的状态,试图覆盖所有状态,同时优先考虑具有更多出边的状态。
因此,例如 `libaflstar-ftp-mcmm-cy` 是针对 FTP 的 LibAFLstar,使用多语料库、多 Map 以及 Cycler 状态调度器。
### 结果解读
每个案例研究的结果都组织在 `benchmark` 目录中。对于每个案例研究,您会发现包含不同 Fuzzing 活动输出的子文件夹。
**结构:**
- 每个子目录(例如 `bftpd/`、`lightftp/`)包含:
- **LibAFLstar 结果:** 名为 `mcmm-cy-1000-1h/`、`mcsm-oe-10-1h/` 等的文件夹。每个文件夹对应特定的配置(二进制文件、循环次数、时间),并包含该运行的语料库、日志和统计数据。
- **AFLNet/ChatAFL 结果:** 像 `out-bftpd-aflnet_1.tar.gz` 或 `out-bftpd-chatafl_1.tar.gz` 这样的文件是来自 AFLNet 和 ChatAFL 的结果压缩包。
- **Replay 文件夹:** 诸如 `out-aflnet-replay/` 和 `out-chatafl-replay/` 之类的文件夹包含使用 LibAFLstar 重放跟踪以获得可比较结果的结果。
**命名约定:**
- 文件夹名称编码了配置:
- `mcmm-cy-1000-1h/` 表示:
- **mcmm-cy**:使用的 Fuzzer 二进制文件/策略
- **1000**:循环次数
- **1h**:运行持续时间
- 压缩包名称遵循以下模式:
- `out-[case_study]-[aflnet/chatafl]_1.tar.gz`
**在每个结果文件夹内:**
- 您通常会发现:
- `stats.json`:一个包含与时间相关的语料库统计信息的 JSON 文件。
- `total_stats_info.txt`:一个总结运行总统计信息的文本文件。此外,在末尾,它包含覆盖率 Map。
#### 如何在不使用 Docker 的情况下使用 LibAFLstar
只需复现 Dockerfile 中的步骤来构建 Fuzzer。
请注意,由于 fork-server 机制的一些更改以及 Rust 的 nightly 构建,它需要特定版本的 AFL++ 才能编译 Fuzzer。
#### 运行 LightFTP 案例研究的示例说明
- 示例:
`cargo run --release --bin LibAFLstar-ftp-mcmm-cy -- --in-dir case_studies/lightftp/corpus --out-dir --target-port --loops 100 -t 300 case_studies/lightftp/ case_studies/lightftp/fftp.conf `
#### 重放跟踪的示例说明
`cargo run --release --bin aflnet-traces-replayer -- --in-dir benchmark/out-lightftp-aflnet/replayable-queue --out-dir out-replay --target-port case_studies/lightftp/LightFTP/Source/Release/fftp case_studies/lightftp/fftp.conf `
#### 复现 AFLNet/ChatAFL 结果
每个案例研究的 AFLNet 和 ChatAFL 结果可以在 benchmark 目录的 tar.gz 文件中找到。
要重放跟踪,您需要将 tar.gz 文件复制到容器中:
```
docker cp [path_to]/out-[case_study]-aflnet_1.tar.gz [container_id]:/
```
之后,您可以使用以下命令重放跟踪:
```
docker exec -it [container_id] /bin/bash
cd /
tar -xzvf out-[case_study]-[aflnet/chatafl]_1.tar.gz
cargo run --release --bin aflnet-traces-replayer -- --in-dir out-[case_study]-[aflnet/chatafl]_1/replayable-queue --out-dir out-replay --target-port [port] [copy the last part from the run.sh script]
```
最后,从容器中提取结果:
```
docker cp [container_id]:/out-replay .
```
重放器将生成 `out-replay` 目录,其中包含使用 LibAFLstar 重放跟踪的结果。
标签:AFLNet, ChatAFL, DNS解析, Docker, ESORICS 2025, LibAFL, Live555, TLS抓取, 协议安全, 协议模糊测试, 可视化界面, 安全防御评估, 开源项目, 情报收集, 漏洞研究, 状态感知, 网络安全, 请求拦截, 软件安全, 通知系统, 通知系统, 隐私保护