
LibAFL v0.16.0
高级模糊测试库 - 用Rust将你的模糊测试器组装在一起!跨核心和机器扩展。支持Windows、Android、MacOS、Linux、no_std等平台。
LibAFL,模糊测试库
高级模糊测试库 - 使用 Rust 将你自己的模糊测试器组合起来并扩展其功能。
LibAFL 是一个用 Rust 编写的可复用模糊测试器组件集合,它为你提供了现成模糊测试器的许多优势,同时又完全可定制。目前一些突出的功能包括:
fast:我们在编译时尽一切可能,保持运行时开销最小。用户在手机上的 frida 模式下达到每秒 12 万次执行(使用所有核心)。scalable:低级消息传递(简称LLMP)使LibAFL能够在核心之间几乎线性扩展,并通过 TCP 扩展到多台机器。adaptable:你可以替换LibAFL的每个部分。例如,BytesInput只是潜在输入形式之一:欢迎添加基于 AST 的输入用于结构化模糊测试,等等。multi platform:LibAFL运行在 Windows、macOS、iOS、Linux 和 Android 等平台上。LibAFL可以在no_std模式下构建,以便将LibAFL注入到嵌入式设备和虚拟机监控程序等不常见的目标中。bring your own target:我们支持纯二进制模式,如 Frida-Mode,以及多种基于源码的插桩编译通道。当然,添加自定义插桩后端也很简单。
核心概念
LibAFL 快速、多平台、兼容 no_std,并且能在核心和机器之间扩展。它提供了一个主要 crate,用于构建自定义模糊测试器的构建块 libafl,一个包含可用于目标插桩的公共代码的库 libafl_targets,以及一个提供封装编译器功能的库 libafl_cc。它集成了流行的插桩框架。目前支持的後端有:
SanitizerCoverage,在 libafl_targets 中Frida,在 libafl_frida 中QEMU用户模式和系统模式,包括用于仿真的钩子,在 libafl_qemu 中TinyInst,在 libafl_tinyinst 中,由 elbiazo 提供
构建和安装
安装依赖项
- Rust 开发语言
-
我们强烈建议不要使用例如 Linux 发行版包,因为可能过时。因此,直接安装 Rust,说明可以在 这里 找到。
-
定义最低支持的 Rust 版本。您始终可以在 LibAFL 的 Cargo.toml 中检查当前要求的版本:
如果您的已安装 Rust 版本早于 Cargo.toml 中列出的版本,请更新到最新的稳定工具链:
rustup update stable
-
- LLVM 工具
- 需要 LLVM 工具(包括 clang、clang++)(版本高于 LLVM 15.0.0,不超过 LLVM 18.1.3)。如果您使用 Debian/Ubuntu,我们强烈建议您从 这里 安装包
- Just:
- 我们使用 just 来构建
fuzzers/目录中的模糊测试器。您可以在 Just 程序员手册 中找到在您的环境中安装它的说明。
- 我们使用 just 来构建
使用以下命令克隆 LibAFL 仓库
git clone https://github.com/AFLplusplus/LibAFL
使用以下命令构建库
cargo build --release
使用以下命令构建 API 文档
cargo doc
使用以下命令浏览 LibAFL 手册(WIP!)(需要 mdbook)
cd docs && mdbook serve
入门指南
我们在 ./fuzzers 中收集了所有示例模糊测试器。
务必阅读它们的文档(和源代码),这是自然的入门方式!
just run
只要模糊测试器目录包含 Justfile 文件,您就可以使用以下命令运行每个示例模糊测试器。经过最佳测试的模糊测试器是 ./fuzzers/inprocess/libfuzzer_libpng,它是一个针对 libpng 桩的多核类似 libfuzzer 的模糊测试器,使用 LibAFL。
参考资料
- 安装指南
- 在线 API 文档
LibAFL手册(WIP)在线版 或 仓库 中- 我们的研究 论文
- 我们的 RC3 演讲 解释核心概念
- 我们的 Fuzzcon Europe 演讲,其中包含(有点过时但并非完全过时的)关于如何构建一些示例模糊测试器的逐步讨论
- Fuzzing101 的 解决方案 和 博客系列,由 epi 撰写
- 关于纯二进制模糊测试库
libaf_qemu的博客文章,Hacking TMNF - 模糊测试游戏服务器,由 RickdeJager 撰写 - LibAFL 入门工作坊,由 Jordan Whitehead 举办
贡献者
LibAFL 由以下人员编写和维护
- Andrea Fioraldi [email protected]
- Dominik Maier [email protected]
- s1341 [email protected]
- Dongjia Zhang [email protected]
- Addison Crump [email protected]
- Romain Malmain [email protected]
贡献
请查看 CONTRIBUTING.md 了解贡献指南。
调试
您的模糊测试器不如预期工作?请尝试阅读 DEBUGGING.md 了解如何调试您的问题。
引用
如果您在学术工作中使用 LibAFL,请引用以下论文:
@inproceedings{libafl,
author = {Andrea Fioraldi and Dominik Maier and Dongjia Zhang and Davide Balzarotti},
title = {{LibAFL: A Framework to Build Modular and Reusable Fuzzers}},
booktitle = {Proceedings of the 29th ACM conference on Computer and communications security (CCS)},
series = {CCS '22},
year = {2022},
month = {November},
location = {Los Angeles, U.S.A.},
publisher = {ACM},
}
许可证
根据您的选择,在 Apache 许可证 2.0 版 或 MIT 许可证 下许可。除非您明确声明,否则根据 Apache-2.0 许可证的定义,您有意提交以包含在此 crate 中的任何贡献,应按上述方式双重许可,不附加任何额外条款或条件。