Укрепление ядра

В Android 8.0 добавлены функции усиления защиты ядра, помогающие устранять уязвимости ядра и находить ошибки в драйверах ядра. Функции находятся в kernel/common в ветках 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() .