Advanced Fuzzing Library - Slot your own fuzzers together and extend their features using Rust.
LibAFL is a collection of reusable pieces of fuzzers, written in Rust, it gives you many of the benefits of an off-the-shelf fuzzer, while being completely customizable. Some highlight features currently include:
fast
: We do everything we can at compile time, keeping runtime overhead minimal. Users reach 120k execs/sec in frida-mode on a phone (using all cores).scalable
: Low Level Message Passing
, LLMP
for short, allows LibAFL to scale almost linearly over cores, and via TCP to multiple machines.adaptable
: You can replace each part of LibAFL. For example, BytesInput
is just one potential form input:
feel free to add an AST-based input for structured fuzzing, and more.multi platform
: LibAFL was confirmed to work on Windows, MacOS, Linux, and Android on x86_64 and aarch64. LibAFL
can be built in no_std
mode to inject LibAFL into obscure targets like embedded devices and hypervisors.bring your own target
: We support binary-only modes, like Frida-Mode, as well as multiple compilation passes for sourced-based instrumentation. Of course it's easy to add custom instrumentation backends.LibAFL is fast, multi-platform, no_std compatible, and scales over cores and machines. It offers a main crate that provide building blocks for custom fuzzers, libafl, a library containing common code that can be used for targets instrumentation, libafl_targets, and a library providing facilities to wrap compilers, libafl_cc. It offers integrations with popular instrumentation frameworks. At the moment, the supported backends are:
SanitizerCoverage
, in libafl_targetsFrida
, in libafl_fridaQEMU
user-mode and system mode, including hooks for emulation, in libafl_qemuTinyInst
, in libafl_tinyinst by elbiazolibafl_concolic
, we only support LLVM version newer than 18)fuzzers/
directory. You can install it with cargo install cargo-make
git clone https://github.com/AFLplusplus/LibAFL
cargo build --release
cargo doc
cd docs && mdbook serve
We collect all example fuzzers in ./fuzzers
.
Be sure to read their documentation (and source), this is the natural way to get started!
cargo make run
You can run each example fuzzer with this following command, as long as the fuzzer directory has Makefile.toml
file. The best-tested fuzzer is ./fuzzers/inprocess/libfuzzer_libpng
, a multicore libfuzzer-like fuzzer using LibAFL for a libpng harness.
LibAFL is written and maintained by
Please check out CONTRIBUTING.md for the contributing guideline.
If you use LibAFL for your academic work, please cite the following paper:
@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},
}
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.