Débogage et atténuation des erreurs de mémoire

Android est compatible avec plusieurs outils de débogage des erreurs de mémoire. Chacune de ces méthodes présente des avantages et des inconvénients. Lisez la suite pour déterminer la solution la mieux adaptée à votre cas d'utilisation. Ce document vous donne un aperçu des outils à votre disposition et vous permet de déterminer ceux à approfondir. Il vise toutefois à être succinct. Nous vous invitons donc à lire les documents propres aux outils pour en savoir plus.

Résumé

  • Dans la mesure du possible, utilisez un langage à mémoire sécurisée afin de faire en sorte que les erreurs de mémoire soient impossibles.
  • Utilisez toujours PAC/BTI pour limiter les attaques ROP/JOP.
  • Utilisez toujours GWP-ASan pour détecter les erreurs de mémoire rares en production.
  • Utilisez HWASan pour détecter les erreurs de mémoire lors des tests.
  • Les appareils compatibles avec la fonctionnalité MTE ne sont pas répandus en 2023, mais utilisez cette fonctionnalité si vous pouvez détecter des erreurs en production.
  • Utilisez ASan pendant les tests en dernier recours seulement.

Langages à mémoire sécurisée

Un langage à mémoire sécurisée est le seul moyen d'atténuer et d'éviter totalement les erreurs de mémoire. Les autres outils de cette page peuvent vous aider à rendre votre code à mémoire non sécurisée plus sûr et plus fiable. Cependant, l'utilisation d'un langage à mémoire sécurisée permet d'éliminer toute cette catégorie de problèmes.

Les langages à mémoire sécurisée officiellement compatibles avec Android sont Java et Kotlin. La plupart des applications Android sont plus faciles à développer dans l'un de ces langages.

Cela dit, il existe des développeurs d'applications qui envoient du code écrit en Rust et si vous lisez cette page, vous avez probablement une bonne raison de vouloir du code natif (portabilité, performances ou les deux). Rust est le meilleur choix pour le code natif à mémoire sécurisée sur Android. L'équipe du NDK n'est pas nécessairement en mesure de vous aider à résoudre les problèmes que vous rencontrez si vous suivez cette voie, mais n'hésitez pas à nous les communiquer quand même.

PAC/BTI

Pointer Authentication et Branch Target Identification, connus également sous le nom de PAC/BTI, sont des outils de migration adaptés à une utilisation en production. Bien qu'il s'agisse de technologies distinctes, elles sont contrôlées par le même indicateur de compilation, et sont donc toujours utilisées ensemble.

Ces fonctionnalités sont rétrocompatibles avec les appareils non compatibles, car les nouvelles instructions utilisées sont no-ops sur les appareils plus anciens. Il est également nécessaire de disposer d'un noyau et d'une version de l'OS suffisamment récents. La recherche de paca et de bti dans /proc/cpuinfo vous indique si vous disposez d'un matériel et d'un noyau suffisamment récents. Android 12 (API 31) est compatible avec l'espace utilisateur.

Avantages :

  • Peuvent être activées dans tous les builds sans que cela pose problème sur les anciens appareils ou noyaux (mais assurez-vous d'avoir effectué des tests sur une combinaison appareil/noyau/OS compatible !)

Inconvénients :

  • Disponible uniquement pour les applications 64 bits
  • Ne corrigent pas les erreurs sur les appareils non compatibles
  • Augmentation de la taille du code de 1 %

GWP-Asan

GWP-ASan peut être utilisé pour détecter les erreurs de mémoire sur le terrain, mais le taux d'échantillonnage est trop faible pour constituer une atténuation efficace.

Avantages :

  • Pas de besoins supplémentaires en termes de processeur ou de mémoire
  • Déploiement simple : ne nécessite pas de recompiler le code natif
  • Compatible avec les applications 32 bits

Inconvénients :

  • Un taux d'échantillonnage faible nécessite qu'un grand nombre d'utilisateurs trouvent efficacement les bugs
  • Ne détecte que les erreurs de tas de mémoire, et non les erreurs de pile

HWASan

Hardware Address Sanitizer, également appelé HWASan, est le meilleur moyen d'identifier les erreurs de mémoire lors des tests. Il est particulièrement utile pour les tests automatisés, en particulier si vous effectuez des tests à données aléatoires. Toutefois, en fonction des besoins de votre application en termes de performances, vous pouvez également l'utiliser sur des téléphones haut de gamme en version dogfood.

Avantages :

  • Aucun faux positif
  • Détecte des classes d'erreurs supplémentaires par rapport à ASan (utilisation de la pile après le retour)
  • Taux de faux négatifs moins élevé que MTE (1 sur 256 contre 1 sur 16).
  • Besoins supplémentaires en termes de mémoire moins élevés que ceux d'ASan, son alternative la plus proche

Inconvénients :

  • Besoins supplémentaires importants en termes de processeur (environ 100 %) et de mémoire (10 à 35 %) et augmentation de la taille du code (environ 50 %)
  • Avant l'API 34 et le NDK r26, nécessite de flasher une image compatible avec HWASan
  • Ne fonctionne que sur les applications 64 bits

MTE

Memory Tagging Extension, également appelée MTE, est une alternative moins coûteuse à HWASan. En plus des fonctionnalités de débogage et de test, cette solution permet de détecter et de limiter la corruption de la mémoire en production. Si vous disposez du matériel pour tester les builds MTE, nous vous invitons à l'activer.

Avantages :

  • Besoins supplémentaires assez faibles pour être tolérés en production pour de nombreuses applications.
  • Aucun faux positif
  • Ne nécessite pas de recompiler le code pour détecter les erreurs de tas de mémoire (mais cette recompilation est nécessaire pour détecter les erreurs de pile).

Inconvénients :

  • Aucun appareil sur lequel MTE est activé par défaut n'est proposé sur le marché en 2024, mais la documentation du groupe explique comment activer MTE pour effectuer des tests sur les Pixel 8 et Pixel 8 Pro.
  • Taux de faux négatifs de 1 sur 16 contre 1 sur 256 pour HWASan
  • Disponible uniquement pour les applications 64 bits
  • Nécessite la création de bibliothèques distinctes pour cibler les appareils compatibles MTE et les autres

ASan

Parmi les outils disponibles, Address Sanitizer, également appelé ASan, est l'outil le plus ancien et le plus répandu. Il est utile pour détecter les erreurs de mémoire lors de tests et de débogages de problèmes qui n'affectent que les anciens appareils sur lesquels aucun des autres outils n'est disponible. Dans la mesure du possible, utilisez plutôt HWASan.

Avantages :

  • Largement répandu Peut fonctionner sur des appareils antérieurs à KitKat
  • Aucun faux positif ou négatif lorsqu'il est utilisé correctement

Inconvénients :

  • Difficile à compiler et à empaqueter correctement
  • Besoins supplémentaires les plus importants parmi toutes les options disponibles : augmentation d'environ 100 % de l'utilisation du processeur et de la mémoire et augmentation d'environ 50 % de la taille du code
  • N'est plus pris en charge
  • Possède des bugs connus qui ne seront pas corrigés