Technische Details zur Kontrollflussintegrität
„Die Verfügbarkeit einer großen Anzahl von Funktionszeigern im Kernel trägt zur Beliebtheit dieses Angriffsmusters bei.“ Auch wenn Angreifer keinen eigenen ausführbaren Code einschleusen können, können beliebige Teile des vorhandenen Kernel-Codes ausgeführt werden, um ihren Exploit abzuschließen.
LLVMCFI von versucht, diese Angriffe abzuschwächen, indem es gültige Aufrufziele einschränkt und eine Kernel-Panik erzwingt, wenn ein CFI-Verstoß erkannt wird. Vor jeder indirekten Verzweigung wird eine Prüfung hinzugefügt, um zu bestätigen, dass die Zieladresse auf eine gültige Funktion mit einer korrekten Signatur verweist. Dies verhindert, dass eine indirekte Verzweigung zu einer beliebigen Codestelle springt, und schränkt sogar die aufrufbaren Funktionen ein. Ein Angreifer kann weiterhin einen Funktionszeiger ändern, wenn ein Fehler den Zugriff ermöglicht. Das CFI von LLVM beschränkt jedoch 55 % der indirekten Anrufe auf höchstens 5 mögliche Ziele und 80 % auf höchstens 20 Ziele. Um alle gültigen Aufrufziele für jeden indirekten Zweig zu ermitteln, muss der Compiler den gesamten Kernel-Code auf einmal sehen.
Die Verwendung von LTO (Linkzeitoptimierung) macht dies möglich. Das CFI von LLVM erfordert die Verwendung von LTO, wobei der Compiler LLVM-spezifischen Bitcode für alle C erzeugt Kompilierungseinheiten, und ein LTO-fähiger Linker verwendet das LLVM-Backend, um den Bitcode zu kombinieren und zu kompilieren nativen Code.
Zusätzlich zur Ermöglichung der Verwendung von CFI erreicht LTO eine bessere Laufzeitleistung durch programmübergreifende Analyse und modulübergreifende Optimierung.
ThinLTO hat die Leistungsverbesserung von LTOs fast eingeholt. Im ThinLTO-Modus, wie bei regulärem LTO, Klirren Gibt nach der Kompilierungsphase LLVM-Bitcode aus. Der ThinLTO-Bitcode wird durch eine kompakte Zusammenfassung des Moduls ergänzt. Während des Verknüpfungsschritts werden nur die Zusammenfassungen gelesen und in einem kombinierten Zusammenfassungsindex zusammengeführt, der einen Index der Funktionsstandorte für den späteren modulübergreifenden Funktionsimport enthält. Anschließend wird eine schnelle und effiziente Analyse des gesamten Programms anhand des kombinierten zusammenfassenden Index durchgeführt. ThinLTO ermöglicht einen Multithread-Verknüpfungsprozess, was zu einer kürzeren Kompilierungszeit führt.
Da CFI die Programmausführung unterbricht, wenn es auf bestimmte Fehlerklassen trifft, wird es, wie bereits erwähnt, auch als Tool zur Fehlersuche eingestuft, wenn es im permissiven Modus verwendet wird. Permissive CFI zeigt CFI-Verstöße im Kernel-Protokoll an, ohne eine Kernel-Panik auszulösen. Die Kernel 4.9 (Geräte der Pixel-3-Generation) und 4.14 (Geräte der Pixel-4-Generation) hatten mehrere Funktionstypen Nichtübereinstimmungen, die zu CFI-Verstößen führen, die von Google in Patchsets behoben wurden, die im Kernel/Common verfügbar sind Repos.
Aufgrund der Natur des Android-Ökosystems sind diese Abweichungen jedoch wahrscheinlich auch im spezifischen Code des SoC-Herstellers (in diesem Fall Qualcomm) oder OEM (OnePlus) zu finden. Mehrere CFI-Verstöße im Qualcomm-Code, die sich vom 4.19-Kernel unterscheiden, wurden im Kirisakura-Kernel für OnePlus 8 Pro behoben (Beispiel: 1, 2, 3).
Beim Ausführen des Kernels in permissivem CFI wurden auch CFI-Verstöße im Code im Zusammenhang mit OnePlus-Treibern festgestellt (relevante Commits sind zu finden). Hier Und Hier). Der Kirisakura-Kernel für das OnePlus 8 Pro läuft mit erzwungenem CFI und schützt so seine Benutzer vor dieser Art von Code-Wiederverwendungsangriffen.“
mehr lesen
Heimwerker (d. h. Wiederverwerter alter PC-Teile). Skanda ist seit den Eclair-Tagen ein begeisterter Android-Nutzer und verfolgt auch gerne die jüngsten Entwicklungstrends in der Welt des Single-Board-Computings.