Punteros etiquetados

A partir de Android 11, para los procesos de 64 bits, todas las asignaciones de montón tienen una etiqueta definida para la implementación en el byte superior del puntero en dispositivos con compatibilidad del kernel para la omisión de byte superior (TBI) de ARM Cualquier app que modifique esta configuración La etiqueta finaliza cuando se verifica durante la desasignación. Esto es necesario para el hardware futuro con la extensión de etiquetado de memoria ARM (MTE).

Omite el byte superior

La función de omisión de bytes superiores de ARM está disponible para código de 64 bits en todo el hardware AArch64 de Armv8. Esta función significa que el hardware ignora el byte superior de un puntero cuando el acceso a la memoria.

TBI requiere una página kernel que controla correctamente los punteros etiquetados que se pasan desde el espacio del usuario. Los kernels comunes de Android 4.14 (Pixel 4) y versiones posteriores cuentan con el TBI requerido. parches de seguridad.

Los dispositivos compatibles con TBI en el kernel se detectan de forma dinámica en hora de inicio del proceso y se inserta una etiqueta dependiente de la implementación en la parte superior byte del puntero para todas las asignaciones de montón. Después de esto, se ejecuta una verificación para asegúrate de que la etiqueta no se haya truncado cuando se anule la asignación de la memoria.

Preparación de la extensión de etiquetado de memoria

La extensión de etiquetado de memoria (MTE) de ARM ayuda a abordar los problemas de seguridad de la memoria. MTE Funciona con el etiquetado de los bits de las direcciones entre 56 y 59 de cada memoria. asignación en pila, en el montón y en globales. El hardware y el conjunto de instrucciones automáticamente comprueba que se use la etiqueta correcta en cada acceso a la memoria.

Las apps para Android que almacenan información de forma incorrecta en el byte superior de la se garantiza que romperán en un dispositivo con MTE habilitado. Los punteros etiquetados facilitan la detección y el rechazo de los usos incorrectos de la parte superior byte del puntero antes de que los dispositivos MTE estén disponibles.

Asistencia para desarrolladores

Si tu app falló y recibiste este vínculo, es posible que una de las siguientes opciones:

  1. La app intentó liberar un puntero que el asignador de montón del sistema.
  2. Algo en tu app modificó el byte superior de un puntero. El byte superior de El puntero no se puede modificar y debes cambiar el código para solucionar esto. problema.

Ejemplos de uso o modificación del puntero de byte superior de forma incorrecta.

  • Los punteros de un tipo determinado tienen almacenados metadatos específicos de la app en los 16 bits de dirección superiores.
  • Una transmisión de puntero para duplicar y, luego, retroceder, lo que pierde los bits de dirección más bajos.
  • Código que calcula la diferencia entre las direcciones de las variables locales de diferentes marcos de pila como una forma de medir la profundidad de recursividad.

Algunas aplicaciones pueden depender de bibliotecas que se comporten de forma incorrecta cuando el byte superior del puntero. Reconocemos que podría ser y no trivial para solucionar rápidamente estos problemas subyacentes en bibliotecas. Por lo tanto, apps que usan targetSdkLevel < 30 no tendrá habilitado el etiquetado de puntero de forma predeterminada. También brindamos un escape generación para apps compiladas con targetSdkLevel >= 30 para facilitar el período de transición.

Para usar la salida de escape, se debe agregar lo siguiente a tu Archivo AndroidManifest.xml:

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

Esta acción inhabilita la función de etiquetado de punteros para tu . Esto no aborda los problema de estado del código subyacente. Esta salida desaparecerá en el futuro. existentes de Android, ya que estos problemas no serán compatibles con MTE.