SockFuzzer: XNU-Kernel-Fuzzing-Framework
Projektstatus
SockFuzzer, ursprünglich als netzwerkorientierter Fuzzer für den XNU-Kernel (verwendet in macOS und iOS) entwickelt, hat sich zu einem umfassenden Kernel-Fuzzing-Framework entwickelt. Obwohl der ursprüngliche Name als Hommage an die Wurzeln beibehalten wurde, deckt SockFuzzer heute ein breites Spektrum an Kernel-Subsystemen ab, darunter BSD, Mach, virtueller Speicher und mehr. Das Projekt implementiert einen einzigartigen Ansatz, indem es den XNU-Kernel in eine Bibliothek umwandelt, die im Userspace „gebootet" und gefuzzt werden kann, was eine effiziente Schwachstellenerkennung und -reproduktion über mehrere Subsysteme hinweg ermöglicht.
Projektziele
- Den XNU-Kernel umfassend in einer kontrollierten Umgebung testen
- Schwachstellen in verschiedenen XNU-Subsystemen entdecken und reproduzieren
- Ein Framework für kontinuierliches Fuzzing und die Verbesserung der XNU-Sicherheit bereitstellen
- Den Wert der Implementierung fortschrittlicher Fuzzing-Techniken in der Kernel-Forschung demonstrieren
- Effizientes Testen komplexer Kernel-Interaktionen und -Subsysteme ermöglichen
Architekturübersicht
SockFuzzer verwendet ein Host-/„XNU-Gast"-Design, bei dem der XNU-Kernel als Bibliothek kompiliert und in einer benutzerdefinierten Userspace-Umgebung ausgeführt wird. Diese Architektur besteht aus mehreren Schlüsselkomponenten:
- Host-Umgebung
- XNU-Gastbibliothek
- Benutzerdefinierter Scheduler (basiert auf Concurrence)
- Fuzzing-Engine (Centipede aus Googles fuzztest-Projekt)
- Test-Runner und Harness
Host-Umgebung
Die Host-Umgebung bildet die Grundlage für die Ausführung der XNU-Gastbibliothek und die Verwaltung des Fuzzing-Prozesses. Sie umfasst:
- Benutzerdefinierte Implementierungen von Kern-Diensten des Kernels
- Hypercall-Schnittstelle für die Kommunikation zwischen Host und XNU-Gast
- Test-Runner und Harness zur Ausführung von Fuzz-Tests
XNU-Gastbibliothek
Der XNU-Kernel wird als Bibliothek (libxnu) mit minimalen Modifikationen kompiliert, um im Userspace zu laufen. Zu den wichtigsten Aspekten gehören:
- Symbol-Präfixierung und -Verwaltung, um Konflikte mit Host-Symbolen zu vermeiden
- Selektive Offenlegung interner XNU-Funktionen über ein Versionsskript
- Unterstützung mehrerer Subsysteme: BSD, Mach, virtueller Speicher, Threads, Prozesse usw.
- Null-Pmap-Schicht für die Unterstützung von virtuellem Speicher (mit Plänen für die zukünftige Unterstützung von ARM-Pmap)
Benutzerdefinierter Scheduler
Basierend auf dem verbesserten Concurrence-Projekt unterstützt der benutzerdefinierte Scheduler nun vollständige Threading-Funktionen:
- Executor: Bietet Thread-Erstellung, -Löschung und Kontextwechsel
- FuzzedScheduler: Verwaltet Thread-Zustände und Scheduling-Entscheidungen
- Integration mit der XNU-Gastbibliothek für ordnungsgemäße Multithreading-Unterstützung
Test-Runner und Harness
Der Test-Runner und das Harness verwalten die Ausführung von Fuzz-Tests und bieten:
- Initialisierung der XNU-Gastumgebung
- Ausführung von Fuzz-Inputs über verschiedene Subsysteme hinweg
- Absturzerkennung und -meldung
Hauptfunktionen
- Umfassende XNU-Kernel-Abdeckung: Testen mehrerer Subsysteme, einschließlich BSD, Mach, virtuellem Speicher, Threads und Prozessen
- XNU-Ausführung im Userspace: Ausführen von XNU-Kernelkomponenten in einer kontrollierten Userspace-Umgebung
- Vollständige Threading-Unterstützung: Nutzung des verbesserten Concurrence für ordnungsgemäße Multithreading-Fähigkeiten
- Unterstützung für virtuellen Speicher: Verwendung einer Null-Pmap-Schicht mit Plänen für ARM-Pmap-Unterstützung
- MIG-Fuzzing: Unterstützung für das Fuzzing von Mach-Interface-Generator-Schnittstellen (MIG)
- Hypercall-Schnittstelle: Ermöglicht die Kommunikation zwischen Host- und XNU-Gastkomponenten
Unterstützte Funktionen
- BSD
- Mach
- Virtueller Speicher (mit Null-Pmap-Schicht)
- Threads und Prozesse
- Netzwerk
- Mach-Nachrichten
- MIG-Schnittstellen
Arbeitsablauf
- Der XNU-Kernel wird mit den erforderlichen Modifikationen als Bibliothek kompiliert
- Die Host-Umgebung initialisiert die XNU-Gastbibliothek und den benutzerdefinierten Scheduler
- Centipede generiert strukturierte Eingaben mithilfe von Protobuf-Definitionen
- Das Test-Harness führt die Eingaben aus und ruft Syscalls, Mach-Nachrichten und andere Kernel-Schnittstellen auf
- Der benutzerdefinierte Scheduler verwaltet die Thread-Ausführung innerhalb des XNU-Gasts
- ASAN überwacht auf Speicherkorruptionsprobleme
- Abstürze und Coverage-Informationen werden gesammelt und analysiert
Einschränkungen und zukünftige Arbeiten
- IOKit-Unterstützung: Die aktuelle Implementierung unterstützt keine IOKit-Subsysteme
- Reines Binär-Fuzzing: Der Ansatz basiert derzeit auf Quellcode, der nicht alle Module umfasst
Zukünftige Arbeiten umfassen:
- Implementierung der IOKit-Unterstützung
- Integration der ARM-Pmap-Unterstützung für virtuellen Speicher
- Anpassung von Techniken für reine Binär-Fuzzing-Szenarien
- Fortsetzung der Erweiterung der Abdeckung und Unterstützung für XNU-Subsysteme
Einschränkungen der öffentlichen Veröffentlichung
Um dieses Repository gut strukturiert zu halten, müssen mehrere Abhängigkeiten von den Benutzern selbst zu third_party hinzugefügt werden, wie z. B. xnu, bootstrap_cmds und einige andere Bibliotheken.