חיטוי כתובת ליבה (KASan)

בדומה לחומרי חיטוי המבוססים על LLVM עבור רכיבי מרחב משתמש, אנדרואיד כולל את חיטוי כתובת ליבה (KASAN). KASAN הוא שילוב של שינויים בזמן הקרנל והקומפילציה שמביאים למערכת מאובזרת המאפשרת גילוי באגים פשוטים יותר וניתוח סיבת שורש.

KASAN יכול לזהות סוגים רבים של הפרות זיכרון בקרנל. זה יכול גם לזהות קריאה וכתיבה מחוץ לתחום על ערימה, ערימה ומשתנים גלובליים, ויכול לזהות שימוש-לאחר-חופשי ופינויים כפולים.

בדומה ל-ASAN, KASAN משתמשת בשילוב של מכשור פונקציית זיכרון בזמן הידור וזיכרון צל כדי לעקוב אחר גישה לזיכרון בזמן ריצה. ב-KASAN, שמינית משטח זיכרון הליבה מוקדשת לזיכרון צל, מה שקובע אם גישה לזיכרון חוקית או לא.

KASAN נתמך בארכיטקטורות x86_64 ו-arm64. זה היה חלק מהקרנל במעלה הזרם מאז 4.0, ועבר חזרה לגרעין מבוסס אנדרואיד 3.18.

בנוסף ל-KASAN, kcov הוא שינוי גרעין נוסף שמועיל לבדיקה. kcov פותחה כדי לאפשר בדיקת fuzz מונחית כיסוי בקרנל. הוא מודד את הכיסוי במונחים של כניסות של סיסמאות והוא שימושי עם מערכות מטושטשות, כגון syzkaller .

יישום

כדי להרכיב ליבה עם KASAN ו-kcov מופעלים, הוסף את דגלי הבנייה הבאים לתצורת בניית הליבה שלך:

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 במכשיר היעד.