核心強化

Android 8.0 新增了核心強化功能,以協助減少核心 找出核心驅動程式並找出錯誤功能屬於核心/常見項目, 例如 android-3.18、android-4.4 和 android-4.9

實作

為了取得這些功能,裝置製造商與 SOC 應合併所有 將修補程式從 kernel/common 套用至核心樹狀結構 啟用下列核心設定選項:

  • 強化的使用者副本:CONFIG_HARDENED_USERCOPY=y
  • PAN 模擬 - arm64:CONFIG_ARM64_SW_TTBR0_PAN=y
  • PAN 模擬 - 實驗組:CONFIG_CPU_SW_DOMAIN_PAN=y
  • KASLR - 4.4 以上版本核心: CONFIG_RANDOMIZE_BASE=y

KASLR 也需要系統啟動載入程式支援,才能透過 傳遞硬體熵 裝置樹狀結構節點 /chosen/kaslr-seedEFI_RNG_PROTOCOL

同時確保已啟用現有的強化功能:

  • 緩解堆疊緩衝區溢位現象: CONFIG_CC_STACKPROTECTOR_STRONG=y
  • 內部記憶體防護:CONFIG_DEBUG_RODATA=yCONFIG_STRICT_KERNEL_RWX=y
  • 限制透過核心 x86 存取使用者空間 (預設已啟用): CONFIG_X86_SMAP=y

測試

如要測試實作結果,請在核心中加入 CONFIG_LKDTM=y 設定,並確認以下每個指令都會導向一個核心 恐慌:

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

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

常見問題

這些變更可能會導致核心驅動程式發生錯誤, 由裝置製造商或核心驅動程式擁有者修正。

  • 複製資料時,強化的使用者副本會顯示不正確的邊界檢查 使用者空間這些錯誤應與任何其他記憶體損毀錯誤相同。
  • 設定 PAN 模擬後,核心即可直接存取使用者空間, 。嘗試存取使用者空間記憶體的驅動程式必須變更為 使用標準 copy_to_user()/copy_from_user() 函式。