Kontrol akışı bütünlüğü (CFI), derlenmiş bir ikili programın orijinal kontrol akışı grafiğinde değişiklik yapılmasına izin vermeyen bir güvenlik mekanizmasıdır. Bu mekanizma, bu tür saldırıların gerçekleştirilmesini önemli ölçüde zorlaştırır.
Android 9'dan itibaren çekirdekte CFI'yı etkinleştirebilirsiniz.
Linux çekirdeğinde iki farklı CFI uygulaması vardır:
- Linux 6.0 ve önceki sürümler için Clang LTO'ya dayanan Clang CFI
- Linux 6.1 ve sonraki sürümler için Clang KCFI
Clang CFI, bağlantı zamanı optimizasyonu (LTO) ile derleme gerektirir. LTO, nesne dosyalarının LLVM bit kodu gösterimini bağlantı zamanına kadar korur. Bu sayede derleyici, hangi optimizasyonların yapılabileceği konusunda daha iyi bir değerlendirme yapabilir. Android'de yapılan testlerde LTO ve CFI kombinasyonu, kod boyutu ve performans üzerinde ihmal edilebilir düzeyde ek yük oluşturdu. Ancak LTO'nun etkinleştirilmesi çekirdek derleme süresini önemli ölçüde artırır.
Clang KCFI, LTO gerektirmediğinden daha yeni Android çekirdekleri, LTO'nun derleme süresi ek yükü olmadan CFI'dan yararlanır.
Uygulama
CFI, CONFIG_CFI_CLANG seçeneğiyle kontrol edilir. Bu seçenek, Clang CFI veya Clang KCFI'yi etkinleştirir.
CFI ve diğer ileri kontrol kontrollerinin işlenmesiyle ilgili daha fazla teknik bilgi için LLVM tasarım belgelerine bakın. KCFI, burada -fsanitize=kcfi olarak adlandırılır.
Sorun giderme
Etkinleştirdikten sonra sürücülerle ilgili olabilecek tüm tür uyuşmazlığı hatalarını düzeltin. Uyumsuz bir işlev işaretçisi üzerinden yapılan dolaylı işlev çağrısı, CFI'yı tetikler. Bir CFI hatası algılandığında çekirdek, hem çağrılan işlevi hem de hataya yol açan yığın izini 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 bu durumu düzeltin.
CFI hatalarının ayıklanmasına yardımcı olmak için CONFIG_CFI_PERMISSIVE seçeneğini etkinleştirin. Bu seçenek, çekirdek panik oluşturmak yerine uyarı yazdırır. İzin verici mod, üretimde kullanılmamalıdır.
Doğrulama
Şu anda CFI için özel olarak tasarlanmış bir CTS testi bulunmamaktadır. Bunun yerine, CFI'nın cihazı etkilemediğini doğrulamak için CTS testlerinin CFI etkin ve devre dışıyken geçtiğinden emin olun.