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 beaucoup plus difficile la réalisation de telles attaques.
Dans Android 9, nous avons activé l'implémentation de CFI par LLVM dans davantage de composants ainsi que dans le noyau. Le système CFI est activé par défaut, mais vous devez activer le noyau CFI.
Le CFI de LLVM nécessite une compilation avec Link-Time Optimization (LTO) . LTO préserve la représentation bitcode LLVM des fichiers objets jusqu'au moment de la liaison, ce qui permet au compilateur de mieux réfléchir aux optimisations qui peuvent ê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 CFI entraîne une surcharge négligeable en termes de taille et de performances du code ; dans quelques cas, les deux se sont améliorés.
Pour plus de détails techniques sur CFI et sur la façon dont les autres contrôles de contrôle avant sont gérés, consultez la documentation de conception LLVM .
Mise en œuvre
Les correctifs kCFI se trouvent dans toutes les versions du noyau Android prises en charge. L'option CONFIG_CFI_CLANG
active kCFI et est définie par défaut dans GKI.
Dépannage
Après l'activation, résolvez toutes 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 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 pile qui a conduit à l'échec. Corrigez cela en vous assurant 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 noyau. Le mode permissif ne doit pas être utilisé en production.
Validation
Actuellement, il n'existe pas de test CTS spécifiquement pour CFI. Au lieu de cela, assurez-vous que les tests CTS réussissent avec ou sans CFI activé pour vérifier que CFI n'a pas d'impact sur l'appareil.