22个版本 (11个破坏性更新)
0.13.2 | 2024年7月31日 |
---|---|
0.12.0 | 2024年4月12日 |
0.11.2 | 2023年12月21日 |
0.11.1 | 2023年8月31日 |
0.5.0 | 2021年7月5日 |
#359 in 测试
每月125次下载
3MB
76K SLoC
LibAFL,模糊器库。
高级模糊库 - 使用Rust将你的模糊器组合在一起并扩展其功能。
LibAFL由以下人员编写和维护:
- Andrea Fioraldi [email protected]
- Dominik Maier [email protected]
- s1341 [email protected]
- Dongjia Zhang [email protected]
- Addison Crump [email protected]
- Romain Malmain [email protected]
为什么选择LibAFL?
LibAFL提供了现成模糊器的许多好处,同时可完全自定义。目前一些突出功能包括
fast
:我们在编译时尽可能做所有事情,将运行时开销保持在最低。用户在手机的 Frida 模式下达到每秒 120k 次执行(使用所有核心)。scalable
:简称为LLMP
的Low Level Message Passing
允许 LibAFL 几乎线性地跨越核心,并通过 TCP 到多台机器扩展。adaptable
:您可以替换 LibAFL 的每个部分。例如,BytesInput
只是一种潜在的形式输入:您可以自由地添加基于 AST 的输入进行结构化模糊测试,等等。multi platform
:LibAFL 已在 Windows、MacOS、Linux 和 Android 上确认工作,支持 x86_64 和 aarch64。LibAFL 可以在no_std
模式下构建,以便将 LibAFL 注入到嵌入式设备和虚拟机等难以触及的目标中。bring your own target
:我们支持仅二进制模式,如 Frida 模式,以及基于源代码的仪器化的多个编译遍历。当然,添加自定义仪器后端也很容易。
概述
LibAFL 是一组可重用的模糊器组件,用 Rust 编写。它速度快,跨平台,兼容 no_std,并可在核心和机器上扩展。
它提供了一个主要仓库,提供构建自定义模糊器的构建块,libafl,一个包含通用代码的库,可用于目标仪器化,libafl_targets,以及一个提供封装编译器的设施的库,libafl_cc。
LibAFL 提供了与流行的仪器框架的集成。目前,支持的后端包括
- SanitizerCoverage,在 libafl_targets
- Frida,在 libafl_frida
- QEMU 用户模式和系统模式,包括模拟钩子,在 libafl_qemu
- TinyInst,在 libafl_tinyinst by elbiazo
入门指南
- 安装依赖
-
Rust 开发语言。
我们强烈建议不要使用例如您的 Linux 发行版软件包,因为这可能是过时的。因此,请直接安装 Rust,安装说明可在此处找到这里。 -
LLVM 工具
需要 LLVM 工具(包括 clang、clang++),版本应高于 LLVM 15.0.0,低于 LLVM 18.1.3)。如果您使用 Debian/Ubuntu,我们再次强烈建议您从此处安装软件包。
(在 libafl_concolic
中,我们仅支持高于 18 的 LLVM 版本)
- Cargo-make
我们使用 cargo-make 来构建位于fuzzers/
目录中的模糊器。您可以使用以下命令安装它:
cargo install cargo-make
- 使用以下命令克隆 LibAFL 仓库:
git clone https://github.com/AFLplusplus/LibAFL
- 使用以下命令构建库:
cargo build --release
- 使用以下命令构建 API 文档:
cargo doc
- 使用以下命令浏览 LibAFL 书籍(WIP!):
cd docs && mdbook serve
我们收集了所有示例模糊器,在 ./fuzzers
中。请务必阅读其文档(和源代码),这是 自然开始的方式!
您可以使用以下命令运行每个示例模糊器:
cargo make run
只要fuzzer目录中存在Makefile.toml
文件。
经过最佳测试的fuzzer是./fuzzers/libfuzzer_libpng
,这是一个使用LibAFL进行libpng harness的类似libfuzzer的多核fuzzer。
资源
-
我们的研究论文
-
我们的RC3 演讲解释了核心概念
-
我们的Fuzzcon Europe 演讲中有一个(有点但不是那么过时的)逐步讨论如何构建一些示例fuzzer
-
关于仅二进制fuzzing库libaf_qemu的博客文章,Hacking TMNF - Fuzzing the game server,由RickdeJager撰写。
贡献
请查阅CONTRIBUTING.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 License, Version 2.0或MIT许可证。除非您明确声明,否则您提交给此crate的任何有意贡献,根据Apache-2.0许可证定义,应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~23–58MB
~1M SLoC