Endurecimiento del kernel

En Android 8.0, se agregaron funciones de endurecimiento del kernel para ayudar a mitigarlo. y detectar errores en los controladores del kernel. Las funciones están en kernel/common en ramas android-3.18, android-4.4 y android-4.9.

Implementación

Para adquirir estas funciones, los fabricantes de dispositivos y los SOC deben fusionar todas endurecer parches desde kernel/common hasta su árbol de kernel y habilita las siguientes opciones de configuración del kernel:

  • Copia de usuario endurecida: CONFIG_HARDENED_USERCOPY=y
  • Emulación de PAN - arm64: CONFIG_ARM64_SW_TTBR0_PAN=y
  • Emulación de PAN - grupo: CONFIG_CPU_SW_DOMAIN_PAN=y
  • Kernels KASLR 4.4 y posteriores: CONFIG_RANDOMIZE_BASE=y

KASLR también requiere compatibilidad con bootloader para pasar la entropía de hardware por medio de el nodo del árbol de dispositivos /chosen/kaslr-seed o implementando EFI_RNG_PROTOCOL

Además, asegúrate de que las funciones de endurecimiento existentes estén habilitadas:

  • Mitigación de desbordamiento del búfer de pila: CONFIG_CC_STACKPROTECTOR_STRONG=y
  • Protección de memoria interna: CONFIG_DEBUG_RODATA=y o CONFIG_STRICT_KERNEL_RWX=y
  • Restringe el acceso al espacio del usuario desde el kernel x86 (habilitado de forma predeterminada): CONFIG_X86_SMAP=y

Prueba

Para probar tu implementación, agrega CONFIG_LKDTM=y al kernel configuración y confirmar que cada uno de los siguientes comandos conduce a un kernel pánico:

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

Para 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

Problemas comunes

Es probable que estos cambios expongan errores en los controladores del kernel, que se deben por el fabricante del dispositivo o el propietario del controlador del kernel.

  • La copia de usuario endurecida expone la comprobación de límites incorrectos cuando se copian datos. desde y hacia el espacio del usuario. Estos deben corregirse como cualquier otro error de corrupción de memoria.
  • La emulación de PAN expone el acceso directo al espacio del usuario desde el kernel, que no es por lo que está permitido. Los controladores que intenten acceder a la memoria del espacio del usuario deberán cambiarse a usa el método copy_to_user()/copy_from_user() estándar en su lugar.