Integritas aliran kontrol (CFI) adalah mekanisme keamanan yang melarang perubahan pada grafik aliran kontrol asli dari biner yang dikompilasi, sehingga sangat sulit untuk melakukan serangan semacam itu.
Di Android 9, kami mengaktifkan implementasi CFI LLVM di lebih banyak komponen dan juga di kernel. Keuangan Sistem diaktifkan secara default, tetapi Anda harus mengaktifkan Keuangan Kernel.
Keuangan LLVM memerlukan kompilasi dengan Link-Time Optimization (LTO) . LTO mempertahankan representasi bitcode LLVM dari file objek hingga waktu tautan, yang memungkinkan kompiler untuk memberikan alasan yang lebih baik tentang pengoptimalan apa yang dapat dilakukan. Mengaktifkan LTO mengurangi ukuran biner akhir dan meningkatkan kinerja, namun meningkatkan waktu kompilasi. Dalam pengujian di Android, kombinasi LTO dan Keuangan menghasilkan overhead yang dapat diabaikan terhadap ukuran dan kinerja kode; dalam beberapa kasus keduanya membaik.
Untuk detail teknis lebih lanjut tentang Keuangan dan cara penanganan pemeriksaan kontrol maju lainnya, lihat dokumentasi desain LLVM .
Penerapan
Patch kCFI ada di semua versi kernel Android yang didukung. Opsi CONFIG_CFI_CLANG
mengaktifkan kCFI dan disetel secara default di GKI.
Penyelesaian masalah
Setelah mengaktifkan, atasi segala jenis kesalahan ketidakcocokan yang mungkin ada pada drivernya. Panggilan fungsi tidak langsung melalui penunjuk fungsi yang tidak kompatibel akan membuat CFI tersandung. Ketika kegagalan CFI terdeteksi, kernel akan mencetak peringatan yang mencakup fungsi yang dipanggil dan pelacakan tumpukan yang menyebabkan kegagalan. Perbaiki ini dengan memastikan penunjuk fungsi selalu memiliki tipe yang sama dengan fungsi yang dipanggil.
Untuk membantu dalam men-debug kegagalan Keuangan, aktifkan CONFIG_CFI_PERMISSIVE
, yang akan mencetak peringatan alih-alih menyebabkan kepanikan kernel. Mode permisif tidak boleh digunakan dalam produksi.
Validasi
Saat ini belum ada tes CTS khusus untuk Keuangan. Sebaliknya, pastikan pengujian CTS lulus dengan atau tanpa CFI diaktifkan untuk memverifikasi bahwa CFI tidak memengaruhi perangkat.