Kullanıcı alanı bileşenleri için LLVM tabanlı temizleyicilere benzer şekilde, Android şunları içerir: Kernel Address Sanitizer (KASan). KASan, çekirdek ve değerler arasındaki araçlı bir sistemle sonuçlanan zaman değişikliklerini derlemek daha basit hata keşfi ve temel neden analizi sağlar.
KASan, çekirdekte birçok bellek ihlali türünü algılayabilir. Ayrıca yığın, yığın ve genel değişkenlerdeki sınır dışı okumaları ve yazmaları algılar ve şarj sonrası kullanımı ve çift serbest kullanımı algılayabilir.
ASan'da olduğu gibi, KASan da çalışma zamanında bellek erişimlerini izlemek için zaman ve gölge belleği derleme KASan'da çekirdek bellek alanının sekizde biri gölge belleğine ayrılmıştır. bellek erişiminin geçerli olup olmadığını belirler.
KASan, x86_64 ve arm64 mimarilerinde desteklenir. Birleşik Krallık'taki 4.0'dan itibaren yukarı akış çekirdeğine ulaştık ve Android 3.18 tabanlı çekirdekleri hakkında daha fazla bilgi edinin.
KASan'ın yanı sıra kcov da teşvik etmek anlamına gelir. kcov, 2017'de yürütülen araştırmada kapsam odaklı fuzz testlerine olanak kernel'e gidin. Sistem çağrısı girişleri açısından kapsamı ölçer ve syzkaller gibi fuzzing sistemleri.
Uygulama
KASan ve kcov'un etkinleştirildiği bir çekirdek derlemek için aşağıdaki derleme işaretlerini ekleyin ekleyin:
CONFIG_KASAN CONFIG_KASAN_INLINE CONFIG_TEST_KASAN CONFIG_KCOV CONFIG_SLUB CONFIG_SLUB_DEBUG CONFIG_CC_OPTIMIZE_FOR_SIZE
Aşağıdakileri kaldırarak:
CONFIG_SLUB_DEBUG_ON CONFIG_SLUB_DEBUG_PANIC_ON CONFIG_KASAN_OUTLINE CONFIG_KERNEL_LZ4
Ardından, çekirdeğinizi her zamanki gibi derleyin ve güncelleyin. KASan çekirdeği, yerel olarak daha büyüktür. Gerekirse başlatma parametrelerini değiştirin ve bootloader ayarlarını inceleyin.
Çekirdek güncelleme sürecini tamamladıktan sonra KASan'ın etkin olup olmadığını görmek için çekirdek başlatma günlüklerini kontrol edin. inceleyeceğiz. Çekirdek, KASan'a ait bellek haritası bilgileriyle çalışmaya başlayacak. Ö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 şöyle 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 etkinleştirilmişse test_kasan kernel modülünü kullanabilirsiniz. Modül, sınır dışında belleği deniyor sorunsuz şekilde çalışır ve KASan'ı doğru şekilde etkinleştirdiğinizden emin olmak açısından faydalıdır. optimize edebilirsiniz.