कर्नेल एड्रेस सैनिटाइज़र (KASan)

यूजरस्पेस घटकों के लिए एलएलवीएम-आधारित सैनिटाइज़र के समान, एंड्रॉइड में कर्नेल एड्रेस सैनिटाइज़र (KASAN) शामिल है। KASAN कर्नेल और संकलन समय संशोधनों का एक संयोजन है जिसके परिणामस्वरूप एक उपकरण प्रणाली बनती है जो सरल बग खोज और मूल कारण विश्लेषण की अनुमति देती है।

KASAN कर्नेल में कई प्रकार के मेमोरी उल्लंघनों का पता लगा सकता है। यह स्टैक, हीप और ग्लोबल वेरिएबल्स पर आउट-ऑफ-बाउंड रीड्स और राइट्स का भी पता लगा सकता है, और उपयोग-आफ्टर-फ्री और डबल फ्रीज़ का पता लगा सकता है।

ASAN के समान, KASAN संकलन समय पर मेमोरी-फ़ंक्शन इंस्ट्रूमेंटेशन और रनटाइम पर मेमोरी एक्सेस को ट्रैक करने के लिए छाया मेमोरी के संयोजन का उपयोग करता है। KASAN में, कर्नेल मेमोरी स्पेस का आठवां हिस्सा छाया मेमोरी के लिए समर्पित है, जो यह निर्धारित करता है कि मेमोरी एक्सेस वैध है या नहीं।

KASAN x86_64 और Arm64 आर्किटेक्चर पर समर्थित है। यह 4.0 से अपस्ट्रीम कर्नेल का हिस्सा रहा है, और इसे एंड्रॉइड 3.18-आधारित कर्नेल पर बैकपोर्ट किया गया है।

KASAN के अलावा, kcov एक और कर्नेल संशोधन है जो परीक्षण के लिए उपयोगी है। kcov को कर्नेल में कवरेज-निर्देशित फ़ज़ परीक्षण की अनुमति देने के लिए विकसित किया गया था। यह syscall इनपुट के संदर्भ में कवरेज को मापता है और 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 को सही ढंग से सक्षम किया है।