O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Ponteiros marcados

A partir do Android 11, para processos de 64 bits, todas as alocações de heap têm uma tag definida pela implementação definida no byte superior do ponteiro em dispositivos com suporte de kernel para ARM Top-byte Ignore (TBI). Qualquer aplicativo que modifica esta tag é encerrado quando a tag é verificada durante a desalocação. Isso é necessário para o futuro hardware com ARM Memória Tagging Extensão apoio (MTE).

Ignorar o byte superior

O recurso de ignorar byte superior do ARM está disponível para código de 64 bits em todo o hardware Armv8 AArch64. Este recurso significa que o hardware ignora o byte superior de um ponteiro ao acessar a memória.

TCE exige umnúcleo compatível que maneja com etiquetas ponteiros passado de espaço do usuário. Android Núcleo Comum a partir de 4,14 (Pixel 4) e apresentam maior as necessárias correções de TCE .

Dispositivos com o suporte TBI no kernel são detectados dinamicamente no tempo de início do processo e uma tag dependente da implementação é inserida no byte superior do ponteiro para todas as alocações de heap. Depois disso, uma verificação é executada para garantir que a tag não tenha sido truncada ao desalocar a memória.

Prontidão da extensão de marcação de memória

A Memory Tagging Extension (MTE) da ARM ajuda a resolver problemas de segurança de memória. MTE funciona por marcação os bits de endereço 56th-59 de cada alocação de memória na pilha, montão, e globals. O hardware e o conjunto de instruções verificam automaticamente se o tag correto é usado em cada acesso à memória.

Aplicativos do Android que incorretamente armazenam informações no top byte do ponteiro são garantidos para quebrar em um dispositivo habilitado para MTE. Ponteiros marcados tornam mais fácil detectar e rejeitar usos incorretos do byte superior do ponteiro antes que os dispositivos MTE estejam disponíveis.

Suporte ao desenvolvedor

Se seu aplicativo travou e este link foi solicitado a você, isso pode significar um dos seguintes:

  1. O aplicativo tentou liberar um ponteiro que não foi alocado pelo alocador de heap do sistema.
  2. Algo em seu aplicativo modificou o byte superior de um ponteiro. O byte superior do ponteiro não pode ser modificado e seu código precisa ser alterado para corrigir esse problema.

Exemplos do ponteiro de byte superior sendo usado ou modificado incorretamente.

  • Os ponteiros para um tipo específico têm metadados específicos do aplicativo armazenados nos 16 bits de endereço principais.
  • Um ponteiro convertido para o dobro e depois para trás, perdendo os bits de endereço inferiores.
  • Código que calcula a diferença entre os endereços de variáveis ​​locais de diferentes estruturas de pilha como uma forma de medir a profundidade de recursão.

Alguns aplicativos podem depender de bibliotecas que se comportam incorretamente quando o byte superior do ponteiro é definido. Reconhecemos que pode não ser trivial consertar esses problemas subjacentes nas bibliotecas rapidamente. Como tal, as aplicações que utilizam targetSdkLevel < 30 não terá ponteiro marcação ativada por padrão. Nós também fornecemos uma escotilha de escape para aplicações feitas com targetSdkLevel >= 30 para facilitar o período de transição.

A escotilha de escape é utilizada, adicionando o seguinte ao seu AndroidManifest.xml arquivo:

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

Isso desativará o recurso de marcação de ponteiro para seu aplicativo. Por favor note que este não aborda o problema de saúde de código subjacente. Este portal de escape vai desaparecer em futuras versões do Android, porque as questões desta natureza será incompatível com MTE .