Tương tự như các trình dọn dẹp dựa trên LLVM cho các thành phần không gian người dùng, Android bao gồm cả Trình dọn dẹp địa chỉ hạt nhân (KASan). KASan là sự kết hợp của các thay đổi về thời gian biên dịch và nhân hệ điều hành, dẫn đến một hệ thống được đo lường cho phép phát hiện lỗi và phân tích nguyên nhân gốc rễ đơn giản hơn.
KASan có thể phát hiện nhiều loại lỗi vi phạm bộ nhớ trong nhân. Công cụ này cũng có thể phát hiện các hoạt động đọc và ghi ngoài giới hạn trên ngăn xếp, vùng nhớ khối xếp và biến toàn cục, đồng thời có thể phát hiện lỗi sử dụng sau khi giải phóng và giải phóng hai lần.
Tương tự như ASan, KASan sử dụng kết hợp tính năng đo lường hàm bộ nhớ tại thời điểm biên dịch và bộ nhớ bóng để theo dõi các lượt truy cập bộ nhớ trong thời gian chạy. Trong KASan, một phần tám dung lượng bộ nhớ nhân được dành riêng cho bộ nhớ sao lưu, giúp xác định xem một quyền truy cập bộ nhớ có hợp lệ hay không.
KASan được hỗ trợ trên kiến trúc x86_64 và arm64. Tính năng này đã có trong nhân cấp trên kể từ phiên bản 4.0 và đã được điều chỉnh cho phiên bản cũ cho các nhân dựa trên Android 3.18.
Ngoài KASan, kcov là một nội dung sửa đổi khác của nhân hệ điều hành rất hữu ích cho việc kiểm thử. kcov được phát triển để cho phép kiểm thử tìm lỗi ngẫu nhiên theo hướng dẫn về mức độ sử dụng trong nhân hệ điều hành. Chỉ số này đo lường mức độ sử dụng theo đầu vào syscall và hữu ích với các hệ thống tạo dữ liệu ngẫu nhiên, chẳng hạn như syzkaller.
Triển khai
Để biên dịch một hạt nhân đã bật KASan và kcov, hãy thêm các cờ bản dựng sau vào cấu hình bản dựng hạt nhân:
CONFIG_KASAN CONFIG_KASAN_INLINE CONFIG_TEST_KASAN CONFIG_KCOV CONFIG_SLUB CONFIG_SLUB_DEBUG CONFIG_CC_OPTIMIZE_FOR_SIZE
Đồng thời xoá những nội dung sau:
CONFIG_SLUB_DEBUG_ON CONFIG_SLUB_DEBUG_PANIC_ON CONFIG_KASAN_OUTLINE CONFIG_KERNEL_LZ4
Sau đó, hãy tạo bản dựng và cài đặt ROM cho hạt nhân như bình thường. Hạt nhân KASan lớn hơn đáng kể so với hạt nhân ban đầu. Nếu cần, hãy sửa đổi mọi thông số khởi động và chế độ cài đặt trình tải khởi động để xem xét điều này.
Sau khi cài đặt ROM cho hạt nhân, hãy kiểm tra nhật ký khởi động hạt nhân để xem KASan có được bật và chạy hay không. Hạt nhân sẽ khởi động với thông tin bản đồ bộ nhớ cho KASan, chẳng hạn như:
... [ 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) ...
Và đây là hình ảnh của một lỗi:
[ 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 ==================================================================
Ngoài ra, nếu các mô-đun được bật trong hạt nhân, bạn có thể tải mô-đun hạt nhân test_kasan để kiểm thử thêm. Mô-đun này thử truy cập bộ nhớ ngoài giới hạn và sử dụng sau khi giải phóng, đồng thời hữu ích để đảm bảo bạn đã bật KASan chính xác trên thiết bị mục tiêu.