Integrität des Kernel-Kontrollflusses

Kontrollflussintegrität (CFI) ist ein Sicherheitsmechanismus, der Änderungen am ursprünglichen Kontrollflussdiagramm einer kompilierten Binärdatei nicht zulässt, wodurch die Durchführung solcher Angriffe erheblich erschwert wird.

In Android 9 haben wir die Implementierung von CFI durch LLVM in mehr Komponenten und auch im Kernel aktiviert. System-CFI ist standardmäßig aktiviert, Sie müssen jedoch Kernel-CFI aktivieren.

Das CFI von LLVM erfordert die Kompilierung mit Link-Time Optimization (LTO) . LTO behält die LLVM-Bitcode-Darstellung von Objektdateien bis zur Verbindungszeit bei, sodass der Compiler besser entscheiden kann, welche Optimierungen durchgeführt werden können. Die Aktivierung von LTO reduziert die Größe der endgültigen Binärdatei und verbessert die Leistung, erhöht jedoch die Kompilierungszeit. Beim Testen auf Android führt die Kombination von LTO und CFI zu einem vernachlässigbaren Overhead bei Codegröße und Leistung; in einigen Fällen besserte sich beides.

Weitere technische Details zu CFI und zur Handhabung anderer Vorwärtssteuerungsprüfungen finden Sie in der LLVM-Designdokumentation .

Implementierung

Die kCFI-Patches sind in allen unterstützten Android-Kernelversionen enthalten. Die Option CONFIG_CFI_CLANG aktiviert kCFI und ist standardmäßig in GKI festgelegt.

Fehlerbehebung

Beheben Sie nach der Aktivierung alle Typkonfliktfehler, die bei den Treibern auftreten können. Ein indirekter Funktionsaufruf über einen inkompatiblen Funktionszeiger löst CFI aus. Wenn ein CFI-Fehler erkannt wird, gibt der Kernel eine Warnung aus, die sowohl die aufgerufene Funktion als auch den Stacktrace enthält, der zum Fehler geführt hat. Korrigieren Sie dies, indem Sie sicherstellen, dass Funktionszeiger immer denselben Typ haben wie die aufgerufene Funktion.

Um das Debuggen von CFI-Fehlern zu unterstützen, aktivieren Sie CONFIG_CFI_PERMISSIVE , wodurch eine Warnung ausgegeben wird, anstatt eine Kernel-Panik auszulösen. Der Permissive-Modus darf in der Produktion nicht verwendet werden.

Validierung

Derzeit gibt es keinen CTS-Test speziell für CFI. Stellen Sie stattdessen sicher, dass CTS-Tests mit oder ohne aktiviertem CFI bestanden werden, um sicherzustellen, dass CFI keine Auswirkungen auf das Gerät hat.