Thumbnail Image

Automated security testing of unexplored targets through feedback-guided fuzzing

Maier, Dominik Christian

Fuzzing is an automated method to uncover bugs in software. A fuzzer will generate inputs to a target program and execute the target repeatedly, in rapid succession. These random mutations aim to reach corner cases a human tester will not detect easily. Fuzzing has uncovered a variety of critical bugs in recent years. However, a large amount of low-level code remains un-fuzzed. Most research improves certain bits and pieces and focuses on easy-to-fuzz user space applications with available source code. While this makes it possible to evaluate and compare the proposed methods, novel targets will not get the much-needed attention. This thesis aims to scale and automate the detection of security-critical bugs across a wide range of previously unexplored and traditionally hard-to-test targets. We consolidate available fuzzing research with our tool AFL++, a fork of the well-known AFL fuzzer. We aim at a wide range of new targets using this state-of-the-art fuzzer. We pick targets that are hard to test, such as kernels, device drivers, and firmware. Even vendors with access to source code cannot use existing fuzzers for these targets. The architecture of fuzzers needs to be adapted to them. The tools written for this thesis uncovered memory corruptions in the Linux kernel, graphics card drivers, baseband chips of smartphones, servers, and smart contract VM implementations. We develop entirely new approaches, such as differential fuzzing, instrumentation for WebAssembly binaries, kernel-land snapshot fuzzing, and the snapshot-based FitM project, uncovering stateful bugs in network stacks.
Fuzzing ist eine automatisierte Methode, um Fehler in Software zu finden. Dabei werden in schneller Abfolge Eingaben generiert und das Zielprogramm ausgeführt. Zufällige Mutationen sollen dabei Randbedingungen erreichen, die für den Menschen schwer zu entdecken sind. Durch Fuzzing wurden in den letzten Jahren eine Vielzahl von kritischen Bugs entdeckt. Ein Großteil des systemnahen Codes wurde jedoch bisher nicht gefuzzt. Die aktuelle Forschung fokussiert sich stattdessen auf Verbesserungen von Fuzzern gegen etablierte User-Space-Anwendungen mit verfügbarem Quellcode, wodurch sich die entsprechenden Entwicklungen vergleichbarer evaluieren lassen. Die Weiterentwicklung von Fuzzing in anderen Bereichen und gegen neuartige Ziele bleibt jedoch außen vor. Ziel der vorliegenden wissenschaftliche Arbeit ist es, bisher unbekannte Sicherheitslücken aufzudecken und die Methodiken zu automatisieren. Wir kombinieren die neuesten wissenschaftlichen Erkenntnisse, implementieren diese in unserem Programm AFL++ecurity, Fuzzing, Cellular, Baseband, Binary-Only, WebAssembly, Snaphshots, ein Fork des bekannten AFL Fuzzeers. Mit dem Programm sind wir in der Lage, neuartige Ziele mit aktuellsten Methoden zu fuzzen. Wir wählen Ziele, die sich schwer testen lassen, zum Beispiel Betriebssystemkernel, Gerätetreiber und Firmware. Für diese Ziele liegt häufig kein Quellcode vor. Selbst Hersteller, mit Quellcodezugriff, können existierende Fuzzer für diese Ziele nicht einsetzen. Der hardwarenahe Code benötigt eine neue Fuzzer-Architektur. Tools, die wir für diese Arbeit entwickelt haben, konnten unter anderem Speicherkorruptionen im Linux-Kernel, in Grafikkartentreibern, in Smartphone Baseband-Chips, Servern und Smart-Contract-VM-Implementierungen aufdecken. Wir entwickeln neuartige Ansätze, Differential-Fuzzing, Instrumentierung für WebAssembly Binaries, Kernel-Snapshot-Fuzzing und das Snapshot-basierte FitM-Projekt. All dies ermöglicht uns, Probleme in Netzwerkcode zu finden, die erst unter komplexen Voraussetzungen eintreten.