libafl

Build custom fuzzers and run fuzzing campaigns with the LibAFL Rust library.

1|Updated Mar 19, 2026
One-click install
npx skills add https://github.com/tottenjordan/me-skittles --skill libafl-tottenjordan
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: libafl
Source: https://github.com/tottenjordan/me-skittles/tree/main/gemini/testing-handbook-skills/skills/libafl
Command: npx skills add https://github.com/tottenjordan/me-skittles --skill libafl-tottenjordan

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes references (resource) components.

What problem does it solve? Standard fuzzers like libFuzzer and AFL++ cannot handle custom mutation strategies, non-standard target architectures, or research-grade fuzzing techniques. This Skill guides you through using LibAFL, a modular Rust fuzzing library, to build fully customized fuzzers or use it as a drop-in libFuzzer replacement. ## Core Features & Use Cases - Drop-in libFuzzer Replacement: Reuse existing libFuzzer harnesses with LibAFL's compatibility runtime for long campaigns with fork mode and crash persistence. - Custom Fuzzer Construction: Assemble observers, feedback, mutators, schedulers, and executors as modular Rust components for full control over fuzzing behavior. - Advanced Campaign Features: Multi-core fuzzing, crash deduplication via backtrace hashing, dictionary and auto-token mutations, TUI monitoring, and performance tuning. - Use Case: You need to fuzz libpng with a PNG dictionary and deduplicate crashes by backtrace. Follow the worked example to build a compiler wrapper, link the harness, seed the corpus, and launch a multi-core campaign. ## Quick Start Ask the agent to set up LibAFL as a libFuzzer drop-in replacement and compile my existing harness.cc into a running fuzzer.

Frequently Asked Questions about libafl

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I use LibAFL as a libFuzzer replacement?▼

Build the libafl_libfuzzer_runtime with ./build.sh to produce libFuzzer.a, then compile your existing harness with clang++ -fsanitize=fuzzer-no-link and link against it. Run the resulting binary with a corpus directory, optionally using -fork=1 -ignore_crashes=1 for long campaigns.

LibAFL vs AFL++ vs libFuzzer: which fuzzer should I use?▼

Use libFuzzer for quick single-threaded setup, AFL++ for multi-core general-purpose fuzzing, and LibAFL when you need custom mutation strategies, feedback mechanisms, unsupported target architectures, or fuzzing research capabilities.

What LLVM version does LibAFL require?▼

LibAFL requires Clang/LLVM versions 15 through 18. Install a specific version via apt.llvm.org and set RUSTFLAGS, CC, and CXX environment variables to point to the matching clang binaries.

How do I deduplicate crashes in LibAFL?▼

Add a BacktraceObserver to the executor and combine CrashFeedback with NewHashFeedback in the objective using feedback_and!. This ensures only crashes with unique backtraces are saved to the solutions corpus.

Why is my LibAFL fuzzer not finding new coverage?▼

No coverage growth usually means instrumentation failed or the corpus lacks interesting seeds. Verify the compiler wrapper was used with -fsanitize-coverage flags and provide seed inputs that exercise meaningful code paths.

How do I debug a LibAFL fuzzer with GDB?▼

Replace the Launcher with a direct run_client call using SimpleEventManager to run in single-process mode. Then start the fuzzer under GDB with gdb --args ./fuzz --cores 0 --input corpus/.