Mirip dengan sanitizer berbasis LLVM untuk komponen ruang pengguna, Android menyertakan Kernel AddressSanitizer (KASan). KASan adalah kombinasi modifikasi kernel dan waktu kompilasi yang menghasilkan sistem yang diinstrumentasi yang memungkinkan penemuan bug dan analisis akar masalah yang lebih sederhana.
KASan dapat mendeteksi banyak jenis pelanggaran memori di kernel. Detektor ini juga dapat mendeteksi pembacaan dan penulisan di luar batas pada stack, heap, dan variabel global, serta dapat mendeteksi penggunaan setelah pembebasan dan pembebasan ganda.
Mirip dengan ASan, KASan menggunakan kombinasi instrumentasi fungsi memori pada waktu kompilasi dan memori bayangan untuk melacak akses memori saat runtime. Di KASan, seperdelapan ruang memori kernel dikhususkan untuk memori bayangan, yang menentukan apakah akses memori valid atau tidak.
KASan didukung pada arsitektur x86_64 dan arm64. Fitur ini telah menjadi bagian dari kernel upstream sejak 4.0, dan telah di-backport ke kernel berbasis Android 3.18.
Selain KASan, kcov adalah modifikasi kernel lain yang berguna untuk pengujian. kcov dikembangkan untuk memungkinkan pengujian fuzz yang dipandu cakupan di kernel. Fitur ini mengukur cakupan dalam hal input syscall dan berguna dengan sistem fuzzing, seperti syzkaller.
Penerapan
Untuk mengompilasi kernel dengan KASan dan kcov diaktifkan, tambahkan flag build berikut ke konfigurasi build kernel Anda:
CONFIG_KASAN CONFIG_KASAN_INLINE CONFIG_TEST_KASAN CONFIG_KCOV CONFIG_SLUB CONFIG_SLUB_DEBUG CONFIG_CC_OPTIMIZE_FOR_SIZE
Serta menghapus hal berikut:
CONFIG_SLUB_DEBUG_ON CONFIG_SLUB_DEBUG_PANIC_ON CONFIG_KASAN_OUTLINE CONFIG_KERNEL_LZ4
Kemudian, buat dan flash kernel seperti biasa. Kernel KASan jauh lebih besar daripada kernel aslinya. Jika perlu, ubah parameter booting dan setelan bootloader untuk mempertimbangkan hal ini.
Setelah mem-flash kernel, periksa log booting kernel untuk melihat apakah KASan diaktifkan dan berjalan. Kernel dimulai dengan informasi peta memori untuk KASan, seperti:
... [ 0.000000] c0 0 Virtual kernel memory layout: [ 0.000000] c0 0 kasan : 0xffffff8000000000 - 0xffffff9000000000 ( 64 GB) [ 0.000000] c0 0 vmalloc : 0xffffff9000010000 - 0xffffffbdbfff0000 ( 182 GB) [ 0.000000] c0 0 vmemmap : 0xffffffbdc0000000 - 0xffffffbfc0000000 ( 8 GB maximum) [ 0.000000] c0 0 0xffffffbdc0000000 - 0xffffffbdc3f95400 ( 63 MB actual) [ 0.000000] c0 0 PCI I/O : 0xffffffbffa000000 - 0xffffffbffb000000 ( 16 MB) [ 0.000000] c0 0 fixed : 0xffffffbffbdfd000 - 0xffffffbffbdff000 ( 8 KB) [ 0.000000] c0 0 modules : 0xffffffbffc000000 - 0xffffffc000000000 ( 64 MB) [ 0.000000] c0 0 memory : 0xffffffc000000000 - 0xffffffc0fe550000 ( 4069 MB) [ 0.000000] c0 0 .init : 0xffffffc001d33000 - 0xffffffc001dce000 ( 620 KB) [ 0.000000] c0 0 .text : 0xffffffc000080000 - 0xffffffc001d32284 ( 29385 KB) ...
Dan inilah tampilan bug:
[ 18.539668] c3 1 ================================================================== [ 18.547662] c3 1 BUG: KASAN: null-ptr-deref on address 0000000000000008 [ 18.554689] c3 1 Read of size 8 by task swapper/0/1 [ 18.559988] c3 1 CPU: 3 PID: 1 Comm: swapper/0 Tainted: G W 3.18.24-xxx #1 [ 18.569275] c3 1 Hardware name: Android Device [ 18.577433] c3 1 Call trace: [ 18.580739] c3 1 [<ffffffc00008b32c>] dump_backtrace+0x0/0x2c4 [ 18.586985] c3 1 [<ffffffc00008b600>] show_stack+0x10/0x1c [ 18.592889] c3 1 [<ffffffc001481194>] dump_stack+0x74/0xc8 [ 18.598792] c3 1 [<ffffffc000202ee0>] kasan_report+0x11c/0x4d0 [ 18.605038] c3 1 [<ffffffc00020286c>] __asan_load8+0x20/0x80 [ 18.611115] c3 1 [<ffffffc000bdefe8>] android_verity_ctr+0x8cc/0x1024 [ 18.617976] c3 1 [<ffffffc000bcaa2c>] dm_table_add_target+0x3dc/0x50c [ 18.624832] c3 1 [<ffffffc001bdbe60>] dm_run_setup+0x50c/0x678 [ 18.631082] c3 1 [<ffffffc001bda8c0>] prepare_namespace+0x44/0x1ac [ 18.637676] c3 1 [<ffffffc001bda170>] kernel_init_freeable+0x328/0x364 [ 18.644625] c3 1 [<ffffffc001478e20>] kernel_init+0x10/0xd8 [ 18.650613] c3 1 ==================================================================
Selain itu, jika modul diaktifkan di kernel, Anda dapat memuat modul kernel test_kasan
untuk pengujian lebih lanjut. Modul ini mencoba akses memori di luar batas dan penggunaan setelah pelepasan, serta berguna untuk memastikan Anda mengaktifkan KASan dengan benar di perangkat target.