على غرار المطهرات المستندة إلى LLVM لمكونات مساحة المستخدم، يشتمل Android على Kernel Address Sanitizer (KASAN). KASAN عبارة عن مزيج من تعديلات kernel ووقت الترجمة التي تؤدي إلى نظام مُجهز يسمح باكتشاف الأخطاء بشكل أبسط وتحليل السبب الجذري.
يمكن لـ KASAN اكتشاف العديد من أنواع انتهاكات الذاكرة في النواة. يمكنه أيضًا اكتشاف عمليات القراءة والكتابة خارج النطاق على المتغيرات المكدسة والكومة والمتغيرات العامة، ويمكنه اكتشاف الاستخدام بعد الاستخدام المجاني والتحرير المزدوج.
على غرار ASAN، يستخدم KASAN مجموعة من أدوات وظائف الذاكرة في وقت الترجمة وذاكرة الظل لتتبع عمليات الوصول إلى الذاكرة في وقت التشغيل. في KASAN، يتم تخصيص ثُمن مساحة ذاكرة kernel لذاكرة الظل، والتي تحدد ما إذا كان الوصول إلى الذاكرة صالحًا أم لا.
يتم دعم KASAN على معماريات x86_64 وarm64. لقد كان جزءًا من النواة الأولية منذ الإصدار 4.0، وتم نقله إلى النواة المستندة إلى Android 3.18.
بالإضافة إلى KASAN، يعد kcov تعديلًا آخر للنواة مفيدًا للاختبار. تم تطوير kcov للسماح باختبار الزغب الموجه بالتغطية في النواة. إنه يقيس التغطية من حيث مدخلات syscall وهو مفيد مع أنظمة التشويش، مثل syzkaller .
تطبيق
لتجميع نواة مع تمكين KASAN وkcov، قم بإضافة علامات البناء التالية إلى تكوين بناء kernel الخاص بك:
CONFIG_KASAN CONFIG_KASAN_INLINE CONFIG_TEST_KASAN CONFIG_KCOV CONFIG_SLUB CONFIG_SLUB_DEBUG CONFIG_CC_OPTIMIZE_FOR_SIZE
و إزالة ما يلي:
CONFIG_SLUB_DEBUG_ON CONFIG_SLUB_DEBUG_PANIC_ON CONFIG_KASAN_OUTLINE CONFIG_KERNEL_LZ4
ثم قم ببناء وفلاش النواة الخاصة بك كالمعتاد. نواة KASAN أكبر بكثير من النواة الأصلية. إذا لزم الأمر، قم بتعديل أي معلمات تمهيد وإعدادات أداة تحميل التشغيل لتأخذ ذلك في الاعتبار.
بعد وميض النواة، تحقق من سجلات تمهيد النواة لمعرفة ما إذا كان KASAN ممكّنًا قيد التشغيل. سيبدأ النواة بمعلومات خريطة الذاكرة لـ KASAN، مثل:
... [ 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) ...
وهذه هي الطريقة التي سيبدو بها الخلل:
[ 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 ==================================================================
بالإضافة إلى ذلك، إذا تم تمكين الوحدات في النواة الخاصة بك، فيمكنك تحميل وحدة النواة test_kasan لإجراء المزيد من الاختبارات. تحاول الوحدة الوصول إلى الذاكرة خارج الحدود واستخدامها بعد ذلك مجانًا، وهي مفيدة لضمان تمكين KASan بشكل صحيح على الجهاز المستهدف.