Fuzzing Seminar Notes

Notes of papers I surveyed to prepare my seminar homework paper.

Böhme - Fuzzing: Challenges and Reflections

box

Enablers of recent Fuzzing surge?

  1. need: software eating the world
  2. incentives: bug bounty etc.
  3. tools: effective, easy to use, OSS fuzzers

Challenges

  1. More Software: How to fuzz cyber-physical systems, ML systems, stateful software, polyglot software, GUI-based programs?
  2. More Bug types: How to identify information leaks, side-channels, privilege escalation, RCE?
  3. More Difficult / "deep" Bugs
  4. More Empirical Studies: What's nature and distribution of vulns in code?
  5. Human in the Loop
  6. Usability
  7. How to asses residual risk after fuzzing?
  8. theoretical limits of fuzzing?
  9. How to evaluate special (GUI, ...) fuzzers? overfitting? time budget? How to evaluate techniques, not implementations?
  10. Are synthetic / previously discovered bugs representative?

Li - Fuzzing: A Survey

:(

Godefroid - Fuzzing: Hack, Art, and Science

approx three main ways to detect vulns

  1. static program analysis: fast, shallow, false positives
  2. manual code inspection: labor-intensive, does not scale
  3. fuzzing

Whitebox: dynamic SymEx / Concolic Execution

SAGE

Miller - The Relevance of Classic Fuzz Testing: Have We Solved This One?

Rehash of the initial 1990 fuzz approach. Still finds bugs.

Liang - Fuzzing: State of the Art

Jung - Fuzzification: Anti-Fuzzing Techniques

Fortify binary to hinder fuzzers

Evaluated with libjpeg, pcre2 etc.

How does it work with actually released software? (ie v1.1, v1.2, ...)? Each version fuzzified similarly or leaking infos?

Serebryany - Sanitize, Fuzz, and Harden Your C++ Code

Valgrind wasn't adopted by Google devs due to 20x slowdown.

Sanitizers each have ~2x slowdown, thus every Chromium commit is run with all unit tests.

libFuzzer very easy to use, finds heartbleed in a few seconds.

Hardening: Check values of fn ptrs to only hit expected fns, shadow stack (somewhere else) so that RA isn't overwritten.

Lee - Montage: A NN Language Model-Guided Javascript Engine Fuzzer

Previous Work

Contribution

  1. Dataset: JS enginge Regression tests, PoCs of CVEs. ~30K JS Files
  2. Trains LSTM Model to generate new code
  3. Fuzzes ChakraCore (IE)
  4. Finds (a bit) more Bugs than CodeAlchemist, jsfunfuzz in 72h, found some new bugs.

Chen - MUZZ: Thread-aware Grey-box Fuzzig for Effective Bug Hunting in Multithreaded Programs

  1. Static Analysis: identify schedule-relevant code parts, probabilistically instrument, increase schedule diversity
  2. Seed selection that prioritizes new "regular" schedules and new interleavings (?)
  3. Run with TSan

Aafer - Android SmartTVs Vuln Discovery via Log-Guided Fuzzing

  1. Background: SmartTVs run heavily customized AOSP
  2. Infer input validation from log msgs from Android ROM
  3. mutate according to logs

Krupp - AmpFuzz: Fuzzing for Amplifiction DDoS Vulns

[Overview](ampfuss overview.png)

Garbelini - BrakTooh: Directed Fuzzing of BlueTooth Link Manager

Serebryany - OSS-Fuzz: Google's continuous fuzzing service for open source software

Yun - QSYM: A Practical Concolic Execution Engine Tailored for Hybrid Fuzzing

Hybrid fuzzing for "real world software" (Driller rather CGC specific?)

Güler - AntiFuzz: Impeding Fuzzing Audits of Binary Executables

Note: Requires Developer hints

Peng - T-Fuzz: fuzzing by program transformation

  1. uses existing cov-guided fuzzer (AFL, honggfuzz) to generate inputs
  2. When fuzzer gets "stuck": finds and removes non-critical sanity checks
  3. crash analyzer: Check that input also crashes real program by collecting path constraints and ensure that they are satisfiable. Filters out false positives with 6~30% false negatives

Yue - EcoFuzz: Adaptive Energy-Saving Greybox Fuzzing as a Variant of the Adversarial Multi-Armed Bandit

Ispoglou - FuzzGen: Automatic Fuzzer Generation

Zong - FuzzGuard: Filtering out Unreachable Inputs in Directed Grey-box Fuzzing through Deep Learning

On avg. 5x speedup

Predicts reachability of program inputs without execution.

Gan - GREYONE: Data Flow Sensitive Fuzzing

Österlung - ParmeSan: Sanitizer-guided Greybox Fuzzing

based on Angora.

target branches that are instrumented by sanitizers

Maybe prune some ASan instrumentations by prefering profiling-wise "cold" or complex code.

Use Data Flow Analysis to solve path conditions.

Poncelet - So Many Fuzzers, So Little Time

Fuzzed Contiki-NG (low-resource IoT OS) using 8 fuzzers over three years.

AFL: impressively easy to use, 55 "unique" crashes caused by on (shallow) bug in one hour. Suggestion: early fixing.

Böhme - Fuzzing Challenges and Reflections

Some Fuzzing Thoughts

Case instead of time as x-axis.

For example, if I wanted to prototype a new mutation strategy for AFL, I would be forced to do it in C, avoid inefficient copies, avoid mallocs, etc. I effectively have to make sure my mutator is at-or-better than existing AFL mutator performance to use benchmarks like this.

Coverage-based Greybox Fuzzing as Markov Chain (AFLFast)

Discussion of Boehme and Zalewski

Directed Greybox Fuzzing (AFLGo)

weaker precursor: Dowser

builds on top of AFLFast

kAFL: Hardware-Assisted Feedback Fuzzing for OS Kernels

Hypervisor + Intel CPU Extensions for near-native performance for kernel fuzzing

Intel Processor Trace: traces taken/nottaken of branch, target addr of jump,

Fuzzes kernel in virtual machine. Fuzzer communicates with agent that sits below/beneath (?) kernel in vm. Fuzzer receives coverage info from Intel PT Driver.

REDQUEEN: Fuzzing with Input-to-State Correspondence

Uni Bochum

builds on top of kAFL

Driller: Augmenting Fuzzing Through Selective Symbolic Execution

Combines AFL and angr (concolic execution for binary; paper, website).

core intuition: input can be divided into general and specific with many and few accepted inputs. Checks for specific input divide app into compartments.

  1. Fuzzes with AFL until it deems itself stuck.
  2. Invokes concolic execution engine, passing all interesting inputs from fuzzing.
  3. Concolic execution determines inputs that reach new paths/compartments.

Vuzzer: Application-aware Evolutionary Fuzzing

"smart" without symex