Google is committed to advancing racial equity for Black communities. See how.
Cette page a été traduite par l'API Cloud Translation.
Switch to English

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 arrêtée lorsque la balise est vérifiée lors de la désallocation. Ceci est nécessaire pour le matériel futur avec la prise en charge de l'extension de marquage de mémoire ARM (MTE).

Ignorer le premier octet

La fonction d'ignorance du 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 nécessite unnoyau compatible qui gère correctement les pointeurs marqués transmis depuis l'espace utilisateur. Les noyaux communs Android à partir de la version 4.14 (Pixel 4) et des versions supérieures comportent les correctifs TBI requis.

Les périphériques prenant en charge TBI dans le noyau sont détectés dynamiquement au moment du 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 désallocation de la mémoire.

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

L'extension MTE (Memory Tagging Extension) d'ARM aide à résoudre les problèmes de sécurité de la mémoire. MTE fonctionne en balisant les 56e-59e bits d'adresse de chaque allocation de mémoire sur la pile, le tas et les globaux. Le matériel et le jeu d'instructions vérifient automatiquement que la bonne balise est utilisée à chaque accès mémoire.

Les applications Android qui stockent de manière incorrecte des informations dans l'octet supérieur du pointeur sont assurées de s'arrêter 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.

Support développeur

Si votre application a planté et que vous avez été invité avec ce lien, cela peut signifier l'une des choses suivantes:

  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 du pointeur d'octet supérieur mal utilisé ou modifié.

  • 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érents cadres de pile afin 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 inutile de résoudre rapidement ces problèmes sous-jacents dans les bibliothèques. Ainsi, les applications qui utilisent targetSdkLevel < 30 n'auront pas le balisage de pointeur activé par défaut. Nous fournissons également une trappe d'échappement pour les applications targetSdkLevel >= 30 avec targetSdkLevel >= 30 pour faciliter la période de transition.

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

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

Cela désactivera la fonctionnalité de balisage de pointeur pour votre application. Veuillez noter que cela ne résout pas le problème de santé du code sous-jacent. Cette trappe d'échappement disparaîtra dans les futures versions d'Android, car les problèmes de cette nature seront incompatibles avec MTE .