
Ein Hypervisor für Fuzzing, erstellt mit WHVP und Bochs.
Hallo! Willkommen bei applepie! Dieses Tool wurde für Fuzzing, Introspection und das Finden von Bugs entwickelt! Es ist ein Hypervisor, der die Windows Hypervisor Platform API verwendet, die in aktuellen Windows-Versionen vorhanden ist (insbesondere wurde es auf Windows 10 17763 entwickelt und getestet). Bochs wird für tiefgehende Introspection und Geräteemulation verwendet.
Die Windows Hypervisor Platform API (WHVP) ist eine API-Sammlung, um auf die Hypervisor-Fähigkeiten von Hyper-V zuzugreifen. Diese API macht es uns leicht, eine virtuelle Maschine komplett im Userspace zu implementieren, ohne dass spezielle Treiber oder Berechtigungen erforderlich sind.
Dies ist ein sich schnell entwickelndes Projekt. Ich werde wahrscheinlich twittern, wenn neue Funktionen erscheinen, bevor sie dokumentiert werden.
Ich mag physische Dinge für meine Projekte:
Dieses Tool wurde für Fuzzing und Introspection während der Sicherheitsforschung entwickelt. Durch die Verwendung eines Hypervisors können gängige Fuzzing-Techniken auf jedes Ziel angewendet werden, sei es Kernel oder Userspace. Diese Umgebung ermöglicht das Fuzzing ganzer Systeme ohne Quellcode des Ziels. Auf Hypervisor-Ebene kann Code Coverage gesammelt werden, und bei Bedarf kann die Bochs-Emulation genutzt werden, um in einer Emulationsumgebung beliebige Introspection durchzuführen. Diese Coverage-Informationen können verwendet werden, um die Effektivität der Fuzz-Fälle zu ermitteln. Ein Fuzz-Fall, der zu einer Erhöhung der Coverage führt, kann als interessanter Fall gespeichert werden. Dieser Input kann später verwendet werden und durch neue Korruptionen erweitert werden.
Snapshot-Fuzzing ist die primäre Verwendung dieses Tools. Dabei wird ein Snapshot eines Systems in einem bestimmten Zustand erstellt und gespeichert. Dieser Snapshot kann dann zum Fuzzing geladen werden, ein Fuzz-Fall wird injiziert und die Ausführung fortgesetzt. Da die VM sehr günstig zurückgesetzt werden kann, kann die VM oft zurückgesetzt werden. Wenn Word 5 Sekunden zum Booten braucht, man es aber genau dann snapshotieren kann, wenn es die Datei liest, kann der Fuzz-Fall auf das reduziert werden, was für einen Input relevant ist. Dies ermöglicht eine sehr enge Fuzzing-Schleife, ohne dass Quellcode benötigt wird. Da die VMs vollständig getrennte Systeme sind, können viele parallel ausgeführt werden, um auf alle Kerne zu skalieren.
Derzeit unterstützt dieses Tool nur das Sammeln von Code Coverage, das dynamische Herunterladen von Symbolen für Windows und das Parsen von Symbolen/Modulen für Windows-Ziele. Die Fuzzing-Unterstützung wird bald hinzugefügt.
Da ich die meisten dieser Funktionen bereits entwickelt habe (Coverage, Fuzzing, schnelle Resets, etc.), erwarte ich, dass dieses Projekt ziemlich schnell fuzzing-bereit wird, es sei denn, ich werde abgelenkt :D
Ich strebe Ende Januar für Coverage (erledigt!), Feedback, Modulauflistungen (erledigt!), Prozesslisten, schnelle Resets und Symbolunterstützung (erledigt!) an. Damit wäre es ein sehr leistungsfähiger Fuzzer.
Das Hauptziel ist modernes Windows 10. Windows-Ziele unterstützen das Herunterladen von Symbolen aus dem Symbolspeicher. Dies ermöglicht symbolische Coverage bei Windows-Zielen von Haus aus. Der Code ist jedoch so geschrieben, dass eine Linux-Erleuchtung (enlightenment) einfach hinzugefügt werden kann.
Ohne jegliche Erleuchtung kann jedes bootfähige Betriebssystem dennoch gefuzzt werden und grundlegende Coverage gesammelt werden.
Bevor Sie Probleme mit der Betriebssystemunterstützung melden, validieren Sie bitte, ob das Problem im Hypervisor/den Änderungen an Bochs liegt, indem Sie versuchen, Ihr Ziel mit standardmäßig vorkompiliertem Bochs ohne Hypervisor zu booten. Bochs wird nicht häufig verwendet und kann oft Fehler verursachen, selbst bei alltäglichen Dingen wie dem Booten von Linux. Insbesondere aufgrund der schnellen internen Änderungen an CPUID/MSR-Verwendungen im Zusammenhang mit Spectre/Meltdown-Mitigation, die in Betriebssysteme einfließen.
Siehe die Issues-Seite auf GitHub für eine Liste der Probleme. Ich habe sie bereits mit einigen bestückt. Einige davon müssen schnell behoben werden, bevor die Fuzzing-Entwicklung beginnt.
Zum Bauen benötigen Sie einige Dinge:
Installieren Sie Visual Studio 2017 und stellen Sie sicher, dass es aktualisiert ist. Wir verwenden hier einige hochaktuelle APIs, Header und Bibliotheken.
Ich habe die cl.exe-Version verwendet: Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27025.1 for x64
Und SDK-Version 10.0.17763.0
Installieren Sie Rust über https://rustup.rs/. Ich habe rustc 1.32.0-nightly (b3af09205 2018-12-04) verwendet.
Stellen Sie sicher, dass Sie die Toolchain x86_64-pc-windows-msvc installieren, da nur 64-Bit für dieses Projekt unterstützt wird.
Stellen Sie sicher, dass cargo in Ihrem Pfad ist. Dies sollte standardmäßig der Fall sein.
Holen Sie sich Python von https://www.python.org/ und stellen Sie sicher, dass es in Ihrem PATH ist, sodass python aufgerufen werden kann.
Installieren Sie 64-Bit-Cygwin (https://www.cygwin.com/setup-x86_64.exe) speziell nach C:\cygwin64. Stellen Sie bei der Installation von Cygwin sicher, dass Sie die Pakete autoconf und make installieren.
Gehen Sie zu "Windows-Features aktivieren oder deaktivieren" und aktivieren Sie das Kontrollkästchen neben "Hyper-V" und "Windows Hypervisor Platform". Dies setzt natürlich voraus, dass Ihr Computer Hyper-V unterstützt.
Diese Installationsanleitung wurde auf Folgendem verifiziert:
Saubere Installation von Windows 10, Build 17763
rustc 1.33.0-nightly (8e2063d02 2019-01-07)
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27025.1 for x64
Visual Studio Community 2017 Version 15.9.4
applepie Commit `f84c084feb487e2e7f31f9052a4ab0addd2c4cf9`
Python 3.7.2 x64
git version 2.20.1.windows.1

