24个版本 (12个破坏性更新)
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日 |
#379 在 模拟器
每月409次下载
用于 3 crate
2.5MB
67K 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
,使得 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-Mode,以及基于源代码的仪器化的多个编译遍历。当然,添加自定义仪器后端也很容易。
概述
LibAFL 是一组可重用的模糊器组件,用 Rust 编写。它快速、跨平台、与 no_std 兼容,并可以跨核心和机器扩展。
它提供了一个主要框架,为自定义模糊器提供构建模块,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/
目录中构建模糊器。您可以使用以下命令安装它:
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 的模糊器。
资源
-
我们的研究 论文
-
我们的RC3 演讲 解释核心概念
-
我们的Fuzzcon Europe 演讲,包含关于如何构建一些示例fuzzers的逐步讨论(有点过时但不算太严重)
-
关于二进制仅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许可。除非您明确声明,否则您提交的任何贡献,根据Apache-2.0许可证的定义,都应以上述双重许可方式发布,不附加任何额外条款或条件。
依赖
~4–34MB
~466K SLoC