Full-speed Fuzzing: Reducing Fuzzing Overhead through Coverage-guided Tracing

12/31/2018
by   Stefan Nagy, et al.
0

Of coverage-guided fuzzing's three main components: (1) testcase generation, (2) code coverage tracing, and (3) crash triage, code coverage tracing is a dominant source of overhead. Coverage-guided fuzzers trace every testcase's code coverage through either static or dynamic binary instrumentation, or more recently, using hardware support. Unfortunately, tracing all testcases incurs significant performance penalties---even when the overwhelming majority of testcases and their coverage information are discarded because they do not increase code coverage. To eliminate needless tracing by coverage-guided fuzzers, we introduce the notion of coverage-guided tracing. Coverage-guided tracing leverages two observations: (1) only a fraction of generated testcases increase coverage, and thus require tracing; and (2) coverage-increasing testcases become less frequent over time. Coverage-guided tracing works by encoding the current frontier of code coverage in the target binary so that it self-reports when a testcase produces new coverage---without tracing. This acts as a filter for tracing; restricting the expense of tracing to only coverage-increasing testcases. Thus, coverage-guided tracing chooses to tradeoff increased coverage-increasing-testcase handling time for the ability to execute testcases initially at native speed. To show the potential of coverage-guided tracing, we create an implementation based on the static binary instrumentor Dyninst called UnTracer. We evaluate UnTracer using eight real-world binaries commonly used by the fuzzing community. Experiments show that after only an hour of fuzzing, UnTracer's average overhead is below 1 and after 24-hours of fuzzing, UnTracer approaches 0 every testcase with popular white- and black-box-binary tracers AFL-Clang, AFL-QEMU, and AFL-Dyninst incurs overheads of 36 respectively.

READ FULL TEXT

page 1

page 9

page 11

research
09/07/2022

Same Coverage, Less Bloat: Accelerating Binary-only Fuzzing with Coverage-preserving Coverage-guided Tracing

Coverage-guided fuzzing's aggressive, high-volume testing has helped rev...
research
05/25/2019

PTrix: Efficient Hardware-Assisted Fuzzing for COTS Binary

Despite its effectiveness in uncovering software defects, American Fuzzy...
research
07/13/2023

Towards Traitor Tracing in Black-and-White-Box DNN Watermarking with Tardos-based Codes

The growing popularity of Deep Neural Networks, which often require comp...
research
04/11/2023

Tracing OCaml Programs

This presentation will cover a framework for application-level tracing o...
research
01/12/2023

Evaluating the Fork-Awareness of Coverage-Guided Fuzzers

Fuzz testing (or fuzzing) is an effective technique used to find securit...
research
07/30/2018

The REquirements TRacing On target (RETRO).NET Dataset

This paper presents the REquirements TRacing On target (RETRO).NET datas...
research
04/29/2020

Efficient Binary-Level Coverage Analysis

Coverage analysis plays an important role in the software testing proces...

Please sign up or login with your details

Forgot password? Click here to reset