Integridade do fluxo de controle no kernel

A Integridade do fluxo de controle (CFI, na sigla em inglês) é um mecanismo de segurança que impede alterações no gráfico de fluxo de controle original de um binário compilado, tornando-o significativamente mais resistente a tais ataques.

A partir do Android 9, é possível ativar a CFI no kernel.

O kernel do Linux tem duas implementações diferentes de CFI:

  • para o Linux 6.0 e versões anteriores, a Clang CFI, que depende da Clang LTO
  • para o Linux 6.1 e versões mais recentes, a Clang KCFI

A Clang CFI exige a compilação com a otimização de tempo de link (LTO, na sigla em inglês). A LTO preserva a representação de bitcode LLVM de arquivos de objeto até o tempo de link, o que permite que o compilador raciocine melhor sobre quais otimizações podem ser realizadas. Nos testes no Android, a combinação de LTO e CFI resultou em uma sobrecarga insignificante no tamanho e na performance do código. No entanto, a ativação da LTO aumenta significativamente o tempo de build do kernel.

A Clang KCFI não exige a LTO. Assim, os kernels do Android mais recentes se beneficiam da CFI sem a sobrecarga de tempo de build da LTO.

Implementação

A CFI é controlada pela opção CONFIG_CFI_CLANG, que ativa a Clang CFI ou a Clang KCFI.

Para mais detalhes técnicos sobre a CFI e como outras verificações de controle direto são processadas, consulte a documentação de design do LLVM. A KCFI é referenciada como -fsanitize=kcfi.

Solução de problemas

Depois de ativar, resolva os erros de incompatibilidade de tipo que possam existir com os drivers. Uma chamada de função indireta por um ponteiro de função incompatível aciona a CFI. Quando uma falha de CFI é detectada, o kernel imprime um aviso que inclui a função chamada e o stacktrace que levou à falha. Para corrigir isso, verifique se os ponteiros de função sempre têm o mesmo tipo da função chamada.

Para ajudar na depuração de falhas de CFI, ative CONFIG_CFI_PERMISSIVE, que imprime um aviso em vez de causar um kernel panic. O modo permissivo não pode ser usado na produção.

Validação

No momento, não há testes do CTS especificamente para a CFI. Em vez disso, verifique se os testes do CTS são aprovados com e sem a CFI ativada para verificar se ela não está afetando o dispositivo.