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
oCONFIG_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.