Aumento da proteção do kernel

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 ou CONFIG_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() .