Integrität des Kernel-Control-Ablaufs

Die Integrität der Ablaufsteuerung (Control Flow Integrity, CFI) ist ein Sicherheitsmechanismus, der Änderungen am ursprünglichen Kontrollflussgraphen einer kompilierten Binärdatei verhindert. Dadurch wird die Durchführung solcher Angriffe erheblich erschwert.

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

Für die CFI von LLVM ist eine Kompilierung mit Link-Time Optimization (LTO) erforderlich. Bei LTO wird die LLVM-Bitcode-Darstellung von Objektdateien bis zur Linkzeit beibehalten. So kann der Compiler besser beurteilen, welche Optimierungen durchgeführt werden können. Wenn Sie LTO aktivieren, wird die Größe der finalen Binärdatei reduziert und die Leistung verbessert, aber die Kompilierungszeit erhöht. Bei Tests unter Android führt die Kombination aus LTO und CFI zu einem vernachlässigbaren Overhead bei Codegröße und Leistung. In einigen Fällen wurden beide verbessert.

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

Implementierung

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

Fehlerbehebung

Nachdem Sie die Funktion aktiviert haben, beheben Sie alle Fehler aufgrund von Abweichungen zwischen Typ und Treiber. 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. Achten Sie darauf, dass Funktionszeiiger immer denselben Typ haben wie die aufgerufene Funktion.

Aktivieren Sie CONFIG_CFI_PERMISSIVE, um CFI-Fehler leichter beheben zu können. Dadurch wird eine Warnung ausgegeben, anstatt dass eine Kernel-Panik ausgelöst wird. Der permissive Modus darf nicht in der Produktion verwendet werden.

Zertifizierungsstufe

Derzeit gibt es keine CTS-Tests speziell für CFI. Achten Sie stattdessen darauf, dass die CTS-Tests mit und ohne aktivierter CFI bestehen, um sicherzustellen, dass CFI keine Auswirkungen auf das Gerät hat.