Compatibilidad con el bootloader de MTE

Android 13 introduce una ABI para que el espacio de usuario comunique el modo de MTE solicitado al bootloader. Esto se puede usar para habilitar MTE en dispositivos que tienen compatibilidad con hardware, pero que no se envían con MTE habilitado de forma predeterminada, o para inhabilitar MTE en dispositivos que sí se envían con él.

Compatibilidad con el bootloader

Para admitir esta ABI, tu bootloader debe leer misc_memtag_message (definido en bootloader_message.h) desde la partición misc. Si se encuentra un misc_memtag_message válido (MISC_VIRTUAL_AB_MAGIC_HEADER coincide y se admite el número de versión), el bootloader calcula

memtag = (default_memtag && !(misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_OFF)) ||
      misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG ||
      misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_ONCE

memtag_kernel = misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_KERNEL ||
      misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE

default_memtag es el parámetro de configuración predeterminado de activación o desactivación de memtag para el SKU. Si memtag es verdadero, el cargador de arranque configura la reserva de etiquetas de MTE, habilita las verificaciones de etiquetas en los niveles de excepción más bajos y comunica la región reservada de etiquetas al kernel a través de DT. Si memtag es falso, el cargador de arranque agrega arm64.nomte a la línea de comandos del kernel.

Si memtag_kernel es verdadero, el cargador de arranque agrega kasan=on a la línea de comandos del kernel. De lo contrario, agrega kasan=off.

El bootloader DEBE borrar MISC_MEMTAG_MODE_MEMTAG_ONCE y MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE en cada inicio.

Si el cargador de arranque admite fastboot oem mte, entonces, en los conjuntos, establece MISC_MEMTAG_MODE_{MEMTAG, MEMTAG_ONLY, MEMTAG_OFF} en (1, 0, 0) y, en los apagados, en (0, 0, 1), mientras conserva los demás parámetros.

Debes configurar tu producto para compilar el binario mtectrl para la compatibilidad con el espacio del usuario. Luego, configura la propiedad del sistema ro.arm64.memtag.bootctl_supported para indicarle al sistema que tu bootloader admite el mensaje memtag.

Interfaz de usuario

Cuando se establece la propiedad ro.arm64.memtag.bootctl_supported, un botón en el menú de Opciones para desarrolladores permite que el usuario reinicie el dispositivo una vez con MTE habilitada. El público objetivo son los desarrolladores de apps que desean probar sus apps con MTE. Captura de pantalla de la opción para desarrolladores de MTE.

Propiedad del sistema

Para un uso avanzado, la propiedad del sistema arm64.memtag.bootctl puede tomar una lista separada por comas de los siguientes valores:

  • memtag: Habilita de forma persistente la MTE del espacio del usuario (establece MISC_MEMTAG_MODE_MEMTAG).
  • memtag-once: Habilita el MTE del espacio del usuario una vez (establece MISC_MEMTAG_MODE_MEMTAG_ONCE).
  • memtag-kernel: Habilita el MTE en el espacio del kernel (establece MISC_MEMTAG_MODE_MEMTAG_KERNEL).
  • memtag-kernel-once: Habilita el MTE del espacio del kernel una vez. (MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE)
  • memtag-off: Inhabilita MTE (establece MISC_MEMTAG_MODE_MEMTAG_OFF)

El sistema debe reiniciarse para que se aplique el nuevo parámetro de configuración (ya que lo aplica el bootloader).