內核強化

Android 8.0 添加了內核強化功能,以幫助緩解內核漏洞並發現內核驅動程序中的錯誤。這些功能位於 android-3.18、android-4.4 和 android-4.9 分支中的kernel/common中。

執行

為了獲得這些功能,設備製造商和 SOC 應該將所有從kernel/common中的加固補丁合併到他們的內核樹中,並啟用以下內核配置選項:

  • 強化用戶副本: CONFIG_HARDENED_USERCOPY=y
  • PAN 仿真 - arm64:CONFIG_ARM64_SW_TTBR0_PAN CONFIG_ARM64_SW_TTBR0_PAN=y
  • PAN 仿真 - arm: CONFIG_CPU_SW_DOMAIN_PAN=y
  • KASLR - 4.4 和更高版本的內核: CONFIG_RANDOMIZE_BASE=y

KASLR 還需要引導加載程序支持通過設備樹節點/chosen/kaslr-seed或通過實現EFI_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

常見問題

這些更改可能會暴露內核驅動程序中的錯誤,這些錯誤需要由設備製造商或內核驅動程序的所有者來修復。

  • 在將數據複製到用戶空間/從用戶空間複製數據時,強化的 usercopy 會暴露不正確的邊界檢查。這些應該像任何其他內存損壞錯誤一樣修復。
  • PAN 仿真公開了來自內核的直接用戶空間訪問,這是不允許的。嘗試訪問用戶空間內存的驅動程序需要更改為使用標準的copy_to_user() / copy_from_user()函數。