В 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
Для андроид-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()
.