L'intégrité du flux de contrôle (CFI) est un mécanisme de sécurité qui interdit toute modification du graphique de flux de contrôle d'origine d'un binaire compilé, ce qui rend les attaques de ce type beaucoup plus difficiles à réaliser.
À partir d'Android 9, vous pouvez activer la CFI dans le noyau.
Le noyau Linux a connu deux implémentations différentes de la CFI :
- pour Linux 6.0 et versions antérieures, Clang CFI, qui repose sur Clang LTO
- pour Linux 6.1 et versions ultérieures, Clang KCFI
Clang CFI nécessite une compilation avec l'optimisation au moment de la liaison (LTO). La LTO préserve la représentation de bitcode LLVM des fichiers objets jusqu'au moment de la liaison, ce qui permet au compilateur de mieux déterminer les optimisations à effectuer. Lors des tests sur Android, la combinaison de la LTO et de la CFI a entraîné une surcharge négligeable de la taille et des performances du code. Toutefois, l'activation de la LTO augmente considérablement la durée de la compilation du noyau.
Clang KCFI ne nécessite pas de LTO. Les noyaux Android plus récents bénéficient donc de la CFI sans la surcharge de la LTO au moment de la compilation.
Implémentation
La CFI est contrôlée par l'option CONFIG_CFI_CLANG, qui active Clang CFI ou Clang KCFI.
Pour obtenir plus d'informations techniques sur la CFI et sur la manière dont les autres vérifications de contrôle direct sont
gérées, consultez la documentation
de conception LLVM. La KCFI y est appelée -fsanitize=kcfi.
Dépannage
Après l'activation, résolvez les erreurs d'incompatibilité de type qui peuvent exister avec leurs pilotes. Un appel de fonction indirect via un pointeur de fonction incompatible déclenche la CFI. Lorsqu'un échec de la 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 de la CFI, activez CONFIG_CFI_PERMISSIVE, qui affiche un avertissement au lieu de provoquer un plantage du noyau. Le mode permissif ne doit pas être utilisé en production.
Validation
Actuellement, aucun test CTS n'est spécifiquement dédié à la CFI. Assurez-vous plutôt que les tests CTS réussissent avec et sans la CFI activée pour vérifier que la CFI n'a pas d'incidence sur l'appareil.