Control Flow Integrity (CFI) ist ein Sicherheitsmechanismus, der Änderungen am ursprünglichen Kontrollflussdiagramm einer kompilierten Binärdatei verhindert und dadurch solche Angriffe deutlich erschwert.
Ab Android 9 können Sie CFI im Kernel aktivieren.
Im Linux-Kernel gab es zwei verschiedene Implementierungen von CFI:
- Für Linux 6.0 und niedriger: Clang CFI, das auf Clang LTO basiert
- Für Linux 6.1 und höher: Clang KCFI
Für Clang CFI ist die Kompilierung mit Link Time Optimization (LTO) erforderlich. LTO behält die LLVM-Bitcode-Darstellung von Objektdateien bis zur Linkzeit bei, sodass der Compiler besser nachvollziehen kann, welche Optimierungen ausgeführt werden können. Bei Tests unter Android führte die Kombination aus LTO und CFI zu einem vernachlässigbaren Mehraufwand in Bezug auf Codegröße und Leistung. Durch die Aktivierung von LTO verlängert sich jedoch die Kernel-Buildzeit erheblich.
Für Clang KCFI ist LTO nicht erforderlich. Daher profitieren neuere Android-Kernel von CFI, ohne dass die Build-Dauer durch LTO verlängert wird.
Implementierung
CFI wird über die Option CONFIG_CFI_CLANG gesteuert, die entweder Clang CFI oder Clang KCFI aktiviert.
Weitere technische Details zu CFI und zur Verarbeitung anderer Vorwärtskontrollprüfungen finden Sie in der LLVM-Designdokumentation. KCFI wird dort als -fsanitize=kcfi bezeichnet.
Fehlerbehebung
Nach der Aktivierung müssen Sie alle Fehler aufgrund von Typkonflikten beheben, 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. Sie können das Problem beheben, indem Sie dafür sorgen, dass Funktionszeiger immer denselben Typ wie die aufgerufene Funktion haben.
Um die Fehlersuche bei CFI-Fehlern zu erleichtern, aktivieren Sie CONFIG_CFI_PERMISSIVE. Dadurch wird eine Warnung ausgegeben, anstatt eine Kernel-Panik auszulösen. Der permissive Modus darf nicht in der Produktion verwendet werden.
Validierung
Derzeit gibt es keine CTS-Tests speziell für CFI. Stattdessen müssen CTS-Tests mit und ohne aktivierter CFI-Funktion bestanden werden, um zu prüfen, ob CFI das Gerät beeinträchtigt.