Last verified: 2026-05-16
Use fuzzing on parsers, state machines, RPC servers, and anywhere untrusted or arbitrary bytes enter the system. Also apply randomized concurrency fuzzing to uncover scheduling and message-order bugs in lock-free code or async runtime layers.
- Memory unsafety (segfaults, use-after-free, buffer overflow when running with ASan/UBSan/MSan).
- Parser crashes and panics on malformed input.
- State-machine invariant violations and integer overflow.
- Infinite loops triggered by malformed input.
- Message-order bugs in concurrent systems (via interleaving-space fuzzing).
- Regex denial-of-service amplifiers and pathological inputs.
- High-level correctness (fuzzing stops at "did not crash"; you need an oracle for right-answer-ness).
- Bugs requiring multi-input setup or stateful interaction patterns.
- Performance regressions and resource leaks detectable only under normal operation.
libFuzzer— in-process coverage-guided fuzzer on LLVM — https://llvm.org/docs/LibFuzzer.htmlAFL/AFL++— coverage-guided binary fuzzer with excellent corpus feedback — https://github.com/AFLplusplus/AFLpluspluscargo-fuzz— libFuzzer wrapper for Rust projects — https://github.com/rust-fuzz/cargo-fuzzgo test -fuzz— Go's native fuzzing support (Go 1.18+) — https://go.dev/security/fuzz/honggfuzz— feedback-driven fuzzer with hardware-assist support — https://github.com/google/honggfuzzFlyMC— research tool for scalable distributed-system interleaving fuzzing — https://dl.acm.org/doi/10.1145/3302424.3303986
- "FlyMC: Highly Scalable Testing of Complex Interleavings in Distributed Systems" (Lukman et al., EuroSys'19) — distributed-systems interleaving fuzzer for scheduling bugs — https://dl.acm.org/doi/pdf/10.1145/3302424.3303986
- "Combining AFL and QuickCheck for Directed Fuzzing" (Dan Luu) — practical fuzzing workflow — https://danluu.com/testing/
CPU-hours to CPU-weeks depending on input complexity and coverage depth; well suited to continuous fuzzing farms and integration into CI.
- Identify each input boundary: external bytes, untrusted RPC messages, arbitrary call sequences.
- Write a fuzz target that hits the smallest meaningful entry point (parser, state machine step, handler).
- Run under sanitizers (ASan, UBSan, MSan)—fuzzing without them only catches crashes, missing memory safety.
- Seed the corpus from real samples, existing tests, or protocol examples.
- Set an exit criterion (coverage plateau or ops count) rather than unbounded wall-clock time.