1 Punkte von GN⁺ 2024-10-07 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2024-10-07
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

    • Google findet einen CNET-Artikel von 2007; vermutlich, weil eEye damals „Pressemitteilungen überallhin gestreut“ hat: https://www.cnet.com/news/privacy/flaw-found-in-office-2007/
      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
    • Der Schreibstil macht es definitiv noch unterhaltsamer
      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

    • Einige Fuzzing-Tools wie libFuzzer nutzen die LLVM-Zwischendarstellung, um Code-Coverage-Metriken zu erzeugen, und speisen diese in den Fuzzing-Algorithmus zurück, um die Testabdeckung zu erhöhen
    • Ich habe einmal vorgeschlagen, Reinforcement Learning zur Steuerung der Coverage als Promotionsthema zu nutzen, bin diesen Weg aber nicht wirklich gegangen und weiß nicht, ob es funktionieren würde
  • Ich bin überrascht, dass Heartbleed nicht auf der Liste steht. Es lässt sich sehr leicht reproduzieren

    • Vermutlich fehlt es, weil alle Tutorials hier lokale Dateien oder lokale Daten verwenden und netzwerkbasiertes Fuzzing nicht behandeln