blob: 44b5d20a9dc53e5f2abc680cca123c697e70465b [file] [view]
# Fuzzing in Chromium
[go/chrome-fuzzing](https://goto.google.com/chrome-fuzzing)
*** note
**Just got a bug report from ClusterFuzz?:** If you want to reproduce a
ClusterFuzz crash locally, see [How to Reproduce a Crash from ClusterFuzz].
***
[Fuzzing] is an automated software testing technique that provides invalid,
unexpected, or random data as inputs to a program to find bugs.
**Why fuzz?** Fuzzing finds thousands of security and stability issues before
they reach users (see [go/fuzzing-success]). For more information about the
benefits of fuzzing, see [go/why-fuzz].
**Where to fuzz?** Fuzz code that parses, decodes, or manipulates input from
untrusted sources, such as the web.
[TOC]
## Getting started
In Chromium, you can create and submit fuzz targets that run continuously at
scale on [ClusterFuzz]. Prefer FuzzTest for all new fuzz targets. Use libFuzzer
only to maintain existing targets.
### FuzzTest (recommended)
FuzzTest integrates with the gtest framework and tests code that accepts
structured, typed inputs, such as `int`, `std::string`, `std::vector`, or custom
classes.
* To write your first FuzzTest, see [Getting Started with FuzzTest].
* To visualize the impact of your fuzzer, see
[Generating local code coverage reports for FuzzTests].
### libFuzzer (deprecated)
[libFuzzer] tests APIs that consume raw byte buffers, such as image decoders and
JSON or XML parsers.
* To write, build, and run a basic libFuzzer target, see
[Getting Started with libFuzzer].
* To make your fuzzer more effective using seed corpuses and dictionaries,
see [Improving fuzz target efficiency].
## Advanced topics
* [Getting Started with libprotobuf-mutator (LPM)] - Fuzz code that expects a
protobuf, has multiple inputs, or is defined by a grammar.
* [Fuzzing mojo interfaces] - A guide for using LPM to fuzz Mojo interfaces.
* [Fuzzing in Chrome OS] - Writing fuzzers for the non-browser parts of Chrome
OS.
* [Fuzzing browsertests] - For fuzzing multiple Chrome subsystems that require
a full browser environment.
* [libFuzzer Integration Details] - The specifics of how libFuzzer integrates
with Chromium and ClusterFuzz.
* [libfuzzer Technical References] - A detailed reference for build arguments
(GN), sanitizer configurations, platform support, and ClusterFuzz options.
* [Blackbox fuzzing] - Fuzz large, slow, or non-deterministic targets without
coverage guidance. To learn how to generate and view a code
coverage report for your blackbox fuzzer, see [Local Code Coverage for blackbox fuzzers]
## Getting help
If you have questions or encounter issues,
* email `chrome-fuzzing-core@google.com` or
* file a bug using the **Chrome > Security > Fuzzing** component.
## View dashboard and stats
* [go/chrome-fuzzing-dashboard] - View the code coverage achieved by fuzzers
in Chromium.
* [ClusterFuzz Stats] - Performance statistics for fuzzers.
[Blackbox fuzzing]: https://google.github.io/clusterfuzz/reference/coverage-guided-vs-blackbox/#blackbox-fuzzing
[ClusterFuzz]: https://clusterfuzz.com/
[ClusterFuzz Stats]: https://clusterfuzz.com/fuzzer-stats/
[Fuzzing]: https://en.wikipedia.org/wiki/Fuzzing
[Fuzzing browsertests]: fuzzing_browsertests.md
[Fuzzing in Chrome OS]: https://www.chromium.org/chromium-os/developer-library/guides/testing/fuzzing/
[Fuzzing mojo interfaces]: ../../mojo/docs/mojolpm.md
[Generating local code coverage reports for FuzzTests]: fuzz_test_coverage.md
[Getting Started with FuzzTest]: getting_started.md
[Getting Started with libfuzzer]: getting_started_with_libfuzzer.md
[Getting Started with libprotobuf-mutator (LPM)]: libprotobuf-mutator.md
[go/chrome-fuzzing-dashboard]: https://analysis.chromium.org/coverage/p/chromium?platform=fuzz&test_suite_type=any&path=%2F%2F&project=chromium%2Fsrc&path=%2F%2F&host=chromium.googlesource.com&ref=refs%2Fheads%2Fmain&modifier_id=0
[go/fuzzing-success]: http://go/fuzzing-success
[go/why-fuzz]: http://go/why-fuzz
[How to Reproduce a Crash from ClusterFuzz]: reproducing.md
[Improving fuzz target efficiency]: efficient_fuzzing.md
[libFuzzer]: http://llvm.org/docs/LibFuzzer.html
[libFuzzer Integration Details]: libFuzzer_integration.md
[libFuzzer technical references]: reference.md
[Local Code Coverage for blackbox fuzzers]: blackbox_coverage.md