Android, kullanıcı alanı bileşenleri için LLVM tabanlı temizleyicilere benzer şekilde Kernel AddressSanitizer'ı (KASan) içerir. KASan, çekirdek ve derleme zamanı değişikliklerinin birleşimiyle ortaya çıkan, daha basit hata keşfi ve temel neden analizi sağlayan bir sistemdir.
KASan, çekirdekte birçok bellek ihlali türünü tespit edebilir. Ayrıca yığın, heap ve genel değişkenlerde sınır dışı okuma ve yazma işlemlerini algılayabilir, serbest bırakıldıktan sonra kullanma ve iki kez serbest bırakma işlemlerini tespit edebilir.
KASan, ASan'a benzer şekilde, derleme zamanında bellek işlevi enstrümantasyonu ve çalışma zamanında bellek erişimlerini izlemek için gölge bellek kombinasyonunu kullanır. KASan'da çekirdek bellek alanının sekizde biri, bellek erişiminin geçerli olup olmadığını belirleyen gölge belleğe ayrılır.
KASan, x86_64 ve arm64 mimarilerinde desteklenir. 4.0 sürümünden beri yukarı akış çekirdeğinin bir parçasıdır ve Android 3.18 tabanlı çekirdeklere geri taşınmıştır.
KASan'a ek olarak kcov da test için yararlı olan bir diğer çekirdek değişikliğidir. kcov, çekirdekte kapsama alanı odaklı bulanıklaştırma testi yapılmasına olanak tanımak için geliştirilmiştir. Bu sistem, kapsamı syscall girişleri açısından ölçer ve syzkaller gibi bulanıklaştırma sistemleriyle kullanışlıdır.
Uygulama
KASan ve kcov'un etkin olduğu bir çekirdek derlemek için çekirdek derleme yapılandırmanıza aşağıdaki derleme işaretlerini ekleyin:
CONFIG_KASAN CONFIG_KASAN_INLINE CONFIG_TEST_KASAN CONFIG_KCOV CONFIG_SLUB CONFIG_SLUB_DEBUG CONFIG_CC_OPTIMIZE_FOR_SIZE
Aşağıdakileri de kaldırın:
CONFIG_SLUB_DEBUG_ON CONFIG_SLUB_DEBUG_PANIC_ON CONFIG_KASAN_OUTLINE CONFIG_KERNEL_LZ4
Ardından çekirdeğinizi her zamanki gibi oluşturup yükleyin. KASan çekirdeği, orijinalinden önemli ölçüde daha büyük. Gerekirse bu durumu göz önünde bulundurmak için tüm önyükleme parametrelerini ve önyükleyici ayarlarını değiştirin.
Çekirdek yanıp söndürüldükten sonra KASan'ın etkinleştirilip çalıştırıldığını görmek için çekirdek başlatma günlüklerini kontrol edin. Çekirdek, KASan için bellek haritası bilgileriyle başlatılır. Örneğin:
... [ 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) ...
Hata şu şekilde görünür:
[ 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 ==================================================================
Ayrıca, çekirdeğinizde modüller etkinse daha fazla test için test_kasan
çekirdek modülünü yükleyebilirsiniz. Modül, sınırların dışında bellek erişimi ve serbest bırakıldıktan sonra kullanma girişiminde bulunur. Hedef cihazda KASan'ı doğru şekilde etkinleştirdiğinizden emin olmak için kullanışlıdır.