HWAdressSanitizer

Consulte Noções básicas sobre relatórios HWASan para obter informações sobre como ler falhas do HWASan!

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 apenas no hardware AArch64.

Embora seja útil principalmente para código C/C++, o HWASan também pode ajudar a depurar código Java que causa travamentos em C/C++ usado para implementar interfaces Java. É útil porque detecta erros de memória quando eles acontecem, apontando diretamente para o código responsável.

Você pode atualizar imagens HWASan pré-construídas para dispositivos Pixel compatíveis em ci.android.com ( instruções detalhadas de configuração ).

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 depois de grátis
  • Uso de pilha fora do escopo
  • Duplo grátis/selvagem grátis

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

HWASan (igual ao ASan) é compatível com UBSan , ambos podem ser habilitados em um alvo ao mesmo tempo.

Detalhes e limitações de implementação

HWASan é baseado na abordagem de marcação de memória , onde um pequeno valor de tag aleatório é associado tanto a ponteiros quanto a intervalos de endereços de memória. Para que um acesso à memória seja válido, o ponteiro e as tags de memória devem corresponder. HWASan depende do recurso top byte ignore (TBI) do ARMv8, também chamado de marcação de endereço virtual , para armazenar a tag 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 possui zonas vermelhas de tamanho limitado do ASan para detectar estouros ou 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 overflow ou há quanto tempo a memória foi desalocada. Isso dá ao HWASan uma grande vantagem sobre o ASan.

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

Requisitos

Versões recentes (4.14+) do kernel Android comum suportam HWASan pronto para uso. As ramificações específicas do Android 10 não têm suporte para HWASan.

O suporte do espaço do usuário para HWASan está disponível a partir do Android 11 .

Se você estiver trabalhando com um kernel diferente, o HWASan exige que o kernel do Linux aceite ponteiros marcados em argumentos de chamada do sistema. O suporte para isso foi implementado nos seguintes conjuntos de patches upstream:

Se você estiver construindo com um conjunto de ferramentas customizado, certifique-se de que ele inclua tudo até o commit do LLVM c336557f .

Usando HWASan

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

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

Por conveniência, você pode adicionar a configuração SANITIZE_TARGET a uma definição de produto, semelhante a aosp_coral_hwasan .

Para usuários familiarizados com o AddressSanitizer, muita complexidade de construção desapareceu:

  • Não há necessidade de executar make duas vezes.
  • Construções incrementais funcionam imediatamente.
  • Não há necessidade de atualizar os dados do usuário.

Algumas restrições do AddressSanitizer também desapareceram:

  • Executáveis ​​estáticos são suportados.
  • Não há problema em pular a higienização de qualquer alvo que não seja libc. Ao contrário do ASan, não há exigência de que, se uma biblioteca for higienizada, qualquer executável que a vincule também o seja.

A alternância entre HWASan e imagens regulares com o mesmo número de compilação (ou superior) pode ser feita livremente. Não é necessário limpar o dispositivo.

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

Higienizando alvos individuais

O HWASan pode ser habilitado por destino em uma compilação regular (não higienizada), desde que libc.so também seja higienizado. Adicione hwaddress: true ao bloco sanitize em "libc_defaults" em bionic/libc/Android.bp. Em seguida, faça o mesmo no alvo em que você está trabalhando.

Observe que a limpeza da libc permite a marcação de alocações de memória heap em todo o sistema, bem como a verificação das tags para operações de memória dentro de libc.so . Isso pode detectar bugs mesmo em binários nos quais o HWASan não foi habilitado se o acesso incorreto à memória estiver em libc.so (ex. pthread_mutex_unlock() em um delete() ed mutex).

Não é necessário alterar nenhum arquivo de construção se toda a plataforma for construída usando HWASan.

Estação Flash

Para fins de desenvolvimento, você pode atualizar uma versão AOSP habilitada para HWASan em um dispositivo Pixel com bootloader desbloqueado usando Flashstation . Selecione o destino _hwasan, por exemplo, aosp_flame_hwasan-userdebug. Consulte a documentação do NDK para HWASan para desenvolvedores de aplicativos para obter mais detalhes.

Melhores rastreamentos de pilha

HWASan usa um desenrolador rápido baseado em ponteiro de quadro para registrar um rastreamento de pilha para cada evento de alocação e desalocação de memória 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 relaxar por meio do código gerenciado, configure HWASAN_OPTIONS=fast_unwind_on_malloc=0 no ambiente do processo. Observe que os rastreamentos de pilha de acesso à memória incorretos usam o desenrolador "lento" por padrão; essa configuração afeta apenas rastreamentos de alocação e desalocação. Esta opção pode consumir muito a CPU, dependendo da carga.

Simbolização

Consulte Simbolização em "Compreendendo os relatórios HWASan".

HWASan em aplicativos

Semelhante ao AddressSanitizer, o HWASan não consegue ver o código Java, mas pode detectar bugs nas bibliotecas JNI. Até o Android 14, a execução de aplicativos HWASan em um dispositivo não HWASan não era compatível.

Em um dispositivo HWASan, os aplicativos podem ser verificados com HWASan construindo seu código com SANITIZE_TARGET:=hwaddress no Make ou -fsanitize=hwaddress nos sinalizadores do compilador. Em um dispositivo não HWASan (executando Android 14 ou mais recente), uma configuração de arquivo wrap.sh LD_HWASAN=1 deve ser adicionada. Consulte a documentação do desenvolvedor de aplicativos para obter mais detalhes.