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=y
或CONFIG_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()
函數。