Suporte ao carregador de inicialização da MTE

O Android 13 apresenta uma ABI para o espaço do usuário para comunicar 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 a 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 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 pelo DT. Se memtag for falso, 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.

O carregador de inicialização PRECISA limpar MISC_MEMTAG_MODE_MEMTAG_ONCE e MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE em cada inicialização.

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 desativado como (0, 0, 1), preservando as outras flags.

Configure seu 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 oferece suporte à mensagem de memtag.

Interface do usuário

Quando a propriedade ro.arm64.memtag.bootctl_supported é definida, um botão no menu de opções do desenvolvedor permite que o usuário reinicie uma vez com a MTE ativada. O público-alvo é formado por desenvolvedores de apps que querem testar seus apps com a MTE. Captura de tela da opção para desenvolvedores 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:permite MTE no espaço do usuário de forma persistente (define MISC_MEMTAG_MODE_MEMTAG).
  • memtag-once:permite a MTE do espaço do usuário uma vez (definida como MISC_MEMTAG_MODE_MEMTAG_ONCE).
  • memtag-kernel:ativar a MTE no espaço do kernel (definir 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.