A partire dal 27 marzo 2025, ti consigliamo di utilizzare android-latest-release
anziché aosp-main
per compilare e contribuire ad AOSP. Per ulteriori informazioni, vedi Modifiche ad AOSP.
Integrità del flusso di controllo del kernel
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
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.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-07-27 UTC."],[],[],null,["# Kernel control flow integrity\n\n[Control flow\nintegrity](https://clang.llvm.org/docs/ControlFlowIntegrity.html) (CFI) is a security mechanism that disallows changes to the\noriginal control flow graph of a compiled binary, making it significantly harder\nto perform such attacks.\n\n\nIn Android 9, we enabled LLVM's implementation of CFI in more components and\nalso in the kernel. [System CFI](/docs/security/test/cfi) is on by\ndefault, but you need to enable kernel CFI.\n\n\nLLVM's CFI requires compiling with [Link-Time Optimization\n(LTO)](https://llvm.org/docs/LinkTimeOptimization.html). LTO preserves the LLVM bitcode representation of object files until\nlink-time, which allows the compiler to better reason about what optimizations\ncan be performed. Enabling LTO reduces the size of the final binary and improves\nperformance, but increases compile time. In testing on Android, the combination\nof LTO and CFI results in negligible overhead to code size and performance; in a\nfew cases both improved.\n\n\nFor more technical details about CFI and how other forward-control checks are\nhandled, see the [LLVM design\ndocumentation](https://clang.llvm.org/docs/ControlFlowIntegrityDesign.html).\n\nImplementation\n--------------\n\n\nThe kCFI patches are in all supported Android kernel versions. The `CONFIG_CFI_CLANG `\noption enables kCFI and is set by default in GKI.\n\n### Troubleshooting\n\n\nAfter enabling, work through any type mismatch errors that may exist with their\ndrivers. An indirect function call through an incompatible function pointer\ntrips CFI. When a CFI failure is detected, the kernel prints out a warning that\nincludes both the function that was called and the stacktrace that led to the\nfailure. Correct this by ensuring function pointers always have the same type as\nthe function that's called.\n\n\nTo assist in debugging CFI failures, enable `CONFIG_CFI_PERMISSIVE`,\nwhich prints out a warning instead of causing a kernel panic. Permissive mode\nmust not be used in production.\n\nValidation\n----------\n\n\nCurrently, there are no CTS test specifically for CFI. Instead, make sure that\nCTS tests pass with and without CFI enabled to verify that CFI isn't impacting\nthe device."]]