17 个不稳定版本 (7 个破坏性更新)
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.6.1 | 2021 年 8 月 23 日 |
#41 在 模拟器
每月 125 次下载
3MB
73K 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提供了现成fuzzer的许多优点,同时可以完全自定义。目前一些突出功能包括
快速
:我们在编译时尽可能做所有事情,使运行时开销最小。用户在手机上(使用所有核心)的frida模式下达到每秒120k次执行。可扩展
:低级消息传递
(LLMP),允许LibAFL几乎线性地跨核心扩展,并通过TCP扩展到多台机器。可适应
:您可以替换LibAFL的每个部分。例如,BytesInput
只是潜在的形式输入之一:您可以自由添加基于AST的输入进行结构化模糊测试,等等。多平台
:LibAFL已确认在Windows、MacOS、Linux和Android上工作,在x86_64和aarch64上。LibAFL可以以no_std
模式构建,以将LibAFL注入到嵌入式设备和虚拟机等隐蔽目标。自定义目标
:我们支持仅二进制模式的Frida-Mode,以及基于源代码的插装的多个编译遍历。当然,添加自定义插装后端也很容易。
概述
LibAFL是一组可重用的fuzzer组件,用Rust编写。它快速、多平台、与no_std兼容,并在核心和机器之间扩展。
它提供了一个主crate,提供了自定义fuzzer的构建块,libafl,一个包含用于目标插装的常用代码的库,libafl_targets,以及一个提供包装编译器的设施的库,libafl_cc。
LibAFL提供了与流行的插装框架的集成。目前,支持的后端包括
- SanitizerCoverage,在libafl_targets
- Frida,在libafl_frida
- QEMU用户模式和系统模式,包括模拟钩子,在libafl_qemu
- TinyInst,在libafl_tinyinst中,由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/
目录中构建fuzzer。您可以使用以下命令安装它:
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
只要模糊器目录中有Makefile.toml
文件。
经过最佳测试的模糊器是./fuzzers/libfuzzer_libpng
,这是一个使用LibAFL为libpng构建程序的多核libfuzzer-like模糊器。
资源
-
我们的研究论文
-
我们的RC3演讲解释核心概念
-
我们的Fuzzcon Europe演讲,其中包含(稍微有点但不是很多过时)逐步讨论如何构建一些示例模糊器
-
关于仅二进制模糊的二进制模糊库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许可证下许可。除非您明确声明,否则您提交给本仓库的任何有意贡献,根据Apache-2.0许可证的定义,应按上述方式双重许可,而不附加任何额外条款或条件。
依赖关系
~6–43MB
~702K SLoC