go/chrome-fuzzing (Googler only)
Fuzzing is a testing technique that feeds randomized inputs to a target code in an attempt to crash it. It's one of the most effective methods we have for finding security and stability issues (go/fuzzing-success).
This documentation covers the in-process guided fuzzing approach employed by different fuzzing engines, such as libFuzzer or AFL. To learn more about out-of-process fuzzers, please refer to the Blackbox fuzzing page in the ClusterFuzz documentation.
[TOC]
In Chromium, you can easily create and submit fuzz targets. The targets are automatically discovered by buildbots, built with different fuzzing engines, then uploaded to the distributed ClusterFuzz fuzzing system to run at scale.
Create your first fuzz target and submit it by stepping through our Getting Started Guide.
-
Improving fuzz target effectiveness: Efficient Fuzzer Guide.
-
Creating a fuzz target that expects a protobuf (instead of a byte steam) as input: Guide to libprotobuf-mutator (LPM).
Note: you can also use LPM to fuzz code that needs multiple mutated inputs, or to generate inputs defined by a grammar.
-
Reproducing bugs found by libFuzzer/AFL and reported by ClusterFuzz: Reproducing Bugs.
- LibFuzzer's integration with Chromium and ClusterFuzz: LibFuzzer Integration.
- AFL's integration with Chromium and ClusterFuzz: AFL Integration.
- Detailed references for other integration parts: Reference.
- Writing fuzzers for the non-browser parts of Chrome OS: Fuzzing on Chrome OS.
- Issues found with in-process fuzzing and automatically filed by ClusterFuzz: ClusterFuzz Bugs.
- Issues filed manually after running fuzz targets: Manual Bugs.
- Bugs found in PDFium by manual fuzzing: PDFium Bugs.
- Bugs found with libFuzzer in open-source projects: OSS Trophies.
- Guided in-process fuzzing of Chrome components blog post.
- ClusterFuzz Stats for fuzz targets built with AddressSanitizer and libFuzzer.