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-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
常見問題
這些變更可能會導致核心驅動程式發生錯誤, 由裝置製造商或核心驅動程式擁有者修正。
- 複製資料時,強化的使用者副本會顯示不正確的邊界檢查 使用者空間這些錯誤應與任何其他記憶體損毀錯誤相同。
- 設定 PAN 模擬後,核心即可直接存取使用者空間,
。嘗試存取使用者空間記憶體的驅動程式必須變更為
使用標準
copy_to_user()
/copy_from_user()
函式。