Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Punteros etiquetados

A partir de Android 11, para los procesos de 64 bits, todas las asignaciones de montón tienen una etiqueta definida de implementación establecida en el byte superior del puntero en dispositivos con soporte de kernel para ARM Top-byte Ignore (TBI). Cualquier aplicación que modifique esta etiqueta finaliza cuando se comprueba la etiqueta durante la desasignación. Esto es necesario para el futuro de hardware con ARM memoria etiquetado Extensión (MTE) de apoyo.

Ignorar byte superior

La función Ignorar byte superior de ARM está disponible para código de 64 bits en todo el hardware Armv8 AArch64. Esta característica significa que el hardware ignora el byte superior de un puntero cuando accede a la memoria.

TBI requiere unkernel compatible que Maneja correctamente etiquetados punteros pasados desde el espacio de usuario. Android núcleos Común de 4,14 (Pixel 4) y la característica más altas son las requeridas parches de TBI .

Los dispositivos con soporte TBI en el kernel se detectan dinámicamente en el momento de inicio del proceso y se inserta una etiqueta dependiente de la implementación en el byte superior del puntero para todas las asignaciones de montón. Después de esto, se ejecuta una verificación para asegurarse de que la etiqueta no se haya truncado al desasignar la memoria.

Disponibilidad de 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 mediante el etiquetado de los bits de dirección 56ª-59a de cada asignación de memoria en la pila, montón, y globales. El hardware y el conjunto de instrucciones verifican automáticamente que se utilice la etiqueta correcta en cada acceso a la memoria.

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

Soporte para desarrolladores

Si su aplicación se bloqueó y se le solicitó este enlace, podría significar uno de los siguientes:

  1. La aplicación intentó liberar un puntero que no fue asignado por el asignador de montón del sistema.
  2. Algo en su aplicación modificó el byte superior de un puntero. El byte superior del puntero no se puede modificar y su código debe cambiarse para solucionar este problema.

Ejemplos de puntero de byte superior utilizado o modificado incorrectamente.

  • Los punteros a un tipo particular tienen metadatos específicos de la aplicación almacenados en los 16 bits de dirección principales.
  • Un puntero se convierte para duplicar y luego retroceder, perdiendo los bits de dirección inferiores.
  • Codifique el cálculo de 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 comportan incorrectamente cuando se establece el byte superior del puntero. Reconocemos que puede no ser trivial solucionar estos problemas subyacentes en las bibliotecas rápidamente. Como tal, las aplicaciones que utilizan targetSdkLevel < 30 no tendrá etiquetado puntero activadas por defecto. También proporcionamos una vía de escape para aplicaciones hechas con targetSdkLevel >= 30 para facilitar el período de transición.

La puerta de escape se utiliza añadiendo lo siguiente a su AndroidManifest.xml archivo:

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

Esto desactivará la función de etiquetado de puntero para su aplicación. Tenga en cuenta que esto no aborda el problema de salud de código subyacente. Esta vía de escape desaparecerá en futuras versiones de Android, debido a cuestiones de esta naturaleza serán incompatibles con MTE .