PeAR: A Static Binary Rewriting Framework for Binary-Only Fuzzing
About
Binary-only fuzzing is a key technique for finding bugs in close-source software. Without access to source code, the fuzzer must rely on static or dynamic binary instrumentation for coverage guidance. In practice, most fuzzers favor dynamic binary instrumentation (DBI), accepting runtime overhead to avoid the perceived accuracy and soundness challenges associated with static binary instrumentation (SBI). We show that these concerns are unwarranted, and that accurate, scalable~SBI is achievable using off-the-shelf frameworks. Building on these frameworks, we develop PeAR, an extensible binary-only fuzzing framework. We demonstrate PeAR's versatility by implementing several modern fuzzer features -- including, deferred initialization, persistent mode, and shared-memory fuzzing. We evaluate PeAR over 4.25 CPU-yrs of fuzzing on the FUZZBENCH benchmark and find that PeAR: (i) successfully instruments 88% of FUZZBENCH targets, comparable to the best SBI-based fuzzers; (ii) achieves a median throughput improvement of 4x when using persistent mode and shared memory fuzzing; and (iii) attains coverage comparable to compiler-based instrumentation. Our results show that SBI is a practical and effective technique for binary-only fuzzing, and that modern binary rewriting frameworks can apply complex instrumentation with high granularity and negligible performance compromise.
Related benchmarks
| Task | Dataset | Result | Rank | |
|---|---|---|---|---|
| Fuzzing | FuzzBench vorbis | Normalized Final Edge Coverage99 | 9 | |
| Fuzzing | FuzzBench curl | Normalized Median Final Edge Coverage98 | 8 | |
| Fuzzing | FuzzBench freetype2 | Normalized Edge Coverage0.73 | 8 | |
| Fuzzing | FuzzBench harfbuzz | Normalized Median Final Edge Coverage98 | 8 | |
| Fuzzing | FuzzBench libxml2 | Normalized Edge Coverage (Median)97 | 8 | |
| Fuzzing | FuzzBench mbedtls | Normalized Median Final Edge Coverage100 | 8 | |
| Fuzzing | FuzzBench openh264 | Normalized Median Final Edge Coverage1 | 8 | |
| Fuzzing | FuzzBench lcms | Normalized Median Final Edge Coverage60 | 8 | |
| Fuzzing | FuzzBench libjpeg-turbo | Normalized Median Final Edge Coverage100 | 8 | |
| Fuzzing | FuzzBench libpcap | Median Final Edge Coverage1 | 8 |