- Fuzzing-101 ist ein Kurs, der dafür entwickelt wurde, dass Einsteiger ins Fuzzing das Finden von Schwachstellen an realen Software-Zielen praktisch üben können
- Der Kurs besteht aus 10 realen Zielen und 10 Übungen und behandelt Xpdf, libexif, TCPdump, LibTIFF, Libxml2, GIMP, VLC media player, Adobe Reader, 7-Zip und Google Chrome/V8
- Jede Übung zielt auf die Reproduktion oder Entdeckung einer CVE ab und verwendet unter anderem Schwachstellen wie CVE-2019-13288, CVE-2016-2334, CVE-2019-5847 sowie AFL++, ASan, LCOV, WinAFL und Fuzzilli
- Voraussetzung ist ein Linux-System mit Internetverbindung; grundlegende Linux-Kenntnisse werden empfohlen, und alle Übungen wurden unter Ubuntu 20.04.2 LTS getestet
- Fuzzing ist eine automatisierte Testtechnik, bei der zufällige oder mutierte Eingaben in Programme eingespeist und Ausnahmen oder Abstürze überwacht werden; der Kurs konzentriert sich auf das grundlegende Verhalten von Coverage-guided Evolutionary Fuzzern
Zweck und Zielgruppe des Kurses
- Fuzzing-101 ist ein Kurs für Menschen, die Fuzzing wie ein Profi lernen möchten, aber nicht wissen, wo sie anfangen sollen
- Der Kurs besteht aus 10 realen Targets und 10 Übungen
- Die Zielgruppe sind
- Menschen, die die Grundlagen des Fuzzings lernen möchten
- Menschen, die lernen möchten, wie man Schwachstellen in realen Software-Projekten findet
Aufbau der Übungen
- Jede Übung nennt die jeweilige Software, die zu findende CVE, die erwartete Dauer und die wichtigsten Themen
| Übung | Ziel | Zu findende CVE | Geschätzte Zeit | Wichtige Themen |
|---|---|---|---|---|
| Exercise 1 | Xpdf | CVE-2019-13288 | 120 Minuten | Afl-clang-fast, Afl-fuzz, GDB |
| Exercise 2 | libexif | CVE-2009-3895, CVE-2012-2836 | 6 Stunden | Afl-clang-lto, Library-Fuzzing, Eclipse IDE |
| Exercise 3 | TCPdump | CVE-2017-13028 | 4 Stunden | ASan, Sanitizers |
| Exercise 4 | LibTIFF | CVE-2016-9297 | 3 Stunden | Code-Coverage, LCOV |
| Exercise 5 | Libxml2 | CVE-2017-9048 | 3 Stunden | Wörterbuch, grundlegende Parallelisierung, Fuzzing von Kommandozeilenargumenten |
| Exercise 6 | GIMP | CVE-2016-4994, Bonus-Bug | 7 Stunden | Persistentes Fuzzing, Fuzzing interaktiver Anwendungen |
| Exercise 7 | VLC media player | CVE-2019-14776 | 6 Stunden | Partielle Instrumentierung, Fuzzing-Harness |
| Exercise 8 | Adobe Reader | Keine | 8 Stunden | Fuzzing von Closed-Source-Anwendungen, QEMU-Instrumentierung |
| Exercise 9 | 7-Zip | CVE-2016-2334 | 8 Stunden | WinAFL, Fuzzing von Windows-Anwendungen |
| Exercise 10 | Google Chrome / V8 | CVE-2019-5847 | 8 Stunden | Fuzzilli, Fuzzing von JavaScript-Engines |
Laufzeitumgebung und Werkzeuge
- Erforderlich ist ein Linux-System mit Internetverbindung
- Es wird ein VMware-Image bereitgestellt, das in den Übungen verwendet werden kann
- Grundlegende Linux-Kenntnisse werden dringend empfohlen
- Alle Übungen wurden unter Ubuntu 20.04.2 LTS getestet
- Im Kurs wird AFL++ verwendet
- AFL++ wird als neuerer und besserer Fork von AFL von Michał “lcamtuf” Zalewski vorgestellt
Grundkonzepte des Fuzzings
- Fuzz-Testing oder Fuzzing ist eine automatisierte Software-Testtechnik, bei der zufällige oder veränderte Eingaben in ein Programm eingespeist und Ausnahmen oder Abstürze überwacht werden
- Als Beispiele erfolgreicher Fuzzer für reale Anwendungen werden AFL, libFuzzer und HonggFuzz genannt
- Diese drei Werkzeuge sind allesamt Beispiele für Coverage-guided Evolutionary Fuzzer
Coverage-guided Evolutionary Fuzzer
- Der evolutionäre Ansatz ist ein von evolutionären Algorithmen inspiriertes metaheuristisches Verfahren
- Die anfängliche Eingabemenge, also die Seeds, wird im Lauf der Zeit weiterentwickelt und mutiert
- Als Auswahlkriterium wird beispielsweise Coverage verwendet
- Coverage-guided Fuzzer sammeln und vergleichen Code-Coverage-Daten pro Eingabe, um die Wahrscheinlichkeit zu erhöhen, neue Abstürze zu finden
- Die Erfassung der Coverage erfolgt üblicherweise durch Instrumentierung
- Es werden Eingaben ausgewählt, die zu neuen Ausführungspfaden führen
Änderungsverlauf
- 2022-02-14: Ein Teil eines
wget-Tippfehlers in Exercise 5 wurde korrigiert - 2021-11-25: Exercise 3 wurde mit einigen Änderungen aktualisiert
1 Kommentare
Kommentare auf Hacker News
Anekdote zum Fuzzing: https://threadreaderapp.com/thread/1799457232607985698
Eine großartige Lektüre, wenn man etwa 11 Minuten verschwenden möchte
Ich verstehe die Kultur nicht so recht, bei der man darum wetteifert, Bugs in den Produkten anderer Firmen zu finden, dann ausgerechnet in Microsoft Publisher einen entdeckt und damit prahlt, um Microsoft herunterzumachen
Vielleicht kann man sich glücklich schätzen, wenn es Unternehmen gibt, deren „Standardprozess“ darin besteht, eine ganze Woche lang Nächte durchzumachen, um unsere Produkte zu testen
Als ich nachgesehen habe, wer der Autor ist, könnte es jemand sein, den ich aus dem IRC kannte; „Mantis“ und „infosec“ passen jedenfalls genau
Interessant ist, dass sich das deutlich vom Ansatz von Go unterscheidet
In Go kann man Fuzzing so einfach ausführen wie Tests, sodass es sehr leicht ist, gezielt bestimmte Teile einer Anwendung oder Bibliothek anzugehen
Dadurch werden viele dieser Techniken überflüssig
Mich würde interessieren, welche Techniken Fuzzing besser steuern; im Moment scheint das Beste zu sein, einen Seed-Korpus bereitzustellen und auf das Beste zu hoffen
Ich bin überrascht, dass Heartbleed nicht auf der Liste steht. Es lässt sich sehr leicht reproduzieren