Integridade do fluxo de controle do kernel

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

No Android 9, ativamos a implementação de CFI do LLVM em mais componentes e também no kernel. O CFI do sistema está ativado por padrão, mas você precisa ativar o CFI do kernel.

A CFI do LLVM requer a compilação com otimização de link-time (LTO). O LTO preserva a representação de bitcode LLVM de arquivos de objeto até o momento da vinculação, o que permite que o compilador tenha uma melhor razão sobre quais otimizações podem ser realizadas. Ativar o LTO reduz o tamanho do binário final e melhora o desempenho, mas aumenta o tempo de compilação. Nos testes no Android, a combinação de LTO e CFI resulta em uma sobrecarga insignificante para o tamanho e o desempenho do código. Em alguns casos, houve melhorias em ambos.

Para mais detalhes técnicos sobre o CFI e como outras verificações de controle de encaminhamento são processadas, consulte a documentação de design do LLVM.

Implementação

Os patches kCFI estão em todas as versões do kernel do Android com suporte. A opção CONFIG_CFI_CLANG ativa o kCFI e é definida por padrão no GKI.

Solução de problemas

Depois de ativar, trabalhe com todos os tipos de erros de incompatibilidade que possam existir com os drivers. Uma chamada de função indireta por um ponteiro de função incompatível ativa o CFI. Quando uma falha de CFI é detectada, o kernel mostra um aviso que inclui a função chamada e o stacktrace que levou à falha. Corrija isso garantindo que os ponteiros de função sempre tenham o mesmo tipo da função chamada.

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

Validação

No momento, não há um teste CTS específico para CFI. Em vez disso, verifique se os testes do CTS são aprovados com e sem o CFI ativado para verificar se o CFI não está afetando o dispositivo.