blob: 2ead5f44d49906a7b04f0b39036f5aca60e0dcef [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/// The component fuzzer framework.
///
/// Fuzzing (or fuzz testing) is the process of pseudorandomly generating inputs
/// for some target, executing the target with those inputs, and detecting
/// various error conditions that may arise as a result. Guided fuzzing uses
/// additional feedback from the target besides errors to determine whether
/// inputs should be saved and used as the basis of subsequent inputs. A
/// concrete example of guided fuzzing is coverage-guided fuzzing, which uses
/// whether executing the target with a fuzzing input produced new code coverage
/// to determine whether it should be added to the corpus, that is, the set of
/// saved inputs.
///
/// Guided fuzzing frameworks can be described using the following taxonomy:
///
/// * Engine: A target-agnostic feedback loop.
/// * Corpus management: Maintains a collection of fuzzing inputs.
/// * Mutators: Mutation strategies and a PRNG used to create new inputs
/// from existing ones.
/// * Feedback analysis: Dispositions an input based on its feedback, e.g.
/// code coverage.
/// * Management interface: Interacts with the user to coordinates
/// workflows.
/// * Target: The specific code under test.
/// * Input processing: Maps the fuzzer input for a single run to the code
/// under test.
/// * Feedback collection: Observes the behavior caused by an input.
/// * Error detection: Determines when an input has caused an error and
/// collects artifacts.
///
/// In order to fuzz components and component topologies, the component fuzzer
/// framework leverages the test runner framework for its environment and
/// execution features. It adds the pieces of the taxonomy above into and around
/// the test runner framework:
///
/// * A fuzz-manager that acts as a sibling to test-manager, and provides the
/// management interface.
/// * A fuzz-registry that allows the fuzz-manager to find running fuzzers.
/// * A fuzz-test-runner within the test runner framework that launches the
/// fuzzed realm and passes it a connection to the fuzz-registry.
/// * A fuzzer engine within the fuzzed realm that registers with the registry.
/// It analyzes feedback and generates new inputs using mutators.
/// * A target adapter that provides transforms inputs from the engine to
/// behaviors in the target components, e.g. via FIDL calls.
/// * A ELF library that is linked against instrumented processes in the target
/// components and that provides feedback collection and error detection to
/// the fuzz-test-driver.
///
/// This FIDL library provides the protocols and types used by these elements of
/// the framework to interact with one another. These types are found in the
/// following files:
///
/// * adapter.fidl:
/// * Implementations of the `TargetAdapter` protocol transform inputs.
/// * controller.fidl:
/// * Each `Result` enumerates a possible outcome of executing the target
/// with a test input.
/// * `Input` structs represent sequences of bytes used to test the target
/// and that can be transferred to and from a development host.
/// * Implementations of the `Controller` protocol allow clients to control
/// fuzzing execution.
/// * Implementations of the `ControllerProvider` protocol connect clients
/// to fuzzers.
/// * corpus.fidl:
/// * Each `Corpus` enumerates a set of fuzzing inputs.
/// * Implementations of the `CorpusReader` protocol allow iterating over a
/// corpus of inputs.
/// * coverage.fidl:
/// * The `InstrumentedProcess` struct represents a process that can collect
/// code coverage data.
/// * Implementations of `CoverageDataCollector` aggregate LLVM module code
/// coverage data from instrumented processes.
/// * `CoverageData` is a union that can represent instrumented processes or
/// modules.
/// * Implementations of `CoverageDataProvider` allow the engine to retrieve
/// code coverage data for instrumented processes.
/// * manager.fidl:
/// * Implementations of `Manager` allow clients to start, connect to, and
/// stop fuzz test realms.
/// * Each `TestOutput` enumerates a diagnostic stream from the test realm.
/// * options.fidl:
/// * The `Options` table details various configurable parameters for the
/// fuzzer.
/// * registry.fidl:
/// * Implementations of `Registrar` allow each fuzzer to register its
/// `ControllerProvider` on launch.
/// * Implementations of `Registry` allow the `fuzz_manager` to connect to
/// or disconnect fuzz test realms.
/// * status.fidl:
/// * `ProcessStats` has `ZX_INFO_TASK_STATS` and `ZX_INFO_TASK_RUNTIME`
/// details from targets.
/// * Each `UpdateReason` enumerates why status is being "pushed" by the
/// fuzzer.
/// * Implementations of the `Monitor` protocol subscribe to updates from
/// the fuzzer.
library fuchsia.fuzzer;