Google is committed to advancing racial equity for Black communities. See how.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

HWAddressSanitizer

O AddressSanitizer assistido por hardware (HWASan) é uma ferramenta de detecção de erros de memória semelhante ao AddressSanitizer . O HWASan usa muito menos RAM em comparação com o ASan, o que o torna adequado para a higienização de todo o sistema. HWASan está disponível apenas no Android 10 e superior, e no hardware AArch64. Você pode fazer flash de imagens HWASan pré-construídas para dispositivos Pixel compatíveis em ci.android.com ( instruções de configuração detalhadas ).

Comparado ao ASan clássico, o HWASan tem:

  • Sobrecarga de CPU semelhante (~ 2x)
  • Sobrecarga de tamanho de código semelhante (40 - 50%)
  • Sobrecarga de RAM muito menor (10% - 35%)

O HWASan detecta o mesmo conjunto de bugs que o ASan:

  • Estouro / underflow de buffer de pilha e heap
  • Heap use after free
  • Uso da pilha fora do escopo
  • Double free / wild free

Além disso, o HWASan detecta o uso da pilha após o retorno.

Detalhes e limitações de implementação

O HWASan é baseado na abordagem de marcação de memória , em que um pequeno valor de etiqueta aleatório é associado a ponteiros e a intervalos de endereços de memória. Para que um acesso à memória seja válido, o ponteiro e os tags de memória devem corresponder. O HWASan depende do recurso de ignorar byte superior (TBI) do ARMv8, também chamado de marcação de endereço virtual , para armazenar a marcação do ponteiro nos bits mais altos do endereço.

Você pode ler mais sobre o design do HWASan no site de documentação do Clang.

Por design, o HWASan não tem redzones de tamanho limitado do ASan para detectar transbordamentos ou a quarentena de capacidade limitada do ASan para detectar o uso após a liberação. Por esse motivo, o HWASan pode detectar um bug independentemente do tamanho do estouro ou há quanto tempo a memória foi desalocada. Isso dá ao HWASan uma grande vantagem sobre o ASan.

No entanto, o HWASan tem um número limitado de valores de tag possíveis (256), o que significa que há uma probabilidade de 0,4% de perder algum bug durante uma execução do programa.

O HWASan requer que o kernel do Linux aceite ponteiros marcados em argumentos de chamada do sistema. O suporte está disponível em kernels pré-construídos para dispositivos Pixel 2, 3, 3a e 4 no Android 10 e ramos superiores, e em ramos de origem correspondentes no repositório de origem do kernel AOSP . Pixel 2, 3, 3a e 4 são conhecidos por trabalhar com um sistema completo construído com HWASan.

O suporte para dispositivos não Pixel está disponível no kernel Android comum no android-4.14 e branches superiores, mas não nos branches específicos do Android 10, como android-4.14-q . Você também precisa atualizar o conjunto de ferramentas LLVM para r370808 selecionando o novo conjunto de ferramentas em CL 1182220 e a alteração do sistema de construção correspondente em CL 1164431 .

Usando HWASan

Use os seguintes comandos para construir toda a plataforma usando HWASan:

lunch aosp_walleye-userdebug # (or any other product)
make SANITIZE_TARGET=hwaddress

Ao contrário do ASan, com o HWASan não há necessidade de construir duas vezes. Construções incrementais simplesmente funcionam, não há instruções especiais de flash ou requisito de limpeza, executáveis ​​estáticos são suportados e não há problema em pular a limpeza de qualquer biblioteca que não seja a libc . Também não há exigência de que, se uma biblioteca for higienizada, qualquer executável vinculado a ela também deve ser higienizado.

Para pular a higienização de um módulo, use LOCAL_NOSANITIZE := hwaddress ou sanitize: { hwaddress: false } .

Módulos individuais podem ser higienizados com HWASan, com a ressalva de que libc também é HWASan ified. Isso pode ser feito adicionando sanitize: { hwaddress: true } à respectiva definição do módulo Android.bp . Toda a plataforma Android é construída com HWASan ao usar uma _hwasan com _hwasan _hwasan (incluindo libc ) e, como tal, limpar manualmente a libc não é necessária para compilações HWASan.

Melhores rastreamentos de pilha

O HWASan usa um desenrolador rápido baseado em ponteiro de quadro para registrar um rastreamento de pilha para cada alocação de memória e evento de desalocação no programa. O Android habilita ponteiros de quadro no código AArch64 por padrão, então isso funciona muito bem na prática. Se você precisar desenrolar por meio do código gerenciado, defina HWASAN_OPTIONS=fast_unwind_on_malloc=0 no ambiente de processo. Observe que os rastreamentos de pilha de acesso incorreto à memória usam o desenrolador "lento" por padrão; essa configuração afeta apenas os rastreios de alocação e desalocação. Esta opção pode consumir muito a CPU, dependendo da carga.

Simbolização

Consulte Simbolização na documentação ASan.

HWASan em aplicativos

Semelhante ao AddressSanitizer, o HWASan não consegue ver o código Java, mas pode detectar bugs nas bibliotecas JNI. Ao contrário do ASan, a execução de aplicativos HWASan em um dispositivo não-HWASan não é compatível.

Em um dispositivo HWASan, os aplicativos podem ser verificados com o HWASan construindo seu código com SANITIZE_TARGET:=hwaddress no Make ou -fsanitize=hwaddress nos sinalizadores do compilador.