Endurecimento do Kernel

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 no 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 para sua árvore do kernel e habilitar as seguintes opções de configuração do kernel:

  • Usercopy protegido: CONFIG_HARDENED_USERCOPY=y
  • Emulação PAN - arm64: CONFIG_ARM64_SW_TTBR0_PAN=y
  • Emulação PAN - arme: CONFIG_CPU_SW_DOMAIN_PAN=y
  • KASLR - kernels 4.4 e posteriores: CONFIG_RANDOMIZE_BASE=y

O KASLR também requer suporte ao carregador de inicialização para passar a entropia de hardware pelo nó da árvore do dispositivo /chosen/kaslr-seed ou pela implementação de 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 ou CONFIG_STRICT_KERNEL_RWX=y
  • Restringir o acesso ao espaço do usuário do kernel - x86 (ativado 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 expõem bugs nos drivers do kernel, que precisam ser corrigidos pelo fabricante do dispositivo ou pelo proprietário do driver do kernel.

  • O usercopy protegido expõe a verificação de limites incorretos ao copiar dados de/para o espaço do usuário. Estes 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() .