কার্নেল ঠিকানা স্যানিটাইজার

ইউজারস্পেস কম্পোনেন্টগুলোর জন্য LLVM-ভিত্তিক স্যানিটাইজারগুলোর মতোই, অ্যান্ড্রয়েডে কার্নেল অ্যাড্রেস স্যানিটাইজার (KASan) অন্তর্ভুক্ত রয়েছে। KASan হলো কার্নেল এবং কম্পাইল-টাইম পরিবর্তনের একটি সমন্বয়, যার ফলে একটি ইনস্ট্রুমেন্টেড সিস্টেম তৈরি হয় যা বাগ শনাক্তকরণ এবং মূল কারণ বিশ্লেষণকে সহজতর করে তোলে।

KASan কার্নেলে অনেক ধরনের মেমোরি ভায়োলেশন শনাক্ত করতে পারে। এটি স্ট্যাক, হিপ এবং গ্লোবাল ভেরিয়েবলে সীমার বাইরের রিড ও রাইট, এবং ইউজ-আফটার-ফ্রি ও ডাবল ফ্রি-ও শনাক্ত করতে পারে।

ASan-এর মতোই, KASan রানটাইমে মেমরি অ্যাক্সেস ট্র্যাক করার জন্য কম্পাইল-টাইমে মেমরি-ফাংশন ইন্সট্রুমেন্টেশন এবং শ্যাডো মেমরির একটি সংমিশ্রণ ব্যবহার করে। KASan-এ, কার্নেল মেমরি স্পেসের এক-অষ্টমাংশ শ্যাডো মেমরির জন্য বরাদ্দ থাকে, যা নির্ধারণ করে কোনো মেমরি অ্যাক্সেস বৈধ কি না।

KASan x86_64 এবং arm64 আর্কিটেকচারে সমর্থিত। এটি 4.0 সংস্করণ থেকে আপস্ট্রিম কার্নেলের একটি অংশ এবং অ্যান্ড্রয়েড 3.18-ভিত্তিক কার্নেলগুলিতে ব্যাকপোর্ট করা হয়েছে।

KASan ছাড়াও, kcov হলো আরেকটি কার্নেল মডিফিকেশন যা টেস্টিংয়ের জন্য উপযোগী। কার্নেলে কভারেজ-গাইডেড ফাজ টেস্টিংয়ের সুযোগ দেওয়ার জন্য kcov তৈরি করা হয়েছিল। এটি সিস্টেম কল ইনপুটের নিরিখে কভারেজ পরিমাপ করে এবং 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 সঠিকভাবে সক্রিয় করেছেন কিনা তা নিশ্চিত করতে এটি সহায়ক।