
GUSTAVE ist eine Fuzzing-Plattform für eingebettete OS-Kernel. Sie basiert auf QEMU und AFL (und allen seinen Forkserver-Geschwistern). Sie ermöglicht es, OS-Kernel wie einfache Anwendungen zu fuzzen.
(c) Airbus 2021, sduverger
GUSTAVE ist eine Fuzzing-Plattform für eingebettete OS-Kernel. Sie basiert auf QEMU und AFL (und all seinen Forkserver-Geschwistern). Sie ermöglicht es, OS-Kernel wie einfache Anwendungen zu fuzzieren.
Dank QEMU ist es plattformübergreifend. Man kann GUSTAVE als eine AFL-Forkserver-Implementierung innerhalb von QEMU mit feinkörniger Zielinspektion betrachten.
GUSTAVE wurde hauptsächlich entwickelt, um eingebettete OS-Kernel zu testen. Es ist möglicherweise nicht das beste Werkzeug, um große und komplexe Kernel wie die von Windows, Linux oder macOS zu fuzzieren.
Wenn Sie jedoch ein Ziel unter der Haube haben, das mit einer oder zwei Anwendungen vorbereitet werden kann, die ohne Benutzereingriff booten, könnte es interessant sein, GUSTAVE eine Chance zu geben.
Das Tool afl-fuzz aus dem AFL-Projekt wird verwendet, um Ihr Ziel automatisch zu fuzzieren. Allerdings kann AFL nicht direkt einen OS-Kernel fuzzieren und erwartet, dass sein Ziel die generierten Testfälle direkt parst.
Kurz gesagt: afl-fuzz führt QEMU mit GUSTAVE-Integration als sein Ziel aus. Im Gegenzug übernimmt GUSTAVE:
Wie der AFL/QEMU-Benutzermodus im AFL++-Projekt implementiert GUSTAVE die binäre Instrumentierung auf QEMU TCG IR-Ebene für die Codeabdeckung.
Sie können jedoch wählen, dies zu deaktivieren und Ihren Ziel-Kernel-Code so neu zu erstellen, dass nur bestimmte Teile der Codeabdeckungsanalyse unterzogen werden. Sie müssen dann allerdings zur Build-Zeit AFL-Shims injizieren, um die Trace-Bitmaps zu aktualisieren. Das war unser ursprünglicher Ansatz (siehe Veröffentlichungen).
Weniger verbreitet in bestehenden Lösungen: GUSTAVE kümmert sich nicht um die Überwachung von Kernel-Panics. Wir betrachten sie als verwaltete Fehler und möchten illegale Verhaltensweisen entdecken, die keinen Alarm ausgelöst haben.
Zu diesem Zweck verlässt sich GUSTAVE auf eine O(1)-Byte-orientierte Speicherfilter-Bitmap, um illegale Zugriffe des Kernels zu erkennen. Es mag große Debatten darüber geben, was aus Sicht des Kernels als illegal angesehen werden könnte. Aber in eingeschränkten, hochdeterministischen Embedded-Umgebungen könnten Sie sich wohl dabei fühlen, legitime Speicherbereiche für Ihre Firmware zu definieren und Out-of-Bound-Zugriffe zu verfolgen.
Es gibt vergleichbare Ansätze, wie:
Die Designentscheidungen von GUSTAVE führen zu den folgenden Unterschieden:
Allerdings müssen Sie GUSTAVE trotzdem mitteilen:
Derzeit wird nur der x86-Host unterstützt. Da viele Arbeitsumgebungen auf dieser Architektur basieren, betrachten wir dies nicht als einschränkende Limitierung.
Die Einschränkung ergibt sich aus der Art und Weise, wie wir ursprünglich das Speicherfilter-Backend auf tcg-target-Ebene für den QEMU-Load/Store-Fast-Path implementiert haben. Die neuere TCGPlugin-Memory-Callbacks-Architektur könnte ein alternativer Ansatz sein, um jeden Host zu unterstützen.
Wir haben die Unterstützung für Intel x86 und PowerPC implementiert und getestet. Die GUSTAVE-Implementierung ist architekturunabhängig. Wenn Sie Ihr Ziel mit QEMU ausführen können, können Sie es mit geringem Aufwand mit GUSTAVE fuzzieren.
Wir bieten beispielhafte Intel 440FX- und PowerPC PREP-Boards mit GUSTAVE-Integration an. Die Implementierung Ihres eigenen Boards ist wirklich einfach und besteht darin, die MACHINE_INIT-Funktion für eine bestimmte Architektur zu wrappen.
Wir haben auch Unterstützung für x86- und PowerPC-GUSTAVE-Instrumentierungs-Shims zu afl-gcc hinzugefügt, falls Sie nicht mit TCG-Binärinstrumentierung vorgehen möchten.
Wir bieten spezifische Entwicklungen für den POK-Mikrokernel an:
Sie müssen:
Lesen Sie das Handbuch für das POK-Ziel.
Material von verschiedenen Vorträgen über GUSTAVE finden Sie unter https://airbus-seclab.github.io/.