Integritas Aliran Kontrol Kernel

Integritas aliran kontrol (CFI) adalah mekanisme keamanan yang melarang perubahan pada grafik aliran kontrol asli dari biner yang dikompilasi, sehingga secara signifikan lebih sulit untuk melakukan serangan tersebut.

Di Android 9, kami mengaktifkan implementasi CFI LLVM di lebih banyak komponen dan juga di kernel. Sistem CFI aktif secara default, tetapi Anda harus mengaktifkan kernel CFI.

CFI 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, tetapi meningkatkan waktu kompilasi. Dalam pengujian di Android, kombinasi LTO dan CFI menghasilkan overhead yang dapat diabaikan untuk ukuran dan kinerja kode; dalam beberapa kasus keduanya membaik.

Untuk detail teknis selengkapnya tentang CFI dan bagaimana pemeriksaan kontrol maju lainnya ditangani, 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 diaktifkan, atasi semua jenis kesalahan ketidakcocokan yang mungkin ada dengan drivernya. Panggilan fungsi tidak langsung melalui penunjuk fungsi yang tidak kompatibel membuat perjalanan CFI. Ketika kegagalan CFI terdeteksi, kernel mencetak peringatan yang menyertakan fungsi yang dipanggil dan stacktrace yang menyebabkan kegagalan. Perbaiki ini dengan memastikan pointer fungsi selalu memiliki tipe yang sama dengan fungsi yang dipanggil.

Untuk membantu dalam men-debug kegagalan CFI, aktifkan CONFIG_CFI_PERMISSIVE , yang mencetak peringatan alih-alih menyebabkan kepanikan kernel. Mode permisif tidak boleh digunakan dalam produksi.

Validasi

Saat ini, tidak ada tes CTS khusus untuk CFI. Sebagai gantinya, pastikan bahwa tes CTS lulus dengan atau tanpa mengaktifkan CFI untuk memverifikasi bahwa CFI tidak memengaruhi perangkat.