Kontrol akışı bütünlüğü (CFI), derlenmiş bir ikili dosyanın orijinal kontrol akışı grafiğinde değişiklik yapılmasına izin vermeyen bir güvenlik mekanizmasıdır. Bu sayede, bu tür saldırıların yapılması önemli ölçüde zorlaştırılır.
Android 9'da LLVM'in CFI'yi daha fazla bileşende ve çekirdekte uygulamasını etkinleştirdik. Sistem CFI varsayılan olarak açıktır ancak çekirdek CFI'yi etkinleştirmeniz gerekir.
LLVM'nin CFI özelliği, Bağlantı Sırasında Optimizasyon (LTO) ile derlemeyi gerektirir. LTO, bağlayıcı zamanına kadar nesne dosyalarının LLVM bit kodu temsilini korur. Bu sayede derleyici, hangi optimizasyonların yapılabileceği hakkında daha iyi bir fikir edinebilir. LTO'yu etkinleştirmek nihai ikili dosyanın boyutunu azaltır ve performansı iyileştirir ancak derleme süresini artırır. Android'de yapılan testlerde, LTO ve CFI'nin birlikte kullanılması, kod boyutu ve performansında önemsiz bir ek yüke neden olur. Bazı durumlarda her ikisi de iyileşir.
CFI ve diğer ileri kontrol denetimlerinin nasıl ele alındığıyla ilgili daha fazla teknik bilgi için LLVM tasarım dokümanlarına 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'de varsayılan olarak ayarlanır.
Sorun giderme
Etkinleştirdikten sonra, sürücüleriyle ilgili olabilecek tür uyuşmazlığı hatalarını giderin. Uyumsuz bir işlev işaretçisi aracılığıyla yapılan dolaylı işlev çağrısı, CFI'yi tetikler. Bir CFI hatası algılandığında ç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 olduğundan emin olarak bu hatayı düzeltin.
CFI hatalarını ayıklamaya yardımcı olmak için CONFIG_CFI_PERMISSIVE
seçeneğini etkinleştirin. Bu seçenek, çekirdek paniğine neden olmak yerine bir uyarı yazdırır. İzin verici mod, üretimde kullanılmamalıdır.
Doğrulama
Şu anda CFI için özel bir CTS testi yoktur. Bunun yerine, CFI'nin cihazı etkilemediğini doğrulamak için CTS testlerinin CFI etkinken ve devre dışıyken geçtiğinden emin olun.