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, tornando significativamente mais difícil realizar 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 do código de bits LLVM dos arquivos objeto até o momento do link, o que permite ao compilador raciocinar 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. Nos testes no Android, a combinação de LTO e CFI resulta em sobrecarga insignificante no tamanho e desempenho do código; em alguns casos, ambos melhoraram.

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

Implementação

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

Solução de problemas

Após a ativação, resolva 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 desarma o CFI. Quando uma falha CFI é detectada, o kernel imprime um aviso que inclui a função que foi 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 CFI, habilite CONFIG_CFI_PERMISSIVE , que imprime um aviso em vez de causar kernel panic. O modo permissivo não deve ser usado na produção.

Validação

Atualmente, não há teste CTS específico para Finanças. 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.