0
All posts
When to stop fuzzing: a Bayesian answer to a wall-clock question.

When is it actually safe to stop fuzzing?

June 18, 20262 min read
fuzzingresearchbayesiantesting

"Run it for 24 hours" is not a stopping rule. It is a budget with a stopping rule bolted on afterward.

The real question is: when you turn a fuzzing campaign off, how much undiscovered risk are you still carrying? That is the question my research answers, and it is the subject of a paper I am first author on, currently under submission.

PSBayes

PSBayes is a per-seed, Beta-posterior estimator of the residual risk left in a fuzzing campaign. Instead of asking "have we hit the time budget," it asks "what is the probability that this seed still hides an undiscovered behavior," and it maintains that estimate as the campaign runs.

It comes in two variants:

  • PSBayes99, tuned for accuracy.
  • PSBayesPM, tuned for safety, at close to zero underestimation, because in testing you would rather stop late than stop while risk is still high.

I evaluated both across 8 FuzzBench benchmarks and 18,861 discovery rounds. Along the way I caught a scale mismatch between single-thread predictions and multi-fork ground truth that was quietly invalidating results, and corrected the estimation pipeline.

Where it goes next

We are extending the framework to LLM-generated C to Rust translation, using cross-language differential fuzzing. There, the thing you want bounded is not undiscovered coverage but the risk of a translation bug that no one caught. Same idea, higher stakes: a stopping rule that reports what it does not know.