Çekirdek Kontrolü Akış Bütünlüğü

Kontrol akış bütünlüğü (CFI), derlenmiş bir ikili programın orijinal kontrol akış grafiğinde değişiklik yapılmasına izin vermeyen ve bu tür saldırıların gerçekleştirilmesini önemli ölçüde zorlaştıran bir güvenlik mekanizmasıdır.

Android 9'da LLVM'nin daha fazla bileşende ve ayrıca çekirdekte CFI uygulamasını etkinleştirdik. Sistem CFI varsayılan olarak açıktır ancak çekirdek CFI'yi etkinleştirmeniz gerekir.

LLVM'nin CFI'si Bağlantı Süresi Optimizasyonu (LTO) ile derlenmeyi gerektirir. LTO, nesne dosyalarının LLVM bit kodu gösterimini bağlantı zamanına kadar korur; bu, derleyicinin hangi optimizasyonların gerçekleştirilebileceği konusunda daha iyi karar vermesine olanak tanır. LTO'nun etkinleştirilmesi, son ikili dosyanın boyutunu azaltır ve performansı artırır, ancak derleme süresini artırır. Android üzerinde yapılan testlerde, LTO ve CFI kombinasyonu, kod boyutu ve performansı açısından ihmal edilebilir düzeyde ek yüke neden olur; birkaç vakada her ikisi de iyileşti.

CFI ve diğer ileri kontrol kontrollerinin nasıl ele alındığı hakkında daha fazla teknik ayrıntı için LLVM tasarım belgelerine bakın.

Uygulama

KCFI yamaları desteklenen tüm Android çekirdek sürümlerinde bulunur. CONFIG_CFI_CLANG seçeneği kCFI'yi etkinleştirir ve GKI'da varsayılan olarak ayarlanır.

Sorun giderme

Etkinleştirdikten sonra sürücülerinde bulunabilecek her türlü uyumsuzluk hatası üzerinde çalışın. Uyumsuz bir işlev işaretçisi aracılığıyla yapılan dolaylı bir işlev çağrısı, CFI'yi tetikler. Bir CFI hatası tespit edildiğinde çekirdek, hem çağrılan işlevi hem de hataya yol açan yığın izlemeyi içeren bir uyarı yazdırır. İşlev işaretçilerinin her zaman çağrılan işlevle aynı türde olmasını sağlayarak bunu düzeltin.

CFI hatalarında hata ayıklamaya yardımcı olmak için, çekirdek paniğine neden olmak yerine bir uyarı yazdıran CONFIG_CFI_PERMISSIVE öğesini etkinleştirin. İzin verilen mod üretimde kullanılmamalıdır.

Doğrulama

Şu anda CFI'ye özel bir CTS testi bulunmamaktadır. Bunun yerine, CFI'nin cihazı etkilemediğini doğrulamak için CTS testlerinin CFI etkinken veya CFI etkin değilken geçtiğinden emin olun.