O Android 8.0 adicionou recursos de aumento da proteção do kernel para ajudar a mitigar o kernel vulnerabilidades e encontrar bugs nos drivers do kernel. Os atributos estão em kernel/common na ramificações do android-3.18, android-4.4 e android-4.9.
Implementação
Para adquirir esses recursos, os fabricantes de dispositivos e os SOCs devem mesclar todos
patches de aumento da proteção de kernel/common
para a árvore de kernel e
ative as seguintes opções de configuração do kernel:
- Cópia do usuário com mais proteção:
CONFIG_HARDENED_USERCOPY=y
- Emulação PAN - arm64:
CONFIG_ARM64_SW_TTBR0_PAN=y
- Emulação PAN: grupo:
CONFIG_CPU_SW_DOMAIN_PAN=y
- KASLR - Kernels 4.4 e mais recentes:
CONFIG_RANDOMIZE_BASE=y
A KASLR também precisa de suporte ao carregador de inicialização para transmitir a entropia do hardware
o nó da árvore de dispositivos /chosen/kaslr-seed
ou implementando
EFI_RNG_PROTOCOL
.
Verifique também se os recursos de aumento da proteção estão ativados:
- Mitigação de estouro do buffer de pilha:
CONFIG_CC_STACKPROTECTOR_STRONG=y
- Proteção de memória interna:
CONFIG_DEBUG_RODATA=y
ouCONFIG_STRICT_KERNEL_RWX=y
- Restringir o acesso ao espaço do usuário a partir do kernel - x86 (ativado por padrão):
CONFIG_X86_SMAP=y
Teste
Para testar a implementação, adicione CONFIG_LKDTM=y
ao kernel
e confirme se cada um dos comandos a seguir leva a um kernel
entrar em 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 comuns
Essas mudanças provavelmente vão expor bugs nos drivers do kernel, que precisam ser corrigidos pelo fabricante do dispositivo ou pelo proprietário do driver do kernel.
- A cópia do usuário com aumento da proteção expõe os limites incorretos ao copiar dados de/para o espaço do usuário. Isso deve ser corrigido como qualquer outro bug de corrupção de memória.
- A emulação PAN expõe o acesso direto ao espaço do usuário pelo kernel, que não é
permitido. Os drivers que tentam acessar a memória do espaço do usuário precisam ser alterados para
use o padrão
copy_to_user()
/copy_from_user()
.