Framework zur Automatisierung der Fuzzable -Ziel -Entdeckung mit statischer Analyse
Schwachstellenforscher, die Sicherheitsbewertungen auf Software durchführen, nutzen häufig die Fähigkeiten der Berichterstattung durch leistungsstarke Tools wie AFL ++ und Libfuzzer. Dies ist wichtig, da es den Bughunting -Prozess automatisiert und schnell ausnutzbare Bedingungen in den Zielen zeigt. Bei der Begegnung mit großen und komplexen Codebasen oder Binärdateien geschlossene Source müssen die Forscher jedoch die Zeit sorgfältig widmen, um sie manuell zu prüfen und umzukehren, um Funktionen zu identifizieren, bei denen fuzzierbasierte Erkundungen nützlich sein können.
Fuzzable ist ein Framework, das sowohl in C/C ++ - Quellcode als auch in Binärdateien integriert wird, um Sicherheitslücken bei der Identifizierung von Funktionszielen zu unterstützen, die für die Fuzzing lebensfähig sind. Dies erfolgt durch die Anwendung mehrerer statischer analysebasierter Heuristik, um riskante Verhaltensweisen in der Software und die Funktionen, die sie ausführen, zu bestimmen. Forscher können dann den Rahmen nutzen, um grundlegende Geschirrvorlagen zu generieren, mit denen dann nach Schwachstellen gesucht oder als Teil einer kontinuierlichen Fuzzing-Pipeline wie dem Oss-Fuzz-Projekt von Google integriert werden kann.
Fuzzable wird nicht nur als eigenständiges Werkzeug ausgeführt, sondern auch als Plugin für den binären Ninja -Disassembler integriert, wobei andere Backends der Demontage entwickelt wurden.
Schauen Sie sich den ursprünglichen Blog -Beitrag an, in dem das Tool hier beschrieben wird, in dem die technischen Spezifikationen der statischen Analyseheuristik und die Entstehung dieses Tools hervorgehoben werden. Dieses Tool wird auch bei Black Hat Arsenal USA 2022 gezeigt.
Einige binäre Ziele erfordern möglicherweise einige Bereinigungen (dh Signature -Matching oder identifizierende Funktionen aus dem Einbau) und verwendet daher in erster Linie Binär -Ninja als Demontage -Backend, da diese Probleme effektiv gelöst werden können. Daher kann es sowohl als eigenständiges Werkzeug als auch als Plugin verwendet werden.
Da Binär -Ninja für alle nicht zugänglich ist und es möglicherweise eine Nachfrage nach Sicherheitsbewertungen und möglicherweise in der Cloud vergrößert wird, wird auch ein ANGR -Fallback -Backend unterstützt. Ich gehe davon aus, dass ich auch andere Disassembler in die Straße einbeziehen soll (Priorität: Ghidra).
Wenn Sie einen binären Ninja -Werbespot haben, sollten Sie die API für den eigenständigen Kopflosen verwenden:
$ python3 /Applications/Binary Ninja.app/Contents/Resources/scripts/install_api.py
Mit pip einbauen:
$ pip install fuzzable
Wir verwenden Poesie für Abhängigkeitsmanagement und Gebäude. Um einen manuellen Build durchzuführen, klonen Sie das Repository mit den Drittanbietermodulen:
$ git clone --recursive https://github.com/ex0dus-0x/fuzzable
Manuell installieren:
$ cd fuzzable/
# without poetry
$ pip install .
# with poetry
$ poetry install
# with poetry for a development virtualenv
$ poetry shell
Sie können jetzt Binärdateien und/oder Quellcode mit dem Tool analysieren!
# analyzing a single shared object library binary
$ fuzzable analyze examples/binaries/libbasic.so
# analyzing a single C source file
$ fuzzable analyze examples/source/libbasic.c
# analyzing a workspace with multiple C/C++ files and headers
$ fuzzable analyze examples/source/source_bundle/
Fuzzable kann einfach über den Biny Ninja Plugin Marketplace installiert werden, indem Sie zu Binary Ninja > Manage Plugins und danach suchen. Hier ist ein Beispiel für das fuzzable Plugin, die Genauigkeit, die Ziele für die Verschmelzung und eine weitere Anfälligkeitsbewertung identifiziert:

Fuzzable bietet verschiedene Optionen, um Ihre Analyse zu verbessern. Weitere werden in zukünftigen Plänen und allen Feature -Anfragen unterstützt.
Um die Fuzzabilität zu bestimmen, verwendet Fuzzable verschiedene Heuristiken, um zu bestimmen, welche Ziele am besten für die dynamische Analyse zu zielen sind. Diese Heuristiken werden alle unter Verwendung der Scikit-Criteria-Bibliothek unterschiedlich gewichtet, in der die Entscheidungsanalyse mit mehreren Kriterien verwendet wird, um die besten Kandidaten zu bestimmen. Diese Metriken und es gibt es Gewichte hier sind zu sehen:
| Heuristik | Beschreibung | Gewicht |
|---|---|---|
| Fuzz freundlicher Name | Der Symbolname impliziert Verhalten, das die Datei-/Puffereingabe aufnimmt | 0,3 |
| Riskante Waschbecken | Argumente, die in riskante Anrufe fließen (dh memcpy) | 0,3 |
| Natürliche Schleifen | Anzahl der mit der Dominanzgrenze erkannten Schleifen | 0,05 |
| Zyklomatische Komplexität | Komplexität des Funktionsziels basierend auf Kanten + Knoten | 0,05 |
| Deckungstiefe | Anzahl der Callees, die das Ziel durchquert | 0,3 |
Wie bereits erwähnt, sehen Sie sich den technischen Blog-Beitrag an, um einen detaillierteren Blick darauf zu erhalten, warum und wie diese Metriken genutzt werden.
Viele Metriken wurden größtenteils von Vincenzo Iozzos ursprünglichem Werk in 0-Knowledge-Fuzzing inspiriert.
Alle Ziele, die Sie analysieren möchten, ist vielfältig, und nicht in der Lage sein, jedes Rand -Fallverhalten im Programmziel zu berücksichtigen. Daher kann es während der Analyse wichtig sein, diese Gewichte angemessen einzustellen, um festzustellen, ob unterschiedliche Ergebnisse für Ihren Anwendungsfall sinnvoller sind. Um diese Gewichte in der CLI zu stimmen, geben Sie einfach das Argument --score-weights an:
$ fuzzable analyze <TARGET> --score-weights=0.2,0.2,0.2,0.2,0.2
Standardmäßig filtert Fuzzable die Funktionsziele basierend auf den folgenden Kriterien:
static sind und nicht durch Header entlarvt werden. Um Anrufe zu sehen, die von Fuzzable herausgefiltert wurden, stellen Sie die Flag --list_ignored fest:
$ fuzzable analyze --list-ignored <TARGET>
In Binary Ninja können Sie diese Einstellung in Settings > Fuzzable > List Ignored Calls drehen.
In dem Fall, dass Scheiße fälschlicherweise wichtige Anrufe herausfiltert, die analysiert werden sollten, wird empfohlen --include-* Argumente zu verwenden, um sie während des Laufs einzuschließen:
# include ALL non top-level calls that were filtered out
$ fuzzable analyze --include-nontop <TARGET>
# include specific symbols that were filtered out
$ fuzzable analyze --include-sym <SYM> <TARGET>
In Binary Ninja wird dies durch Settings > Fuzzable > Include non-top level calls und Symbols to Exclude unterstützt.
Nachdem Sie Ihre idealen Kandidaten für Fuzz gefunden haben, hilft Ihnen Fuzzable auch dabei, Fuzzing-Gurte zu generieren, die (fast) bereit sind, instrumentiert und für die Verwendung mit einem filzbasierten Fuzzeller (dh afl ++, honggfuzz) oder in Memory FuzZer (libfuzzer) zu kompilieren. Um dies in der CLI zu tun:
# generate harness from a candidate
$ fuzzable create-harness target --symbol-name=some_unsafe_call
# make minimal and necessary modifications to the harness
$ vim target_some_unsafe_call_harness.cpp
# example compilation for AFL-QEMU, which is specified in the comments of the generated harness
$ clang target_some_unsafe_call_harness.cpp -no-pie -o target_some_unsafe_call_harness -ldl
# create your base seeds, ideally should be more well-formed for input
$ mkdir in/
$ echo "seed" >> in/seed
# start black box fuzzing
$ afl-fuzz -Q -m none -i in/ -o out/ -- ./target_some_unsafe_call_harness
Wenn es sich bei diesem Ziel um eine Quellcodebasis handelt, wird die generische Quellvorlage verwendet.
Wenn das Ziel binär ist, wird die generische Black-Box-Vorlage verwendet, die idealerweise mit einem Fuzzing-Emulationsmodus wie AFL-Qemu verwendet werden kann. Eine Kopie des Binärs wird auch als gemeinsam genutztes Objekt erstellt, wenn das Symbol nicht direkt so exportiert wird, um mit LEF -ED -ED dlopen zu werden.
Im Moment ist diese Funktion ziemlich rudimentär, da sie einfach einen eigenständigen C ++-Kabelbaum erzeugt, der mit den entsprechenden Parametern besiedelt ist, und keinen automatischen Code, der für Verhaltensweisen von Laufzeiten benötigt wird (dh Instanzipen- und Freigabestrukturen). Die für Fuzzable erstellten Vorlagen sollten Sie jedoch schnell zum Laufen bringen. Hier sind einige ehrgeizige Merkmale, die ich im Laufe der Straße implementieren möchte:
Fuzzable unterstützt die Erstellung von Berichten in verschiedenen Formaten. Die aktuellen, die unterstützt werden, sind JSON, CSV und Markdown. Dies kann nützlich sein, wenn Sie dies als Teil der Automatisierung verwenden, in dem Sie die Ausgabe in einem serialisierbaren Format einnehmen möchten.
Geben Sie in der CLI einfach das Argument --export mit einem Dateinamen mit der entsprechenden Erweiterung übergeben:
$ fuzzable analyze --export=report.json <TARGET>
Gehen Sie in Binary Ninja zu Plugins > Fuzzable > Export Fuzzability Report > ... und wählen Sie das Format aus, auf das Sie exportieren möchten, und den Pfad, an den Sie ihn schreiben möchten.
Dieses Tool wird kontinuierlich entwickelt und jede Hilfe von externen Mantänen wird geschätzt!
Fuzzable ist unter der MIT -Lizenz lizenziert.