# Fuzzing: Eine Einführung
In diesem Blog möchte ich eine Einführung in die Praktik des Fuzzing geben:
Fuzzing ist eine Technik für automatisches Testing. Ein Fuzzer erstellt dafür zufällige Eingabedaten mit welchen er mehr Randfälle überprüfen kann. Das Tool speichert dann automatisch alle Crashes und Fehlreaktionen des Programms damit man als Entwickler sie anschliessend beheben kann.
Penetration Tester und Hacker nutzen Fuzzing auch gerne um Fehler zu finden welche sie ausnutzen können. [^1]
Normalerweise verwendet man Fuzzer für Inputs, welche einen strukturierten Input erwarten, wie ein bestimmtes Dateiformat. Ein guter Fuzzer erschafft Daten die semi-gültig sind. Diese gehen zwar durch den Parser, können durch ihre Halbkorrektheit jedoch unerwartete Fehler im Programm auslösen.
## Arten von Fuzzer
Fuzzers können durch verschiedene Eigenschaften gruppiert werden. Ein Fuzzer kann also:
1. Generierungs- oder Mutationsbasiert sein
2. Dumb oder Smart sein
3. White-, Gray- oder Blackbox sein
### Generierungs- oder Mutationsbasiert
Ein mutationsbasierter (Mutationbased) Fuzzer erschafft zufällige Daten in dem er vorgegebene valide Daten abändert. Der Tester muss anfangs einen sogenannten Corpus mit Seeds mitgeben. Diese Seeds sind Gültige Eingaben für normale Testcases. Der Fuzzer erschafft anschliessend semi-gültige Eingaben indem er einzelne Bits der Daten abändert. Diese sollten durch die grobste Kontrolle und vor allem durch den Parser gehen, im Programm jedoch einen Fehler auslösen.
Ein generierungsbasierter (Generationbased) Fuzzer wiederum erschafft seine Daten von Grund auf. Ein Smart (siehe unten) Generationbased Fuzzer beispielsweise würde Inputdaten anhand von einer vorgegebener Struktur erstellen.
Es gibt heutzutage auch Fuzzer die beide Funktionalitäten unterstützen.
### Smart oder Dumb
Der unterschied in der "Intelligenz" bezieht sich auf die Kenntnis der Struktur der zu testenden Daten. Ein Smart Fuzzer kennt die Struktur der Daten, kann also eigene Daten erschaffen. Ein Dumb Fuzzer kann nur Tests mit vorgegeben Daten durchführen.
Die Struktur wird über Modelle vorgegeben. Hat man beispielsweise einen Textinput der gewissen Regeln folgen sollte, würde man ein Grammar Model (Ein grammatisches Regelwerk vergleichbar mit RegEx) erstellen. Weitere Arten von Modellen wären Dateiformate, GUI-Modelle und Netzwerk Protokoll. Sogar Daten die eigentlich nicht als fuzzbar angesehen werden, können so getestet werden. Das bietet einem auch die Möglichkeit, Datenbanken, geteilte Speicher und Umgebungsvariablen zu testen.
### White-, Gray- und Blackbox
Ein Fuzzer wird als effektiv angesehen, wenn er eine höhere Code Coverage erreicht. Wenn ein Fuzzer aber auf bestimmte Teile des Programms nicht zugreifen kann, ist er nicht in Lage darin Bugs zu finden.
### Blackbox
Ein Blackbox Fuzzer kennt keinen Code sondern nur die erreichbaren Teile des Programms. So macht er zwar hunderte von Eingaben pro Sekunde und kann einfach parallelisiert werden, kratzt jedoch nur an der Oberfläche des Programms. Mittlerweile wurden Blackbox Fuzzer entwickelt welche durch die Reaktionen des Programms während des Tests mehr über die interne Funktionalität lernen. Herkömmliche Blackbox Fuzzer werden heutzutage jedoch als veraltet angesehen.
### Whitebox
Ein Whitebox Fuzzer wiederum nutzt eine Programanalyse um systematisch die Code Coverage zu erhöhen. Ein Whitebox Fuzzer kann auch eine Modelbasierte Vorgehensweise anwenden um Inputs zu generieren und die Reaktion des Programms mit der eigentlichen Vorgabe im Code abzugleichen. Die statische Analyse des Codes kann jedoch viel Zeit in Anspruch nehmen was in gewissen Anwendungsfällen den Blackbox Fuzzer attraktiver macht.
Es gibt mittlerweile viele Projekte die versuchen Black- und Whitebox Fuzzer zu kombinieren um die stärken beider zu nutzen.
### Graybox
Ein Graybox Fuzzer nutzt Instrumentation anstelle einer Code Analyse um Informationen über ein Programm zu lernen. Instrumentation ist eine Analyse des Programms während der Laufzeit. So kann eine gute Performance erreicht werden während die Code Coverage weiterhin erhöht werden kann. Dadurch sind Graybox Fuzzer extrem effiziente Vulnerability Entdeckuns-Tools. [^2]
## Bekannte Fuzzer und Projekte
Der wahrscheinlich bekannteste Fuzzer ist die *American Fuzzy Lop* (kurz AFL) von Michal Zalewski. AFL ist ein Sicherheitorientierter Dumb Graybox Fuzzer welcher für möglichst einfache Anwendung ausgelegt ist.[^3]
Das originale AFL Tool wurde lange nicht mehr aktualisiert, es gibt jedoch eine Fork namens AFL++ welche Verbesserungen und mehr Funktionalität besitzt.
Auch Google setzt aktiv auf Fuzzing zum Testen ihrer Produkte. Mit Ihrem Tool ClusterFuzz haben sie eine Webanwendung für einfaches Fuzzing erstellt.[^4] Sie hosten auch eine Version namens OSS-Fuzz welche für grosse Opensource Projekte zur Verfügung steht. Sie testen damit auch ihren eigenen Browser Chrome.
[^1]: https://de.wikipedia.org/wiki/Fuzzing
[^2]: https://en.wikipedia.org/wiki/Fuzzing
[^3]: https://lcamtuf.coredump.cx/afl/
[^4]: https://google.github.io/clusterfuzz/
[^5]: https://google.github.io/oss-fuzz/