
baby_fuzzer
book chapter (#1289)
* Clarify setup steps for the baby fuzzer Specifically: - Explicitly mention that the dependency path must point to a specific directory in the cloned repo (and not the root directory) - Explicitly mention how to manually trigger the panic in the harness for testing purposes * Clean up documentation on the baby fuzzer Since the baby fuzzer chapter of the documentation is done in a "tutorial", step-by-step fashion, it would be nice to be able to see where exactly new lines have to be placed in the existing code. To that end, the code used in the tutorial is moved to snippets (as is done in the Rust Book), as it allows for much more convenient maintenance of the snippets, as well as easy hiding of the non-important code on any given snippet. Furthermore, a few minor fixes are applied; a typo on a comment and a missing unsafe block. * Fix code snippet attributes for baby fuzzer Specifically: - Remove unnecessary `compile_fail` attribute - Add `ignore` attribute to the snippets of the complete baby fuzzer. As explained in [#1290], it is expected for the baby fuzzer to return a non-0 exit code, so this should not trigger a failure during `mdbook test`. * Fix CLI snippet language For CLI snippets, the "language" should be set to `console`. * Remove nested safe block in baby_fuzzer listings
LibAFL, the fuzzer library.
Advanced Fuzzing Library - Slot your own fuzzers together and extend their features using Rust.
LibAFL is written and maintained by
- Andrea Fioraldi andrea@aflplus.plus
- Dominik Maier dominik@aflplus.plus
- s1341 github@shmarya.net
- Dongjia Zhang toka@aflplus.plus
- Addison Crump me@addisoncrump.info
Why LibAFL?
LibAFL 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 inno_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.
Overview
LibAFL is a collection of reusable pieces of fuzzers, written in Rust. It 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.
LibAFL offers integrations with popular instrumentation frameworks. At the moment, the supported backends are:
- SanitizerCoverage, in libafl_targets
- Frida, in libafl_frida
- QEMU user-mode and system mode, including hooks for emulation, in libafl_qemu
- TinyInst, in libafl_tinyinst by elbiazo
Getting started
- Install the Dependecies
-
The Rust development language.
We highly recommend not to use e.g. your Linux distribition package as this is likely outdated. So rather install Rust directly, instructions can be found here. -
LLVM tools
The LLVM tools (including clang, clang++) are needed (newer than LLVM 11.0.0 but older than LLVM 15.0.0) -
Cargo-make
We use cargo-make to build the fuzzers infuzzers/
directory. You can install it with
cargo install cargo-make
- Clone the LibAFL repository with
git clone https://github.com/AFLplusplus/LibAFL
- Build the library using
cargo build --release
- Build the API documentation with
cargo doc
- Browse the LibAFL book (WIP!) with (requires mdbook)
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!
You can run each example fuzzer with
cargo make run
as long as the fuzzer directory has Makefile.toml
file.
The best-tested fuzzer is ./fuzzers/libfuzzer_libpng
, a multicore libfuzzer-like fuzzer using LibAFL for a libpng harness.
Resources
-
Our research paper
-
Our RC3 talk explaining the core concepts
-
Our Fuzzcon Europe talk with a (a bit but not so much outdated) step-by-step discussion on how to build some example fuzzers
-
The Fuzzing101 solutions & series of blog posts by epi
-
Blogpost on binary-only fuzzing lib libaf_qemu, Hacking TMNF - Fuzzing the game server, by RickdeJager.
Contributing
For bugs, feel free to open issues or contact us directly. Thank you for your support. <3
Even though we will gladly assist you in finishing up your PR, try to
- keep all the crates compiling with stable rust (hide the eventual non-stable code under
cfg
s) - run
cargo fmt
on your code before pushing - check the output of
cargo clippy --all
or./clippy.sh
- run
cargo build --no-default-features
to check forno_std
compatibility (and possibly add#[cfg(feature = "std")]
) to hide parts of your code.
Some of the parts in this list may be hard, don't be afraid to open a PR if you cannot fix them by yourself, so we can help.
Cite
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},
}
License
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.
Dependencies under more restrictive licenses, such as GPL or AGPL, can be enabled using the respective feature in each crate when it is present, such as the 'agpl' feature of the libafl crate.