Suporte ao carregador de inicialização da MTE

O Android 13 apresenta uma ABI para que o espaço do usuário comunique o modo MTE solicitado ao carregador de inicialização. Isso pode ser usado para ativar a MTE em dispositivos que têm suporte de hardware, mas não são enviados com a MTE ativada por padrão, ou para desativar a MTE em dispositivos que são enviados com ela.

Suporte ao carregador de inicialização

Para oferecer suporte a essa ABI, o carregador de inicialização precisa ler o misc_memtag_message (definido em bootloader_message.h) da partição misc. Se um misc_memtag_message válido for encontrado (MISC_VIRTUAL_AB_MAGIC_HEADER corresponde e o número da versão é compatível), o carregador de inicialização vai calcular

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 é a configuração padrão de ativação/desativação da memtag para a SKU. Se memtag for verdadeiro, o carregador de inicialização vai configurar a reserva de tag do MTE, ativar as verificações de tag nos níveis de exceção mais baixos e comunicar a região reservada da tag ao kernel via DT. Se memtag for "false", o carregador de inicialização vai anexar arm64.nomte à linha de comando do kernel.

Se memtag_kernel for verdadeiro, o carregador de inicialização vai anexar kasan=on à linha de comando do kernel. Caso contrário, ele adiciona kasan=off.

O carregador de inicialização PRECISA limpar MISC_MEMTAG_MODE_MEMTAG_ONCE e MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE em todas as inicializações.

Se o carregador de inicialização for compatível com fastboot oem mte, ele definirá MISC_MEMTAG_MODE_{MEMTAG, MEMTAG_ONLY, MEMTAG_OFF} como (1, 0, 0) e (0, 0, 1), preservando as outras flags.

Configure o produto para criar o binário mtectrl para suporte ao espaço do usuário. Em seguida, defina a propriedade do sistema ro.arm64.memtag.bootctl_supported para indicar ao sistema que o carregador de inicialização é compatível com a mensagem memtag.

Interface do usuário

Quando a propriedade ro.arm64.memtag.bootctl_supported é definida, um botão no menu "Opções do desenvolvedor" permite que o usuário reinicialize uma vez com a MTE ativada. O público-alvo são desenvolvedores de apps que querem testar os apps com o MTE. Captura de tela da opção de desenvolvedor do MTE.

Propriedade do sistema

Para uso avançado, a propriedade do sistema arm64.memtag.bootctl pode receber uma lista separada por vírgulas dos seguintes valores:

  • memtag:ativação persistente do MTE no espaço do usuário (definir MISC_MEMTAG_MODE_MEMTAG)
  • memtag-once:ativa o MTE do espaço do usuário uma vez (define MISC_MEMTAG_MODE_MEMTAG_ONCE)
  • memtag-kernel:ativa o MTE no espaço do kernel (define MISC_MEMTAG_MODE_MEMTAG_KERNEL)
  • memtag-kernel-once:ativa a MTE no espaço do kernel uma vez (MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE)
  • memtag-off:desativa a MTE (define MISC_MEMTAG_MODE_MEMTAG_OFF)

O sistema precisa ser reinicializado para que a nova configuração entre em vigor, já que ela é aplicada pelo carregador de inicialização.