Intégrité du flux de contrôle du noyau

L'intégrité du flux de contrôle (CFI) est un mécanisme de sécurité qui interdit les modifications du graphique de flux de contrôle d'origine d'un binaire compilé, ce qui rend ces attaques beaucoup plus difficiles à effectuer.

Dans Android 9, nous avons activé l'implémentation de la CFI par LLVM dans davantage de composants et également dans le noyau. Le CFI système est activé par défaut, mais vous devez activer le CFI du kernel.

La CFI de LLVM nécessite une compilation avec l'optimisation au moment de l'édition de liens (LTO). LTO préserve la représentation du code binaire LLVM des fichiers d'objets jusqu'au moment de l'association, ce qui permet au compilateur de mieux raisonner sur les optimisations pouvant être effectuées. L'activation de LTO réduit la taille du binaire final et améliore les performances, mais augmente le temps de compilation. Lors des tests sur Android, la combinaison de LTO et de CFI entraîne une surcharge négligeable sur la taille et les performances du code. Dans certains cas, les deux sont améliorés.

Pour en savoir plus sur la CFI et la gestion des autres contrôles de transfert, consultez la documentation de conception LLVM.

Implémentation

Les correctifs kCFI sont disponibles dans toutes les versions du kernel Android compatibles. L'option CONFIG_CFI_CLANG active kCFI et est définie par défaut dans GKI.

Dépannage

Une fois l'activation effectuée, corrigez les erreurs de non-concordance de type pouvant exister avec leurs pilotes. Un appel de fonction indirect via un pointeur de fonction incompatible déclenche CFI. Lorsqu'un échec CFI est détecté, le noyau affiche un avertissement qui inclut à la fois la fonction appelée et la trace de la pile qui a entraîné l'échec. Pour corriger ce problème, assurez-vous que les pointeurs de fonction ont toujours le même type que la fonction appelée.

Pour faciliter le débogage des échecs CFI, activez CONFIG_CFI_PERMISSIVE, qui affiche un avertissement au lieu de provoquer une panique du kernel. Le mode permissif ne doit pas être utilisé en production.

Validation

Il n'existe actuellement aucun test CTS spécifique à la CFI. Assurez-vous plutôt que les tests CTS réussissent avec et sans CFI activé pour vérifier que CFI n'a aucun impact sur l'appareil.