معقم عنوان النواة (KASan)

على غرار المطهرات المستندة إلى 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 بشكل صحيح على الجهاز المستهدف.