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

Memória somente de execução (XOM) para binários AArch64

As seções de código executáveis ​​para binários do sistema AArch64 são, por padrão, marcadas como somente execução (não legível) como uma atenuação de proteção contra ataques de reutilização de código just-in-time. O código que mistura dados e código e o código que inspeciona propositadamente essas seções (sem primeiro remapear os segmentos de memória como legíveis) não funcionam mais. Aplicativos com um SDK de destino de 10 (API de nível 29 ou superior) são afetados se o aplicativo tentar ler seções de código de bibliotecas de sistema habilitadas para memória somente para execução (XOM) sem primeiro marcar a seção como legível.

Para se beneficiar totalmente dessa atenuação, é necessário suporte de hardware e kernel. Sem esse suporte, a mitigação pode ser apenas parcialmente aplicada. O Android 4.9 do kernel comum contém os patches apropriados para fornecer suporte completo para este em dispositivos ARMv8.2.

Implementação

Os binários AArch64 gerados pelo compilador assumem que o código e os dados não estão misturados. Ativar esse recurso não afeta negativamente o desempenho do dispositivo.

Para código que tem que executar introspecção memória intencional em seus segmentos executáveis, é aconselhável chamar mprotect nos segmentos de código exigindo inspeção, que lhes permitam ser legível, em seguida, retire a legibilidade quando a inspeção está completa.
Esta implementação causas lê em segmentos de memória marcadas como executar somente para resultar em uma falha de segmentação ( SEGFAULT ). Isso pode ocorrer como resultado de um bug, vulnerabilidade, dados misturados com código (literal pooling) ou introspecção intencional de memória.

Suporte e impacto do dispositivo

Dispositivos com hardware anterior ou kernels anteriores (inferiores a 4.9) sem os patches necessários podem não oferecer suporte completo ou se beneficiar deste recurso. Dispositivos sem suporte do kernel pode não valer acessos de usuários de executar-only memory, o código no entanto kernel que explicitamente verifica se uma página é legível pode ainda impor esta propriedade, como process_vm_readv() .

A bandeira do kernel CONFIG_ARM64_UAO deve ser definido no kernel para garantir que os aspectos do kernel userland páginas marcadas executar-only. Dispositivos ARMv8 anteriores, ou dispositivos ARMv8.2 com User Access Override (UAO) desabilitado, podem não se beneficiar totalmente com isso e ainda podem ser capazes de ler páginas somente para execução usando syscalls.

Refatorando código existente

O código que foi transferido de AArch32 pode conter dados e código misturados, causando o surgimento de problemas. Em muitos casos, a fixação desses problemas é tão simples como mover as constantes a um .data seção no arquivo de montagem.

Pode ser necessário refatorar a montagem manuscrita para separar constantes agrupadas localmente.

Exemplos:

Os binários gerados pelo compilador Clang não devem ter problemas com os dados sendo misturados no código. Se o código gerado da coleção do compilador GNU (GCC) for incluído (de uma biblioteca estática), inspecione o binário de saída para garantir que as constantes não foram agrupadas nas seções do código.

Se a introspecção código é necessário em seções de código executável, primeira chamada mprotect para marcar o legível código. Em seguida, após a operação estiver concluída, ligue mprotect novamente para marcá-lo ilegível.

Possibilitando

Somente execução é habilitado por padrão para todos os binários de 64 bits no sistema de compilação.

Desativando

Você pode desabilitar apenas a execução em um nível de módulo, por uma árvore de subdiretório inteira ou globalmente para uma compilação inteira.

XOM pode ser desativado para os módulos individuais que não podem ser reformulado, ou necessidade de ler o seu código executável, definindo os LOCAL_XOM e xom variáveis para false .

// Android.mk
LOCAL_XOM := false

// Android.bp
cc_binary { // or other module types
   ...
   xom: false,
}

Se a memória somente para execução estiver desativada em uma biblioteca estática, o sistema de construção aplicará isso a todos os módulos dependentes dessa biblioteca estática. Você pode substituir isso usando xom: true, .

Para desativar a memória executar somente em um subdiretório particular (por exemplo, foo / bar /), passar o valor para XOM_EXCLUDE_PATHS .

make -j XOM_EXCLUDE_PATHS=foo/bar

Alternativamente, você pode definir o PRODUCT_XOM_EXCLUDE_PATHS variável em sua configuração do produto.

Você pode desativar executar somente binários globalmente, passando ENABLE_XOM=false ao seu make comando.

make -j ENABLE_XOM=false

Validação

Não há CTS ou testes de verificação disponíveis para memória somente de execução. Você pode verificar manualmente binários usando readelf e verificando as bandeiras segmento.