Integrità del flusso di controllo nel 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 file binario compilato, rendendo molto più difficile eseguire attacchi di questo tipo.

A partire da Android 9, puoi attivare CFI nel kernel.

Il kernel Linux ha avuto due implementazioni diverse di CFI:

  • Per Linux 6.0 e versioni precedenti, Clang CFI, che si basa su Clang LTO
  • Per Linux 6.1 e versioni successive, Clang KCFI

Clang CFI richiede la compilazione con Link Time Optimization (LTO). LTO conserva la rappresentazione del bitcode LLVM dei file oggetto fino al momento del collegamento, il che consente al compilatore di ragionare meglio su quali ottimizzazioni possono essere eseguite. Nei test su Android, la combinazione di LTO e CFI ha comportato un sovraccarico trascurabile per le dimensioni e le prestazioni del codice. Tuttavia, l'attivazione di LTO aumenta notevolmente il tempo di compilazione del kernel.

Clang KCFI non richiede LTO, quindi i kernel Android più recenti beneficiano di CFI senza il sovraccarico di LTO in fase di compilazione.

Implementazione

CFI è controllato dall'opzione CONFIG_CFI_CLANG, che attiva Clang CFI o Clang KCFI.

Per maggiori dettagli tecnici su CFI e su come vengono gestiti altri controlli di inoltro, consulta la documentazione di progettazione LLVM. KCFI viene indicato come -fsanitize=kcfi.

Risoluzione dei problemi

Dopo l'attivazione, risolvi eventuali errori di mancata corrispondenza dei tipi che potrebbero esistere con i driver. Una chiamata di funzione indiretta tramite un puntatore di funzione incompatibile attiva 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. Per correggere questo problema, assicurati 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 kernel panic. La modalità permissiva non deve essere utilizzata in produzione.

Convalida

Al momento non sono disponibili test CTS specifici per CFI. Assicurati invece che i test CTS vengano superati con e senza CFI attivato per verificare che CFI non influisca sul dispositivo.