Integrità del flusso di controllo del kernel

L'integrità del flusso di controllo (CFI) è un meccanismo di sicurezza che non consente modifiche al grafico del flusso di controllo originale di un binario compilato, rendendo molto più difficile eseguire tali attacchi.

In Android 9, abbiamo abilitato l'implementazione di CFI da parte di LLVM in più componenti e anche nel kernel. Il CFI di sistema è attivo per impostazione predefinita, ma è necessario abilitare il CFI del kernel.

Il CFI di LLVM richiede la compilazione con Link-Time Optimization (LTO) . LTO preserva la rappresentazione del codice bit LLVM dei file oggetto fino al momento del collegamento, consentendo al compilatore di ragionare meglio su quali ottimizzazioni possono essere eseguite. L'abilitazione di LTO riduce la dimensione del file binario finale e migliora le prestazioni, ma aumenta il tempo di compilazione. Nei test su Android, la combinazione di LTO e CFI comporta un sovraccarico trascurabile in termini di dimensioni e prestazioni del codice; in alcuni casi entrambi sono migliorati.

Per ulteriori dettagli tecnici sul CFI e su come vengono gestiti gli altri controlli avanzati, consultare la documentazione di progettazione LLVM .

Implementazione

Le patch kCFI sono presenti in tutte le versioni del kernel Android supportate. L'opzione CONFIG_CFI_CLANG abilita kCFI ed è impostata per impostazione predefinita in GKI.

Risoluzione dei problemi

Dopo l'abilitazione, risolvere eventuali errori di mancata corrispondenza del tipo che potrebbero esistere con i relativi driver. Una chiamata di funzione indiretta tramite un puntatore a funzione incompatibile fa scattare CFI. Quando viene rilevato un errore CFI, il kernel stampa un avviso che include sia la funzione chiamata sia lo stacktrace che ha portato all'errore. Correggere questo problema assicurandosi che i puntatori a funzione abbiano sempre lo stesso tipo della funzione chiamata.

Per assistere nel debug degli errori CFI, abilitare CONFIG_CFI_PERMISSIVE , che stampa un avviso invece di causare un panico nel kernel. La modalità permissiva non deve essere utilizzata in produzione.

Validazione

Attualmente non esistono test CTS specifici per CFI. Assicurati invece che i test CTS superino con o senza CFI abilitato per verificare che CFI non influisca sul dispositivo.