Integridade do fluxo de controle do kernel

A integridade do fluxo de controle (CFI) é um mecanismo de segurança que não permite alterações no gráfico de fluxo de controle original de um binário compilado, dificultando significativamente a execução de tais ataques.

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

O CFI do LLVM requer compilação com Link-Time Optimization (LTO) . O LTO preserva a representação de bitcode LLVM de arquivos de objeto até o momento do link, o que permite que o compilador raciocine melhor sobre quais otimizações podem ser executadas. A ativação do LTO reduz o tamanho do binário final e melhora o desempenho, mas aumenta o tempo de compilação. Em testes no Android, a combinação de LTO e CFI resulta em uma sobrecarga insignificante no tamanho e no desempenho do código; em alguns casos, ambos melhoraram.

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

Implementação

Os patches kCFI estão em todas as versões de kernel Android suportadas. A opção CONFIG_CFI_CLANG habilita kCFI e é definida por padrão no GKI.

Solução de problemas

Depois de habilitar, trabalhe com quaisquer erros de incompatibilidade de tipo que possam existir com seus drivers. Uma chamada de função indireta por meio de um ponteiro de função incompatível aciona o CFI. Quando uma falha de CFI é detectada, o kernel imprime um aviso que inclui a função que foi chamada e o rastreamento de pilha que levou à falha. Corrija isso garantindo que os ponteiros de função sempre tenham o mesmo tipo da função que é chamada.

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

Validação

Atualmente, não há teste CTS especificamente para CFI. Em vez disso, certifique-se de que os testes CTS sejam aprovados com ou sem CFI habilitado para verificar se o CFI não está afetando o dispositivo.