Integritas alur kontrol di kernel

Integritas alur kontrol (CFI) adalah mekanisme keamanan yang melarang perubahan pada grafik alur kontrol asli dari biner yang dikompilasi, sehingga serangan semacam itu menjadi jauh lebih sulit dilakukan.

Mulai Android 9, Anda dapat mengaktifkan CFI di kernel.

Kernel Linux memiliki dua penerapan CFI yang berbeda:

  • untuk Linux 6.0 dan yang lebih rendah, Clang CFI, yang mengandalkan Clang LTO
  • untuk Linux 6.1 dan yang lebih tinggi, Clang KCFI

Clang CFI mengharuskan kompilasi dengan Link Time Optimization (LTO). LTO mempertahankan representasi bitcode LLVM dari file objek hingga waktu link, yang memungkinkan compiler lebih memahami pengoptimalan yang dapat dilakukan. Dalam pengujian di Android, kombinasi LTO dan CFI menghasilkan overhead yang dapat diabaikan untuk ukuran dan performa kode. Namun, mengaktifkan LTO akan meningkatkan waktu build kernel secara signifikan.

Clang KCFI tidak memerlukan LTO, sehingga kernel Android yang lebih baru mendapatkan manfaat CFI tanpa overhead waktu build LTO.

Penerapan

CFI dikontrol oleh opsi CONFIG_CFI_CLANG, yang mengaktifkan Clang CFI atau Clang KCFI.

Untuk detail teknis selengkapnya tentang CFI dan cara penanganan pemeriksaan kontrol penerusan lainnya, lihat dokumentasi desain LLVM. KCFI disebut di sana sebagai -fsanitize=kcfi.

Pemecahan masalah

Setelah mengaktifkan, selesaikan error ketidakcocokan jenis yang mungkin ada dengan drivernya. Panggilan fungsi tidak langsung melalui pointer fungsi yang tidak kompatibel akan memicu CFI. Saat kegagalan CFI terdeteksi, kernel akan mencetak peringatan yang mencakup fungsi yang dipanggil dan stacktrace yang menyebabkan kegagalan. Koreksi hal ini dengan memastikan pointer fungsi selalu memiliki jenis yang sama dengan fungsi yang dipanggil.

Untuk membantu proses debug kegagalan CFI, aktifkan CONFIG_CFI_PERMISSIVE, yang akan mencetak peringatan, bukan menyebabkan kernel panic. Mode permisif tidak boleh digunakan dalam produksi.

Validasi

Saat ini, tidak ada pengujian CTS khusus untuk CFI. Sebagai gantinya, pastikan pengujian CTS lulus dengan dan tanpa CFI diaktifkan untuk memverifikasi bahwa CFI tidak memengaruhi perangkat.