O Android 8.0 adicionou recursos de proteção do kernel para ajudar a mitigar as vulnerabilidades do kernel e encontrar bugs nos drivers do kernel. Os recursos estão em kernel/common nas ramificações android-3.18, android-4.4 e android-4.9.
Implementação
Para adquirir esses recursos, os fabricantes de dispositivos e SOCs devem mesclar todos os patches de proteção do kernel/common
em sua árvore de kernel e ativar as seguintes opções de configuração do kernel:
- Cópia de usuário reforçada:
CONFIG_HARDENED_USERCOPY=y
- Emulação PAN - arm64:
CONFIG_ARM64_SW_TTBR0_PAN=y
- Emulação PAN - braço:
CONFIG_CPU_SW_DOMAIN_PAN=y
- KASLR - kernels 4.4 e posteriores:
CONFIG_RANDOMIZE_BASE=y
KASLR também requer suporte de bootloader para passar entropia de hardware através do nó da árvore de dispositivos /chosen/kaslr-seed
ou implementando EFI_RNG_PROTOCOL
.
Certifique-se também de que os recursos de proteção existentes estejam ativados:
- Mitigação de estouro de 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 do kernel - x86 (habilitado por padrão):
CONFIG_X86_SMAP=y
Teste
Para testar sua implementação, adicione CONFIG_LKDTM=y
à configuração do kernel e confirme se cada um dos comandos a seguir leva a um kernel panic:
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 alterações provavelmente exporão bugs nos drivers do kernel, que precisam ser corrigidos pelo fabricante do dispositivo ou pelo proprietário do driver do kernel.
- Usercopy reforçado expõe verificação de limites incorretos ao copiar dados de/para o espaço do usuário. Eles devem ser corrigidos 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 do kernel, o que não é permitido. Os drivers que tentam acessar a memória do espaço do usuário precisam ser alterados para usar as funções padrão
copy_to_user()
/copy_from_user()
.