VaultFuzzer: Ein zustandsbasierter Ansatz für Linux-Kernel
VaultFuzzer: Ein zustandsbasierter Ansatz für Linux-Kernel
Vault Labs, HardenedVault
Hintergrund
Seit den Anfängen der Computersoftwareentwicklung ist die Softwarequalität zu einem unvermeidlichen Thema im Bereich des Softwaretestens geworden. Um Softwarefehler (allgemein bekannt als Bugs) effizienter identifizieren zu können, erschien Fuzzer (Fuzz-Test-Tool), aber die Ziele des Einsatzes eines Fuzzers in verschiedenen Bereichen sind unterschiedlich:
-
QA-orientiertes Fuzz-Testing, d.h. Bugs erkennen und beheben
-
Sicherheitsorientiertes Fuzz-Testing, d.h. Fehler erkennen und herausfinden, ob es ausnutzbar ist
In Bezug auf die technische Architektur / Implementierung gibt es derzeit zwei Haupttypen von Fuzzern für den Linux / Android-Kernel:
Trinity war das beliebteste Fuzzing-Tool für Linux-Kernel in den frühen 2010er Jahren. Es testet Systemaufrufe basierend auf Regeln mit einer Kombination aus Systemaufrufen und zufälligen Parametern mit bestimmten Bereichen. Die eingehende Erforschung von Codepfaden war nicht ideal, und Trinität war damals die einzige Option. Es ist schwierig, eine breitere Abdeckung jedes Subsystems im Kernel zu erreichen, selbst wenn die hartcodierte Anpassung verwendet wurde. Im Februar 2015 fusionierte KASAN mit dem Linux-Kernel, einem Projekt von Google. Dies ist der Grundstein für den Code Coverage-geführten Fuzzer syzkaller. Viele Sicherheitsforscher und QS-Ingenieure hatten Anfang 2016 begonnen, mit syzkaller zu experimentieren.
Das Problem
Syzkaller als allgemeine Fuzzer-Lösung kann nach mehreren Jahren der Verbesserung gut mit der Mainline-Entwicklung des Linux-Kernels zusammenarbeiten. Eine eingehende Untersuchung spezifischer Subsysteme ist jedoch weit davon entfernt, die hohen Stabilitätsanforderungen der Industriekunden zu erfüllen. Finanzen, ICS (Industrial Control System), Automobil, Cloud Computing und andere Branchen müssen sich unter solchen Umständen möglicherweise mit einigen Problemen befassen:
-
Es werden die 3rd-Party-Kernel-Codes oder -Module eingeführt, die oft ein Hochrisikobereich für Sicherheitslücken darstellen und für die Sicherheitsanalyse durch Reverse Engineering verwendet werden können, auch wenn es sich nicht um Open Source handelt
-
Die feldspezifischen Anwendungen basieren auf dem Codepfad in einem bestimmten Kernel-Subsystem, und der generische QA-Ansatz kann seine Codeabdeckung nicht in der “akzeptablen” Zeit erreichen.
-
Unvollständige Regressionstests in der Anwendung, d.h. der Hersteller der Anwendung schließt den grundlegenden Test der Kernelstabilität in der Regel nicht ab
Unsere Lösung: VaultFuzzer
HardenedVault entwickelte einen zustandsbasierten zielgerichteten Fuzzer “VaultFuzzer” für Linux-Kernel, der auf den oben genannten Anforderungen basiert. VaultFuzzer ist mit dem bestehenden syzkaller-Framework kompatibel, mit dem größten Vorteil, dass die Anwendung des Kunden mit bestimmten Kernel-Subsystemen korreliert werden kann, und solche Fuzz-Tests können dem Produktionssystem eine größere Stabilität verleihen. Die Hauptmerkmale sind:
-
Die Zielfunktionsadresse wird durch statische Analyse von LLVM-IR, Assembly-Code und dem Kernel-Image ermittelt, während Anhänge an gewichtete PCs basierend auf CFG des LLVM-IR-Prozesses abgerufen werden können, die alle von VaultFuzzer verwendet werden.
-
Abdeckungsfilter, der Ziele auf Subsystem, Datei und Codeblock konzentriert, um zu verhindern, dass Berechnungen für die Exploration außerhalb der Ziele verschwendet werden.
-
Gewichtete PCs, um das unsymmetrische Gewichtungssystem basierend auf CFG und verschiedenen Gewichten zu konstruieren, werden verschiedenen Codeblöcken zugewiesen, um die Richtung der Prüfung zu bestimmen.
-
Der Kernel-Zustandsmodus, CLANG/LLVM-Instrumentation, wurde eingeführt, in dem der Zustand der Fehlerauslösung als Testfall aufgezeichnet werden kann, um den realen Zustand des Codepfads in einem komplexeren Kontext effizienter abzubilden, während die Kompatibilität mit dem Korpus im Wesentlichen ein Space-for-Time-Ansatz ist, der den inakzeptablen Leistungsaufwand vermeidet, wie z. B. formale Überprüfungsmethoden.
-
Unterstützt CLANG/LLVM 10/11/12
(Ungefähr) Testergebnisse: VaultFuzzer und Syzkaller
- Fuzzing in CPU-Zeit: 100 Stunden
- Zeit in der physischen Welt: 6 Stunden 40 Minuten
- Hardware: 32-Kern + 64GB RAM
- syzkaller (Aug 2021): Standardrichtlinie
- VaultFuzzer (März 2021): Nur Abdeckungsfilter aktiviert
Aus den Ergebnissen geht hervor, dass TCP und SCTP in VaultFuzzer gut aussehen, weil sie näher an syzbot/CI liegen. Bitte beachten Sie, dass syzbot/CI den Korpus ständig aktualisiert (fügen Sie den neuen Korpus hinzu, wenn er eine neue Codeabdeckung erreicht und umgekehrt), aber die gesamte kumulative Zeit beträgt mehr als 2 Jahre, während wir nur weniger als 7 Stunden laufen. Vaultfuzzer würde eine bessere Leistung erzielen, wenn es einen zustandsbasierten Test von feinkörnigeren Subsystemen wie SCTP hätte.
Schlussfolgerung
Fuzzing ist seit langem entscheidend für Softwaretests und Sicherheit, wobei sich der Softwaretester in der Regel nur darauf konzentriert, Fehler so schnell wie möglich zu identifizieren, um die Systemstabilität zu verbessern, während die Sicherheitsingenieure unterteilt sind in:
- Offensive Seite, um den ausnutzbaren Fehler zu identifizieren und den 0-Tage-Exploit rechtzeitig zu bewaffnen
- Defensive Seite, um alle Fehler zu identifizieren (ob sie ausnutzbar sind oder nicht) und sie so schnell wie möglich zu beheben, um die Stabilität und Sicherheit des Systems zu verbessern
NIST hat [Guidelines on Minimum Standards for Developer Verification of Software] (https://www.nist.gov/system/files/documents/2021/07/13/Developer Verification of Software.pdf) als Reaktion auf die Executive Order EO 14028 im Juli 2021 herausgegeben. Glücklicherweise stehen “Run a fuzzer” und “Regressional test” auf der Liste. Dies wird die langjährige mangelnde Aufmerksamkeit der Branche für Fuzzer im Zusammenhang mit dem Produktionssystem ausgleichen. In Bezug auf Technologietrends glaubt das Sicherheitsteam von Microsoft auch, dass [State-based Fuzzer ein Trend] (https://www.youtube.com/watch?v=o4rE_a3lVXA&t=5120s) in der Zukunft ist
VaultFuzzer wird auch für VED (Vault Exploit Defense) verwendet, um die Stabilität des Kernel-Schutzmoduls zu gewährleisten. HardenedVault ist derzeit der einzige Lösungsanbieter von zustandsbasiertem Linux-Kernel-Fuzzer in Asien.