Android 8.0 agregó funciones de refuerzo del kernel para ayudar a mitigar las vulnerabilidades del kernel y encontrar errores en los controladores del kernel. Las características están en kernel/common en las 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 todos los parches de refuerzo del kernel/common
en su árbol del núcleo y habilitar las siguientes opciones de configuración del núcleo:
- Copia de usuario reforzada:
CONFIG_HARDENED_USERCOPY=y
- Emulación PAN - arm64:
CONFIG_ARM64_SW_TTBR0_PAN=y
- Emulación PAN - armado:
CONFIG_CPU_SW_DOMAIN_PAN=y
- KASLR - Kernels 4.4 y posteriores:
CONFIG_RANDOMIZE_BASE=y
KASLR también requiere compatibilidad con el cargador de arranque para pasar la entropía del hardware a través del nodo del árbol de dispositivos /chosen/kaslr-seed
o mediante la implementación EFI_RNG_PROTOCOL
.
Asegúrese también de que las funciones de refuerzo existentes estén habilitadas:
- Mitigación de desbordamiento del búfer de pila:
CONFIG_CC_STACKPROTECTOR_STRONG=y
- Protección de la memoria interna:
CONFIG_DEBUG_RODATA=y
oCONFIG_STRICT_KERNEL_RWX=y
- Restringir el acceso al espacio de usuario desde el kernel - x86 (habilitado de forma predeterminada):
CONFIG_X86_SMAP=y
Pruebas
Para probar su implementación, agregue CONFIG_LKDTM=y
a la configuración del kernel y confirme que cada uno de los siguientes comandos genera un pánico en el kernel:
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 deben ser solucionados por el fabricante del dispositivo o por el propietario del controlador del kernel.
- La copia de usuario reforzada expone una comprobación de límites incorrecta al copiar datos hacia/desde el espacio de usuario. Estos deberían solucionarse como cualquier otro error de corrupción de memoria.
- La emulación PAN expone el acceso directo al espacio del usuario desde el kernel, lo cual no está permitido. Los controladores que intentan acceder a la memoria del espacio del usuario deben cambiarse para utilizar las funciones estándar
copy_to_user()
/copy_from_user()
.
Android 8.0 agregó funciones de refuerzo del kernel para ayudar a mitigar las vulnerabilidades del kernel y encontrar errores en los controladores del kernel. Las características están en kernel/common en las 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 todos los parches de refuerzo del kernel/common
en su árbol del núcleo y habilitar las siguientes opciones de configuración del núcleo:
- Copia de usuario reforzada:
CONFIG_HARDENED_USERCOPY=y
- Emulación PAN - arm64:
CONFIG_ARM64_SW_TTBR0_PAN=y
- Emulación PAN - armado:
CONFIG_CPU_SW_DOMAIN_PAN=y
- KASLR - Kernels 4.4 y posteriores:
CONFIG_RANDOMIZE_BASE=y
KASLR también requiere compatibilidad con el cargador de arranque para pasar la entropía del hardware a través del nodo del árbol de dispositivos /chosen/kaslr-seed
o mediante la implementación EFI_RNG_PROTOCOL
.
Asegúrese también de que las funciones de refuerzo existentes estén habilitadas:
- Mitigación de desbordamiento del búfer de pila:
CONFIG_CC_STACKPROTECTOR_STRONG=y
- Protección de la memoria interna:
CONFIG_DEBUG_RODATA=y
oCONFIG_STRICT_KERNEL_RWX=y
- Restringir el acceso al espacio de usuario desde el kernel - x86 (habilitado de forma predeterminada):
CONFIG_X86_SMAP=y
Pruebas
Para probar su implementación, agregue CONFIG_LKDTM=y
a la configuración del kernel y confirme que cada uno de los siguientes comandos genera un pánico en el kernel:
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 deben ser solucionados por el fabricante del dispositivo o por el propietario del controlador del kernel.
- La copia de usuario reforzada expone una comprobación de límites incorrecta al copiar datos hacia/desde el espacio de usuario. Estos deberían solucionarse como cualquier otro error de corrupción de memoria.
- La emulación PAN expone el acceso directo al espacio del usuario desde el kernel, lo cual no está permitido. Los controladores que intentan acceder a la memoria del espacio del usuario deben cambiarse para utilizar las funciones estándar
copy_to_user()
/copy_from_user()
.
Android 8.0 agregó funciones de refuerzo del kernel para ayudar a mitigar las vulnerabilidades del kernel y encontrar errores en los controladores del kernel. Las características están en kernel/common en las 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 todos los parches de refuerzo del kernel/common
en su árbol del núcleo y habilitar las siguientes opciones de configuración del núcleo:
- Copia de usuario reforzada:
CONFIG_HARDENED_USERCOPY=y
- Emulación PAN - arm64:
CONFIG_ARM64_SW_TTBR0_PAN=y
- Emulación PAN - armado:
CONFIG_CPU_SW_DOMAIN_PAN=y
- KASLR - Kernels 4.4 y posteriores:
CONFIG_RANDOMIZE_BASE=y
KASLR también requiere compatibilidad con el cargador de arranque para pasar la entropía del hardware a través del nodo del árbol de dispositivos /chosen/kaslr-seed
o mediante la implementación EFI_RNG_PROTOCOL
.
Asegúrese también de que las funciones de refuerzo existentes estén habilitadas:
- Mitigación de desbordamiento del búfer de pila:
CONFIG_CC_STACKPROTECTOR_STRONG=y
- Protección de la memoria interna:
CONFIG_DEBUG_RODATA=y
oCONFIG_STRICT_KERNEL_RWX=y
- Restringir el acceso al espacio de usuario desde el kernel - x86 (habilitado de forma predeterminada):
CONFIG_X86_SMAP=y
Pruebas
Para probar su implementación, agregue CONFIG_LKDTM=y
a la configuración del kernel y confirme que cada uno de los siguientes comandos genera un pánico en el kernel:
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 deben ser solucionados por el fabricante del dispositivo o por el propietario del controlador del kernel.
- La copia de usuario reforzada expone una comprobación de límites incorrecta al copiar datos hacia/desde el espacio de usuario. Estos deberían solucionarse como cualquier otro error de corrupción de memoria.
- La emulación PAN expone el acceso directo al espacio del usuario desde el kernel, lo cual no está permitido. Los controladores que intentan acceder a la memoria del espacio del usuario deben cambiarse para utilizar las funciones estándar
copy_to_user()
/copy_from_user()
.