Introduction

Fuzz testing, or fuzzing, has become one of the most effective techniques for discovering security vulnerabilities in software. By generating malformed, unexpected, or random inputs and feeding them to target programs, fuzzers can uncover crashes, memory corruption bugs, and other security-critical issues that escape traditional testing methods. Google’s OSS-Fuzz project alone has helped discover and fix over 40,000 vulnerabilities across 1,000+ open-source projects.

While individual fuzzing tools like AFL++, libFuzzer, and Honggfuzz are well-known, running fuzzing at scale requires dedicated infrastructure. Continuous fuzzing platforms manage the lifecycle of fuzzing campaigns: building target applications with sanitizers, distributing fuzzing jobs across compute resources, collecting and deduplicating crashes, triaging findings, and tracking coverage metrics over time.

In this guide, we compare three open-source fuzz testing platforms developed by Google: OSS-Fuzz, the continuous fuzzing service for open-source projects; ClusterFuzz, the scalable fuzzing infrastructure that powers OSS-Fuzz; and FuzzBench, a benchmarking platform for evaluating fuzzer performance.

Tool Comparison

FeatureOSS-FuzzClusterFuzzFuzzBench
GitHub Stars12,3565,5751,200
Primary PurposeContinuous fuzzing for OSSFuzzing infrastructureFuzzer evaluation
Target IntegrationOpen-source projectsAny software projectFuzzer benchmarking
Crash ManagementAutomated filing, dedupFull crash lifecycleNot applicable
Coverage Tracking✅ Continuous monitoring✅ Per-fuzzer coverage✅ For benchmarking
ScalabilityGoogle-scale (10,000+ VMs)Self-hosted (1-100+ nodes)Single benchmark run
Crash TriageAutomated bisectionManual + automatedNot applicable
DeploymentManaged by GoogleSelf-hosted (GCP/K8s)Self-hosted (Docker)
Supported FuzzerslibFuzzer, AFL++, HonggfuzzAll via integrations10+ fuzzers
LicenseApache 2.0Apache 2.0Apache 2.0

OSS-Fuzz: Continuous Fuzzing as a Service

OSS-Fuzz is Google’s continuous fuzzing platform that provides free, automated fuzzing for critical open-source projects. It combines ClusterFuzz for infrastructure management with a project integration model that makes it easy for maintainers to add fuzzing coverage to their libraries and applications.

How OSS-Fuzz Works

OSS-Fuzz operates on a simple principle: project maintainers write a fuzz target (a function that accepts raw bytes and passes them to the library under test), add a build script, and submit a pull request to the OSS-Fuzz repository. Once merged, OSS-Fuzz automatically builds the project with AddressSanitizer, MemorySanitizer, and UndefinedBehaviorSanitizer, then runs continuous fuzzing at scale.

When OSS-Fuzz discovers a crash, it automatically minimizes the test case, checks for reproducibility, and files a detailed bug report in the project’s issue tracker. The platform enforces a strict 90-day disclosure deadline, ensuring vulnerabilities get fixed promptly.

Integration Example for a C/C++ Project

To integrate a project with OSS-Fuzz, create the following structure in the projects/<project-name>/ directory:

1
2
3
4
5
6
# Directory structure
projects/myproject/
├── build.sh        # Build script
├── Dockerfile      # Build environment
├── project.yaml    # Project metadata
└── my_fuzzer.cc    # Fuzz target

A minimal fuzz target for a C library:

1
2
3
4
5
6
7
8
9
#include <stdint.h>
#include <stddef.h>
#include "mylib.h"

extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
    if (size < 16) return 0;
    mylib_parse_buffer(data, size);
    return 0;
}

ClusterFuzz: Self-Hosted Fuzzing Infrastructure

ClusterFuzz is the open-source fuzzing infrastructure that powers OSS-Fuzz and Google’s internal fuzzing operations. It provides a complete platform for running fuzzing at scale, managing crash triage, and tracking coverage metrics — all self-hosted on your own infrastructure.

Architecture Overview

ClusterFuzz consists of several components that work together to manage the fuzzing lifecycle:

  • App Engine Server: The web frontend and API server that manages fuzzing jobs, stores crash data, and provides the management dashboard.
  • Bot Pool: Compute instances that run fuzzing tasks. Bots pull jobs from the server, execute fuzzing or minimization tasks, and report results.
  • Google Cloud Storage: Stores testcases, crash reproductions, coverage data, and build artifacts.
  • BigQuery (optional): Stores historical crash and coverage data for trend analysis.

Deployment on Google Cloud

ClusterFuzz is designed to run on Google Cloud Platform. The deployment process uses Terraform for infrastructure provisioning:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Clone and set up ClusterFuzz
git clone https://github.com/google/clusterfuzz.git
cd clusterfuzz

# Configure your GCP project
export CLOUDFUZZ_PROJECT_ID=my-project
export CLOUDFUZZ_BUCKET=gs://my-clusterfuzz-bucket

# Deploy using the bootstrap script
python3 local/butler/bootstrap.py     --project-id $CLOUDFUZZ_PROJECT_ID     --bucket $CLOUDFUZZ_BUCKET     --create-instance-template

For organizations that cannot use GCP, community-maintained Kubernetes deployments exist that replace GCP-specific components with open alternatives like MinIO (instead of GCS) and PostgreSQL (instead of Cloud Datastore).

Docker Compose for Development

For local testing and development, ClusterFuzz provides a Docker Compose setup:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: "3.8"
services:
  clusterfuzz-server:
    image: gcr.io/clusterfuzz-images/base
    container_name: clusterfuzz-server
    command: run_server
    ports:
      - "9000:9000"
    environment:
      - DATASTORE_EMULATOR_HOST=datastore:8432
      - PUBSUB_EMULATOR_HOST=pubsub:8433
      - LOCAL_GCS_BUCKETS_PATH=/local-buckets
    volumes:
      - ./local-storage:/local-buckets
    depends_on:
      - datastore
      - pubsub
    restart: unless-stopped

  datastore:
    image: google/cloud-sdk:emulators
    command: gcloud beta emulators datastore start --host-port=0.0.0.0:8432
    ports:
      - "8432:8432"

  pubsub:
    image: google/cloud-sdk:emulators
    command: gcloud beta emulators pubsub start --host-port=0.0.0.0:8433
    ports:
      - "8433:8433"

FuzzBench: Fuzzer Evaluation Platform

FuzzBench takes a different approach from OSS-Fuzz and ClusterFuzz: instead of finding bugs, it evaluates fuzzer performance. FuzzBench provides a standardized, reproducible environment for comparing fuzzing tools across a diverse set of real-world benchmarks.

What FuzzBench Measures

FuzzBench runs each fuzzer against a curated set of benchmark programs for a fixed time period (typically 23 hours) across multiple trials. It measures:

  • Code coverage: Lines, branches, and regions covered over time
  • Bug discovery: Number and uniqueness of crashes found
  • Performance: Executions per second and throughput

The results are published in interactive reports that show statistical significance and ranking. This helps security researchers evaluate new fuzzing techniques and helps organizations choose the right fuzzer for their specific use case.

Running FuzzBench Locally

FuzzBench uses Docker extensively to ensure reproducible environments:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: "3.8"
services:
  fuzzbench:
    image: gcr.io/fuzzbench/base-builder
    container_name: fuzzbench
    volumes:
      - ./results:/tmp/fuzzbench-results
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - FUZZBENCH_EXPERIMENT=my-experiment
      - FUZZBENCH_FUZZERS=aflplusplus,libfuzzer,honggfuzz
      - FUZZBENCH_BENCHMARKS=freetype2,libpng,libxml2
    command:
      - bash
      - -c
      - |
        export PYTHONPATH=$$PWD
        python3 experiment/run_experiment.py           --experiment-name $$FUZZBENCH_EXPERIMENT           --fuzzers $$FUZZBENCH_FUZZERS           --benchmarks $$FUZZBENCH_BENCHMARKS
    restart: "no"

A typical benchmark run takes 24+ hours and requires significant compute resources (4+ cores per fuzzer-benchmark pair).

Why Self-Host Your Fuzzing Infrastructure?

Continuous fuzzing is not a one-time activity — it is an ongoing process that should run alongside every code change. For organizations developing security-critical software, self-hosting fuzzing infrastructure provides several advantages over relying solely on external services.

Intellectual Property Protection: The fuzz targets you write often exercise internal APIs and data structures that reveal proprietary algorithms. Running fuzzing on your own infrastructure ensures that test cases and crash data never leave your network.

Tighter CI/CD Integration: Self-hosted ClusterFuzz integrates directly with your build pipeline, running fuzzing on every commit and blocking releases when new crashes are discovered. This DevSecOps workflow catches regressions before they reach production.

Custom Fuzzing Strategies: Different codebases benefit from different fuzzing approaches. Self-hosting allows you to deploy specialized fuzzers, custom mutators, and domain-specific sanitizers that generic services cannot provide.

For organizations building comprehensive application security testing pipelines, see our self-hosted vulnerability scanner guide and code security analysis comparison.

FAQ

What is the difference between OSS-Fuzz and ClusterFuzz?

OSS-Fuzz is a service — a specific deployment of ClusterFuzz infrastructure that Google runs for the benefit of open-source projects. ClusterFuzz is the software that powers that service. You can deploy your own ClusterFuzz instance for proprietary code, internal projects, or any software that cannot use the public OSS-Fuzz service. OSS-Fuzz is essentially “ClusterFuzz as a Service” for open-source.

How much does it cost to run ClusterFuzz on GCP?

For a small deployment fuzzing 10-20 targets with 5-10 bots each, expect to spend $500-1,500 per month on GCP compute costs. The primary cost driver is the number of fuzzing bots (VMs) running concurrently. You can reduce costs by using preemptible VMs (which are ~80% cheaper) for fuzzing tasks — ClusterFuzz is designed to handle preemption gracefully, resuming interrupted tasks automatically.

Can FuzzBench help me choose which fuzzer to use for my project?

Yes. FuzzBench publishes benchmark results comparing AFL++, libFuzzer, Honggfuzz, and other fuzzers across diverse target programs. However, fuzzer performance is highly target-dependent. The best approach is to use FuzzBench’s methodology to run your own benchmarks against the specific libraries and input formats relevant to your codebase. The platform makes it straightforward to add custom benchmarks and compare results.

Do these platforms support languages other than C/C++?

OSS-Fuzz and ClusterFuzz primarily focus on C/C++ due to the prevalence of memory safety vulnerabilities in those languages, but they support any language that can produce a fuzz target executable. Integration for Rust (via cargo-fuzz), Go (via native fuzzing), Python (via Atheris), and Java (via Jazzer) are all supported through the same infrastructure.

How do I triage and prioritize crashes from continuous fuzzing?

ClusterFuzz provides automated crash deduplication based on crash stack traces and sanitizer output. It categorizes crashes by type (heap-buffer-overflow, use-after-free, etc.) and severity (security-relevant vs. non-security). The platform also supports automated bisection to identify the commit that introduced the vulnerability. For teams new to fuzzing, start by fixing all reliably reproducible crashes, then work through intermittent ones prioritized by crash type severity.


💰 想测试你的市场判断力?我用 Polymarket 做预测市场交易——这是全球最大的预测市场平台,从大选结果到技术监管时间线,什么都可以押注。和赌博不同,这是真正的信息市场:你懂的信息越多,胜率越高。我靠预测技术相关事件的走向已经赚了不少。用我的邀请链接注册:Polymarket.com