Kernel AddressSanitizer

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.