O MTE pode ser habilitado de forma independente no kernel do Android e em qualquer processo do sistema Android. O Google não exige nenhuma configuração específica e visa fornecer flexibilidade máxima aos fabricantes de dispositivos.
Este documento descreve as configurações e o escopo do MTE que, em nossa opinião, fornecem um bom equilíbrio entre segurança e custo para usuários do Android como mitigação de vulnerabilidade sempre ativa.
Núcleo
O MTE no kernel é configurado por meio da linha de comando. O padrão é LIGADO no modo de sincronização. Isso está sujeito a alterações futuras por vários motivos:
- Foi demonstrado que afeta significativamente o desempenho e precisa de trabalho de otimização.
- A qualidade do código do kernel é amplamente percebida como insuficiente para enviar o MTE no modo de aplicação (ou seja, pânico em caso de falha).
A recomendação atual é desabilitar o MTE do kernel em dispositivos de produção. Para fazer isso, adicione kasan=off
à linha de comando do kernel.
Espaço do usuário
O Google fornece uma lista padrão de binários de espaço de usuário a serem protegidos com MTE. A lista foi composta com informações do Android Security e inclui componentes que são privilegiados e/ou lidam com entradas não confiáveis. A lista atualizada de binários nativos recomendados com MTE pode ser encontrada no arquivo memtag-common.mk no sistema de compilação do Android. Além disso, vários aplicativos de sistema também estão incluídos: atualmente, Nfc, Bluetooth e SecureElement. Esses binários e aplicativos são habilitados no modo Assíncrono por padrão.
A recomendação atual é usar a lista de alvos padrão (não são necessárias alterações). Além disso, é recomendável avaliar as adições de BSP e OEM ao sistema principal e ativar o MTE naqueles que são sensíveis à segurança.
Formulários
Os três aplicativos de sistema listados acima são os únicos que usam MTE no momento. Para que um aplicativo de terceiros habilite o MTE, seu AndroidManifest.xml
precisaria especificar android:memtagMode
com um valor diferente de off
. Assim, conjuntos de benchmarks comuns como Geekbench ou AnTuTu não funcionam com MTE. Se o MTE do kernel também estiver desabilitado (veja kasan=off
acima), então espera-se que os benchmarks mostrem um impacto de desempenho muito limitado, se houver.
Quanto aos demais aplicativos, há desenvolvimento ativo de suporte MTE no Chrome. A versão atual do Chrome na Play Store inclui a configuração memtagMode=async
no manifesto. Também esperamos que vários aplicativos preocupados com a segurança no ecossistema Android (por exemplo, aplicativos bancários) façam o mesmo eventualmente. Por outro lado, esperamos que alguns aplicativos que exigem desempenho máximo da CPU, como jogos, optem por manter o MTE desativado.
Outros modos
As instruções acima usam apenas o modo MTE assíncrono em todos os lugares. Dependendo do hardware, outros modos podem ser quase ou exatamente tão rápidos. Eles também fornecem melhores diagnósticos e propriedades de mitigação de vulnerabilidade um pouco mais fortes.
Recomendamos testar uma ou duas outras configurações para ver se elas são boas o suficiente para seus requisitos de desempenho/energia. Os modos MTE podem ser definidos para cada núcleo da CPU no sistema gravando em /sys/devices/system/cpu/cpu*/mte_tcf_preferred
. Por exemplo, escrever sync
(ou asymm
) faria com que qualquer processo do espaço do usuário que solicitasse o modo Async fosse atualizado automaticamente e silenciosamente para Sync (ou Asymm) durante a execução nesse núcleo. Esta configuração pode ser feita em um arquivo .rc na inicialização do dispositivo.
Recomendamos medir uma ou duas outras configurações para verificar se elas atendem aos seus requisitos de desempenho e energia. Algumas configurações interessantes para explorar:
- Assimim em todos os núcleos.
- Assimim em núcleo(s) grande(s), Sincronize em outros núcleos.
Para verificar se um processo está solicitando o modo Async (com possível atualização automática), verifique se a linha a seguir inclui PR_MTE_TCF_SYNC e PR_MTE_TCF_ASYNC :
debuggerd| head -30 | grep tagged_addr
Infelizmente, não existe uma maneira fácil de ver o modo efetivo de um processo; mas qualquer processo que mostre ambos os valores listados acima está sujeito ao comportamento de atualização automática.