Kernel Address Sanitizer

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 Kernel Address Sanitizer (KASan). KASan là sự kết hợp giữa kernel và các sửa đổi thời gian biên dịch dẫn đến một hệ thống đo lường cho phép phát hiện lỗi và phân tích căn nguyên gốc đơ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 hệ điều hành. Chiến dịch này cũng có thể phát hiện lượt đọc và ghi ngoài giới hạn trên các biến ngăn xếp, bộ nhớ khối xếp và biến toàn cục, và có thể phát hiện lệnh use-after-free và chế độ giải phóng gấp đôi.

Tương tự như ASan, KASan sử dụng kết hợp công cụ đo lường chức năng bộ nhớ ở thời gian biên dịch và bộ nhớ đổ bóng để theo dõi hoạt động truy cập bộ nhớ trong thời gian chạy. Trong KASan, một phần tám của không gian bộ nhớ nhân được dành riêng cho bộ nhớ bóng, xác định liệu quyền truy cập bộ nhớ có hợp lệ hay không.

KASan được hỗ trợ trên các kiến trúc x86_64 và arm64. Đây là một phần của kể từ phiên bản 4.0 và đã được điều chỉnh cho phiên bản cũ cho Android 3.18 nhân hệ điều hành.

Ngoài KASan, kcov là một sửa đổi nhân hệ điều hành khác hữu ích cho kiểm thử. kcov được phát triển để cho phép kiểm thử mờ theo phạm vi bao phủ trong nhân hệ điều hành. Giải pháp này đo lường mức độ phù hợp theo dữ liệu đầu vào của lệnh gọi hệ thống và hữu ích với hệ thống kiểm thử mờ, chẳng hạn như syzkaller.

Triển khai

Để biên dịch một nhân khi bật KASan và kcov, hãy thêm các cờ bản dựng sau đây cho cấu hình bản dựng nhân của bạn:

CONFIG_KASAN
CONFIG_KASAN_INLINE
CONFIG_TEST_KASAN
CONFIG_KCOV
CONFIG_SLUB
CONFIG_SLUB_DEBUG
CONFIG_CC_OPTIMIZE_FOR_SIZE

Và xoá những nội dung sau:

CONFIG_SLUB_DEBUG_ON
CONFIG_SLUB_DEBUG_PANIC_ON
CONFIG_KASAN_OUTLINE
CONFIG_KERNEL_LZ4

Sau đó, tạo và cài đặt ROM nhân của bạn như bình thường. Hạt nhân KASan được sử dụng đáng kể lớn hơn hình ảnh gốc. Nếu cần, hãy sửa đổi mọi tham số khởi động và cài đặt trình tải khởi động để xem xét vấn đề này.

Sau khi cài đặt ROM nhân hệ điều hành, hãy kiểm tra nhật ký khởi động nhân hệ điều hành để xem KASan có được bật không và đang chạy. Nhân hệ điều hành 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à giao diện của 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 đã bật các mô-đun trong nhân, bạn có thể tải test_kasan nhân để thử nghiệm thêm. Mô-đun cố gắng bộ nhớ vượt quá giới hạn truy cập và use-after-free, đồng thời rất hữu ích để đảm bảo bạn đã bật KASan đúng cách trên thiết bị mục tiêu.