কার্নেল অ্যাড্রেস স্যানিটাইজার (KASan)

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

KASAN কার্নেলের অনেক ধরনের মেমরি লঙ্ঘন সনাক্ত করতে পারে। এটি স্ট্যাক, হিপ এবং গ্লোবাল ভেরিয়েবলগুলিতে আউট-অফ-বাউন্ড রিড এবং রাইটিং সনাক্ত করতে পারে এবং ব্যবহার-পর-মুক্ত এবং ডবল ফ্রিগুলি সনাক্ত করতে পারে।

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

KASAN x86_64 এবং arm64 আর্কিটেকচারে সমর্থিত। এটি 4.0 থেকে আপস্ট্রিম কার্নেলের অংশ, এবং Android 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 সক্ষম করেছেন তা নিশ্চিত করার জন্য দরকারী।