Làm cứng hạt nhân

Android 8.0 bổ sung các tính năng làm cứng nhân hệ điều hành để giúp giảm thiểu nhân hệ điều hành lỗ hổng bảo mật và tìm lỗi trong trình điều khiển nhân. Các tính năng này nằm trong hạt nhân/phổ biến trong các nhánh android-3.18, android-4.4 và android-4.9.

Triển khai

Để có được những tính năng này, nhà sản xuất thiết bị và SOC phải hợp nhất tất cả đang tăng cường các bản vá từ kernel/common vào cây nhân và bật các tuỳ chọn cấu hình nhân sau đây:

  • Bản sao người dùng được cố định giá trị: CONFIG_HARDENED_USERCOPY=y
  • Mô phỏng PAN – arm64: CONFIG_ARM64_SW_TTBR0_PAN=y
  • Mô phỏng PAN – nhóm thử nghiệm: CONFIG_CPU_SW_DOMAIN_PAN=y
  • KASLR – hạt nhân 4.4 trở lên: CONFIG_RANDOMIZE_BASE=y

KASLR cũng yêu cầu hỗ trợ trình tải khởi động để truyền entropy phần cứng qua nút cây thiết bị /chosen/kaslr-seed hoặc bằng cách triển khai EFI_RNG_PROTOCOL

Ngoài ra, hãy đảm bảo bạn đã bật các tính năng làm cứng hiện có:

  • Giảm thiểu tình trạng tràn vùng đệm ngăn xếp: CONFIG_CC_STACKPROTECTOR_STRONG=y
  • Bảo vệ bộ nhớ trong: CONFIG_DEBUG_RODATA=y hoặc CONFIG_STRICT_KERNEL_RWX=y
  • Hạn chế quyền truy cập vào không gian của người dùng từ kernel – x86 (được bật theo mặc định): CONFIG_X86_SMAP=y

Thử nghiệm

Để kiểm thử kết quả triển khai, hãy thêm CONFIG_LKDTM=y vào nhân và xác nhận rằng mỗi lệnh sau đây dẫn đến một nhân hoảng loạn:

echo ACCESS_USERSPACE > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_USERSPACE > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_RO > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_RO_AFTER_INIT > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_KERN > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_STACK > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_RODATA > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_KMALLOC > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_VMALLOC > /sys/kernel/debug/provoke-crash/DIRECT
echo CORRUPT_STACK > /sys/kernel/debug/provoke-crash/DIRECT

Đối với Android-4.9:

echo USERCOPY_HEAP_SIZE_TO > /sys/kernel/debug/provoke-crash/DIRECT
echo USERCOPY_HEAP_SIZE_FROM > /sys/kernel/debug/provoke-crash/DIRECT

Các vấn đề thường gặp

Những thay đổi này có thể làm lộ lỗi trong trình điều khiển nhân, vì vậy, đã được khắc phục bởi nhà sản xuất thiết bị hoặc chủ sở hữu của trình điều khiển nhân.

  • Bản sao người dùng được cứng cho thấy việc kiểm tra giới hạn không chính xác khi sao chép dữ liệu đến/từ không gian của người dùng. Bạn cần khắc phục những lỗi này giống như mọi lỗi hỏng bộ nhớ khác.
  • Quá trình mô phỏng PAN cho thấy quyền truy cập trực tiếp vào không gian của người dùng từ nhân hệ điều hành này, được phép. Cần thay đổi các trình điều khiển cố gắng truy cập bộ nhớ của dung lượng người dùng thành sử dụng copy_to_user()/copy_from_user() tiêu chuẩn thay thế.