L'integrità del flusso di controllo (CFI) è un meccanismo di sicurezza che non consente modifiche al grafo del flusso di controllo originale di un file binario compilato, rendendo notevolmente più difficile eseguire questi attacchi.
In Android 9 abbiamo attivato l'implementazione di CFI di LLVM in più componenti e anche nel kernel. Il CFI di sistema è attivo per impostazione predefinita, ma devi attivare il CFI del kernel.
Il CFI di LLVM richiede la compilazione con l'ottimizzazione in fase di link (LTO). LTO conserva la rappresentazione in bitcode di LLVM dei file oggetto fino al tempo di collegamento, il che consente al compilatore di ragionare meglio sulle ottimizzazioni che possono essere eseguite. L'attivazione di LTO riduce le dimensioni 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 overhead trascurabile per le dimensioni e le prestazioni del codice; in alcuni casi, entrambi sono migliorati.
Per ulteriori dettagli tecnici sul controllo di CFI e su come vengono gestiti altri controlli di controllo in avanti, consulta la documentazione sul design di LLVM.
Implementazione
Le patch kCFI sono presenti in tutte le versioni del kernel Android supportate. L'opzione CONFIG_CFI_CLANG
attiva kCFI ed è impostata per impostazione predefinita in GKI.
Risoluzione dei problemi
Dopo l'attivazione, risolvi eventuali errori di mancata corrispondenza del tipo che potrebbero verificarsi con i relativi driver. Una chiamata di funzione indiretta tramite un puntatore funzione incompatibile attiva il controllo CFI. Quando viene rilevato un errore CFI, il kernel stampa un avviso che include sia la funzione chiamata sia lo stacktrace che ha causato l'errore. Correggi il problema assicurandoti che i puntatori di funzione abbiano sempre lo stesso tipo della funzione chiamata.
Per facilitare il debug degli errori CFI, attiva CONFIG_CFI_PERMISSIVE
,
che stampa un avviso anziché causare un panico del kernel. La modalità permissiva
non deve essere utilizzata in produzione.
Convalida
Al momento non sono disponibili test CTS specifici per i CFI. Assicurati invece che i test CTS superino con e senza CFI abilitato per verificare che CFI non influisca sul dispositivo.