
Ein evolutionärer wissensbasierter Fuzzer
Dieses Dokument soll kurz die Theorie hinter Choronzon erläutern. Darüber hinaus enthält es Details zu seinen Interna und wie man Choronzon erweitern kann, um neue Anforderungen zu erfüllen. Ein Überblick über die Architektur von Choronzon wurde ursprünglich auf der ZeroNights 2015 Konferenz vorgestellt. Eine Aufzeichnung des Vortrags und die Präsentationsfolien sind ebenfalls verfügbar.
Choronzon ist ein evolutionärer Fuzzer. Es versucht, den evolutionären Prozess nachzuahmen, um kontinuierlich bessere Ergebnisse zu erzielen. Um dies zu erreichen, verfügt es über ein Bewertungssystem, das klassifiziert, welche der gefuzzten Dateien interessant sind und welche verworfen werden sollten.
Darüber hinaus ist Choronzon ein wissensbasierter Fuzzer. Es verwendet benutzerdefinierte Informationen, um Dateien des Ziel-Dateiformats zu lesen und zu schreiben. Um sich mit der Terminologie von Choronzon vertraut zu machen, sollten Sie bedenken, dass jede Datei durch ein Chromosom repräsentiert wird. Benutzer sollten die elementare Struktur des betrachteten Dateiformats beschreiben. Eine allgemeine Übersicht über das Dateiformat wird bevorzugt, anstatt jedes Detail und jeden Aspekt zu beschreiben. Jede dieser benutzerdefinierten elementaren Strukturen wird als Gen betrachtet. Jedes Chromosom enthält einen Baum von Genen und kann daraus die entsprechende Datei erstellen.
Choronzon ist in drei Teilsysteme unterteilt: das Tracer-Modul, das Chromosome-Modul und den Fuzzer.
Kurz gesagt: Die Chromosom-Komponente wird verwendet, um das Ziel-Dateiformat zu beschreiben. Benutzer können ihre eigenen Module schreiben, um neue oder benutzerdefinierte Formate zu unterstützen. Als Testfall ist ein PNG-Modul mit Choronzon enthalten.
Andererseits ist die Tracer-Komponente dafür verantwortlich, die Zielanwendung zu überwachen und verschiedene Informationen über ihre Ausführung zu sammeln. Diese Version von Choronzon verwendet Intels Pin Binärinstrumentierungswerkzeug, um die während der Ausführung besuchten Basisblöcke zu protokollieren. Choronzon kann jedoch auch andere Tracing-Backends unterstützen. Beachten Sie auch, dass in der nächsten Version von Choronzon Pin aufgrund seiner enormen Leistungseinbußen ersetzt wird.
Schließlich wird die Fuzzer-Komponente verwendet, um den Inhalt der zu testenden Dateien zu verändern. Das Modul enthält eine Sammlung von Mutatoren und Rekombinatoren. Mutatoren verändern die Datei einfach wie übliche Fuzzer. Zum Beispiel führen sie Byte-Flipping, Byte-Vertauschung, zufällige Byte-Mutation usw. durch. Aber Choronzon hat eine weitere Funktion, die bei Fuzzern nicht so üblich ist. Rekombinatoren nutzen die Informationen über die Struktur des Dateiformats, die vom Chromosom-Modul bereitgestellt werden, um intelligentes Fuzzing durchzuführen.
Im Verzeichnis chromosome/parsers finden Sie die Datei PNG.py. Dieses
Python-Modul beschreibt dem Fuzzer das PNG-Dateiformat. Sie können Ihre eigenen
Module für andere Dateiformate in diesem Verzeichnis hinzufügen.
Die grundlegende Idee hinter dem Chromosom-Teilsystem ist es, die ursprünglichen Seed-Dateien mit Hilfe eines Deserializers in einen Baum von Genen umzuwandeln. Irgendwann werden die (gefuzzten) Gene mit einem Serializer in eine Datei geschrieben.
Bedenken Sie, dass in Choronzon das Ziel des Parser-Moduls darin besteht, die elementare Struktur des Dateiformats bereitzustellen, anstatt jedes kleine Detail. Dies hilft dem Fuzzer, meist wohlgeformte Dateien zu erstellen, wodurch ein frühzeitiger Abbruch in der Zielanwendung vermieden wird. Zusätzlich spart dieser Ansatz Zeit, da die Beschreibung jedes Aspekts des Dateiformats zeitaufwändig ist und einen erheblichen Entwicklungsaufwand mit sich bringt.
Ein neues Parser-Modul muss Folgendes importieren:
und es muss implementieren:
Im mitgelieferten Beispiel von Choronzon entspricht jedes PNGGene einem PNG- Chunk. Allgemein können Sie sich ein Gen als eine elementare Datenstruktur des Zielformats vorstellen. Jedes Chromosom besteht aus einem Baum von Genen und repräsentiert eine eindeutige Datei. Jedes Gen muss in der Lage sein, einen Byte-String zu erzeugen, der seine Daten zusammen mit den Daten der untergeordneten Gene im Baum enthält.
Der PNGSerializer muss in der Lage sein, aus einer Liste von Genen eine (weitgehend wohlgeformte) Datei zu erzeugen. Andererseits muss PNGDeserializer in der Lage sein, eine gültige Datei des Zielformats zu parsen und in einen Baum von Genen zu deserialisieren.
Überprüfen Sie chromosome/parsers/PNG.py für ein kommentiertes Beispiel für das PNG-Format.
Das Tracer-Modul wird verwendet, um die Zielanwendung (und/oder eine oder mehrere ihrer Bibliotheken) zu disassemblieren. In dieser Version von Choronzon wird dies mit IDA erreicht. Wir haben diesen Ansatz gewählt, weil wir interessante Informationen aus der Fuzzing-Kampagne mit unseren IDBs korrelieren können. Allerdings werden wir die Abhängigkeit von IDA in naher Zukunft möglicherweise aufgeben, um Choronzon portabler und zugänglicher zu machen.
Eine Datei wird mit Hilfe eines Pin-Dienstprogramms gegen eine Anwendung getestet. Im
Verzeichnis analyzer/coverage befindet sich der Quellcode dieses Pin-Tools,
das am Anfang jedes Basisblocks in der Zielanwendung Hooks einfügt.
Wenn die Ausführung beendet ist, korrelieren wir den getroffenen Basisblock
mit dem Basisblock aus der Binärdatei. So können wir Metriken berechnen, die für uns
wertvoll sind (Abdeckung usw.).
Die Fuzzer-Komponente verwendet die Chromosom-Darstellung, um eine Datei zu fuzzen. Wie bereits erwähnt, gibt es in Choronzon zwei Fuzzing-Methoden.
Bei der ersten Methode holt Choronzon den Inhalt von einem oder mehreren Genen
und wendet einen der Mutatoren an. Mutatoren implementieren übliche aber
effektive Fuzzing-Methoden wie zufällige Byte-Mutation, Setzen des höchsten Bits, Byte-Vertauschung
und viele mehr. Sie können auch Ihre eigenen benutzerdefinierten Mutatoren schreiben und sie in
fuzzers/mutators.py hinzufügen.
Die zweite Fuzzing-Methode heißt Rekombination. Rekombinatoren werden verwendet, um die Struktur der Datei zu ändern. Hier ist ein Beispiel mit dem PNG-Format.
PNG-Dateien bestehen aus aufeinanderfolgenden Chunks, die vier Felder enthalten:
Nehmen wir an, wir haben eine PNG-Datei, die nur IHDR-, IDAT- und IEND-Chunks enthält. Ihre Struktur würde folgendermaßen aussehen:
[ PNG-Signatur ] [ IHDR ] [ IDAT ] [ IEND ]
Da Choronzon die grundlegenden Strukturen (d.h. die PNG-Chunks) kennt, ist es in der Lage, deren Reihenfolge zu ändern. Nach einer erfolgreichen Rekombination kann die gefuzzte PNG-Ausgabedatei so aussehen:
[ PNG-Signatur ] [ IDAT ] [ IHDR ] [ IEND ]
Choronzon enthält viele weitere Rekombinationsstrategien, die es in die Lage versetzen, auch mit komplizierten Dateiformaten umzugehen.
Choronzon wurde getestet mit Python 2.7, Pin 3, IDA Pro 6.6 bis 6.9, auf Ubuntu 16.04 LTS (Linux-Kernel 4.4) und Windows 10.
Um es auszuführen, müssen Sie das Python-Paket sortedcontainers installieren. Sie finden es hier oder installieren es über pip.
Darüber hinaus benötigt Choronzon IDA Pro (genauer gesagt dessen Terminalversion). Der Pfad zu IDA Pro sollte in Ihrer Konfigurationsdatei wie folgt angegeben werden:
DisassemblerPath = 'C:\\Program Files (x86)\\IDA 6.6'
Es wurde erfolgreich mit IDA Pro 6.6, 6.7, 6.8 und 6.9 getestet.
Choronzons Abdeckungs-Pin-Tool befindet sich unter analyzer/coverage und muss
kompiliert werden. Sie können die Pin-Dokumentation für Details überprüfen, oder Sie
können die folgenden Schritte ausführen:
coverage.cpp und makefile.rules nach
/path/to/pin/source/tools/MyPinToolmake aus. Wenn Sie unter Windows sind, sollten Sie die Visual
Studio-Befehlszeile verwenden und das make-Dienstprogramm sowie seine Abhängigkeiten von
Cygwin nutzen.obj-intel64 (oder obj-ia32 für 32-Bit-Systeme)
zurück nach /path/to/choronzon/analysis/coverageUm mit Choronzon zu fuzzen, müssen Sie eine Konfigurationsdatei
bereitstellen. Im Verzeichnis settings befindet sich ein Beispiel für Choronzons
Konfiguration.