Pointeurs marqués

À partir d'Android 11, pour les processus 64 bits, toutes les allocations de tas ont une balise définie par l'implémentation définie dans l'octet supérieur du pointeur sur les appareils prenant en charge le noyau pour ARM Top-byte Ignore (TBI). Toute application qui modifie cette balise est terminée lorsque la balise est vérifiée lors de la désallocation. Cela est nécessaire pour l' avenir matériel avec ARM Memory Extension Tagging de support (MTE).

Ignorer le premier octet

La fonction Ignorer le premier octet d'ARM est disponible pour le code 64 bits dans tout le matériel Armv8 AArch64. Cette fonctionnalité signifie que le matériel ignore l'octet supérieur d'un pointeur lors de l'accès à la mémoire.

TBI a besoin d' unnoyau compatible que correctement poignées tagged pointeurs passés de l' espace utilisateur. Android commune Noyaux de 4,14 (Pixel 4) et les caractéristiques plus nécessaires patchs TBI .

Les périphériques avec le support TBI dans le noyau sont détectés dynamiquement au démarrage du processus et une balise dépendante de l'implémentation est insérée dans l'octet supérieur du pointeur pour toutes les allocations de tas. Après cela, une vérification est exécutée pour s'assurer que la balise n'a pas été tronquée lors de la libération de la mémoire.

Préparation de l'extension de marquage de mémoire

Memory Tagging Extension (MTE) d'ARM permet de résoudre les problèmes de sécurité de la mémoire. MTE fonctionne en étiquetant les bits d'adresse 56e-59e de chaque allocation de mémoire dans la pile, tas, et globals. Le matériel et le jeu d'instructions vérifient automatiquement que le bon tag est utilisé à chaque accès à la mémoire.

Les applications Android qui stockent de manière incorrecte des informations dans l'octet haut du pointeur sont garanties à briser sur un appareil compatible MTE. Les pointeurs marqués facilitent la détection et le rejet des utilisations incorrectes de l'octet supérieur du pointeur avant que les périphériques MTE ne soient disponibles.

Assistance aux développeurs

Si votre application a planté et que ce lien vous a été demandé, cela peut signifier l'un des éléments suivants :

  1. L'application a tenté de libérer un pointeur qui n'a pas été alloué par l'allocateur de tas du système.
  2. Quelque chose dans votre application a modifié l'octet supérieur d'un pointeur. L'octet supérieur du pointeur ne peut pas être modifié et votre code doit être modifié pour résoudre ce problème.

Exemples d'utilisation ou de modification incorrectes du pointeur d'octet supérieur.

  • Les pointeurs vers un type particulier ont des métadonnées spécifiques à l'application stockées dans les 16 premiers bits d'adresse.
  • Un pointeur converti en double puis en arrière, perdant les bits d'adresse inférieurs.
  • Code calculant la différence entre les adresses des variables locales de différentes trames de pile comme moyen de mesurer la profondeur de récursivité.

Certaines applications peuvent dépendre de bibliothèques qui se comportent de manière incorrecte lorsque l'octet supérieur du pointeur est défini. Nous reconnaissons qu'il peut être non trivial de résoudre rapidement ces problèmes sous-jacents dans les bibliothèques. À ce titre, les applications qui utilisent targetSdkLevel < 30 aura pas de marquage de pointeur activé par défaut. Nous fournissons également une trappe d'évacuation pour les applications construites avec targetSdkLevel >= 30 pour faciliter la période de transition.

La trappe d'évacuation est utilisé en ajoutant ce qui suit à votre AndroidManifest.xml fichier:

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

Cela désactivera la fonction de marquage du pointeur pour votre application. S'il vous plaît noter que cela ne résout pas le problème de santé de code sous - jacent. Cette trappe d'évacuation disparaîtra dans les futures versions d'Android, parce que les questions de cette nature seront incompatibles avec MTE .