Sécurité de la mémoire

Mémoire non sécurisée

Les bugs de sécurité de mémoire, qui sont des erreurs de gestion de la mémoire dans les langages de programmation natifs, sont le problème le plus courant dans les codebases Android. Ils représentent plus de 60% des failles de sécurité de gravité élevée et des millions de plantages visibles par l'utilisateur.

 Les bugs de sécurité de la mémoire affectent l'expérience utilisateur, les coûts et la sécurité.
Figure 1: Bugs de sécurité de la mémoire et impact négatif sur la qualité, la sécurité et les coûts

Les bugs de sécurité de la mémoire ont un impact négatif sur la qualité et la stabilité, et représentent une part importante des plantages observés sur les appareils des utilisateurs finaux. Par conséquent, une forte densité de bugs de sécurité de la mémoire est directement liée à une mauvaise expérience utilisateur.
Le code natif, écrit dans des langages non sécurisés tels que C, C++ et Assembly, représente plus de 70% du code de la plate-forme Android et est présent dans environ 50% des applications du Google Play Store.
Compte tenu de la complexité croissante du code, si elle n'est pas gérée, la quantité de bugs de sécurité de la mémoire va augmenter au fil du temps. C'est pourquoi il est essentiel pour notre succès à long terme de fournir à notre écosystème les outils et technologies capables de détecter et de limiter ces bugs.
Ces dernières années, nous avons travaillé en étroite collaboration avec nos partenaires matériels pour développer des technologies matérielles telles que le taggage de mémoire ARM, et nous avons introduit Rust dans le codebase Android.
Ces technologies vont accélérer notre chemin vers la sécurité de la mémoire et vont aider l'ensemble du secteur des logiciels à résoudre un problème clé.

Les bugs de sécurité au niveau de la mémoire ont un impact négatif sur la qualité

Les bugs de sécurité de la mémoire latente peuvent entraîner des résultats non déterministes, en fonction de l'état du système. Ce comportement imprévisible entraîne des plantages et des désagréments pour nos utilisateurs.

Chaque jour, nous observons des millions de plantages natifs sur les appareils des utilisateurs finaux. Avec l'introduction de GWP-ASan, nous avons pu remonter la plupart d'entre eux à des bugs de sécurité de la mémoire.
Ce point de données valide la corrélation entre la qualité et la densité des bugs de sécurité de la mémoire, et est conforme à ce que nos collègues Chrome observent (voir la liste des bugs GWP-ASan de Chrome).

Les bugs de sécurité de la mémoire ont un impact négatif sur la sécurité

Les bugs de sécurité au niveau de la mémoire ont toujours été les principaux contributeurs aux failles de sécurité d'Android, depuis la première version d'Android.

Les bugs de sécurité de la mémoire nuisent à la sécurité.
Figure 2: Contribution des bugs de sécurité de la mémoire aux failles Android

Il est encourageant de savoir que ce n'est pas seulement un problème Android (voir les statistiques sur Chrome et Microsoft), mais nous devons faire plus pour la sécurité de nos utilisateurs.
L'équipe Project Zero de Google identifie les failles zero-day utilisées dans de vraies attaques contre des utilisateurs comme des failles zero-day. Il ne s'agit pas de bugs hypothétiques, mais d'exploits utilisés activement dans les attaques contre les utilisateurs. Les bugs de sécurité de la mémoire (corruption de mémoire et utilisation après libération) représentent une majorité écrasante.

Les bugs de sécurité liés à la mémoire augmentent les coûts

La mise à jour des appareils avec des correctifs de sécurité permet de protéger nos utilisateurs, mais a un coût financier pour notre écosystème.

La densité élevée de bugs de sécurité de la mémoire dans le code des fournisseurs de bas niveau, qui comporte souvent des modifications personnalisées, augmente considérablement les coûts de correction et de test. Toutefois, détecter ces bugs tôt dans le cycle de développement peut réduire ces coûts.

Des recherches montrent que détecter les bugs plus tôt peut réduire les coûts jusqu'à six fois. Toutefois, compte tenu de la complexité de notre écosystème, du nombre moyen de bases de code gérées par un fournisseur et de la complexité croissante des logiciels, les économies pourraient être plus importantes.

Sécurité de la mémoire

À partir d'Android 12, nous avons apporté des modifications systémiques pour réduire la densité des bugs de sécurité de la mémoire dans les codebases Android. Nous étendons les outils de sécurité de la mémoire Android et introduisons de nouvelles exigences qui encouragent notre écosystème à résoudre cette catégorie de bugs. À terme, cela devrait se traduire par une meilleure qualité et une meilleure sécurité pour nos utilisateurs, et par des coûts réduits pour nos fournisseurs.

La sécurité de la mémoire est susceptible de devenir un facteur de différenciation en termes de qualité et de sécurité dans les années à venir, et Android prévoit de montrer la voie.

Exigences pour assurer la sécurité de la mémoire

Le document de définition de compatibilité (CDD) Android recommande vivement l'utilisation d'outils de sécurité de la mémoire pendant le développement.
Nous collaborons étroitement avec notre écosystème pour accroître l'utilisation des outils de sécurité de la mémoire et les intégrer aux processus d'intégration et de test continus.
Au fil du temps, nous souhaitons nous assurer que chaque appareil passe un CTS (Compatibility Test Suite) complet, à l'aide d'outils de sécurité de la mémoire, ce qui démontre qu'aucun bug de ce type n'a été détecté. Par exemple, les plates-formes Arm v9 devront fournir une exécution CTS avec le taggage de mémoire activé, tandis que les plates-formes Arm v8 devront fournir une exécution CTS à l'aide de HWASAN et de KASAN.

Rust en tant que nouveau langage de programmation pour le code de plate-forme

Android 12 a introduit Rust comme langage de plate-forme. Rust offre une sécurité de mémoire et de thread à des niveaux de performances similaires à ceux de C/C++. Nous nous attendons à ce que Rust soit le choix privilégié pour la plupart des nouveaux projets natifs. Toutefois, réécrire tout le code à mémoire non sécurisée, qui représente actuellement plus de 70% du code de la plate-forme Android, en Rust n'est pas réalisable. À l'avenir, Rust sera complémentaire des outils de sécurité de la mémoire.

Outils de sécurité de la mémoire

Android est compatible avec de nombreux outils qui aident à détecter les bugs de sécurité de la mémoire. La figure ci-dessous présente une taxonomie des outils de sécurité de la mémoire Android disponibles.

Les bugs de sécurité de la mémoire ont un impact négatif sur la sécurité.
Figure 3: Panorama des outils de sécurité de la mémoire Android

Nos outils couvrent une vaste gamme de scénarios et de cibles de déploiement. La documentation suivante décrit chaque outil et fournit une référence pour les utiliser dans vos produits.