Limpador de endereços assistido por hardware

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

O AddressSanitizer assistido por hardware (HWASan) é um erro de memória de detecção semelhante à AddressSanitizer: HWASan usa muito menos RAM em comparação com o ASan, o que o torna adequado a sanitização do sistema inteiro. O HWASan só está disponível no Android 10 e superiores, e apenas em hardware AArch64.

Embora seja principalmente útil para código C/C++, o HWASan também pode ajudar a depurar código Java que causa falhas em C/C++ usado para implementar interfaces Java. Ela é útil porque capta a memória erros quando eles ocorrerem, direcionando você diretamente para o código responsável.

Atualize imagens HWASan pré-criadas para dispositivos Pixel com suporte de ci.android.com (link em inglês) (instruções detalhadas de configuração).

Em comparação com o ASan clássico, o HWASan tem:

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

O HWASan detecta o mesmo conjunto de bugs do ASan:

  • Overflow/underflow do buffer de heap e pilha
  • Uso de heap depois da liberação de memória
  • Uso de pilha fora do escopo
  • Double free/wild free

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

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

Detalhes e limitações da implementação

O HWASan é baseado na abordagem de inclusão de tags na memória, em que um pequeno valor de tag aleatório é associado a ponteiros e a intervalos de endereços de memória. Para uma recordação para ser válido, as tags de ponteiro e de memória devem ser correspondentes. O HWASan depende do recurso de ignorar bytes principais (TBI) do recurso ARMv8, também chamado de inclusão de tag de endereço virtual, para armazenar a tag do ponteiro no os bits mais altos do endereço.

Leia mais sobre o design do HWASan no site de documentação do Clang.

Por projeto, o HWASan não tem zonas vermelhas de tamanho limitado do ASan para a detecção de estouros ou a quarentena de capacidade limitada do ASan para para detectar o uso após a fase de lançamento. Por isso, o HWASan pode detectar um bug não importa o tamanho do estouro ou há quanto tempo a memória desalocado. 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 não encontrar nenhum bug durante uma execução do programa.

Requisitos

As versões recentes (4.14+) do suporte ao kernel comum do Android 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 a isso foi implementado nos seguintes conjuntos de patches upstream:

Se você estiver compilando com um conjunto de ferramentas personalizado, verifique se ele inclui tudo até a confirmação do LLVM c336557f.

Usar o HWASan

Use os seguintes comandos para criar toda a plataforma com o HWASan:

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

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

Grande parte da complexidade do build desapareceu para usuários familiarizados com o AddressSanitizer:

  • Não é necessário executar o make duas vezes.
  • Os builds incrementais funcionam imediatamente.
  • Não é necessário atualizar os dados do usuário.

Algumas restrições do AddressSanitizer também foram removidas:

  • Os executáveis estáticos são compatíveis.
  • Não há problema em pular a limpeza de qualquer destino que não seja libc. Ao contrário do ASan, há não há nenhuma exigência de que, se uma biblioteca for limpa, qualquer executável que a vincule também deverá ser.

Alternar entre o HWASan e imagens normais no mesmo número de build (ou superior) pode ser livremente. Não é necessário limpar o dispositivo.

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

Limpar destinos individuais

O HWASan pode ser ativado por destino em um build normal (não limpo), desde que libc.so também seja limpa. Adicione hwaddress: true ao bloco de limpeza em "libc_defaults". em bionic/libc/Android.bp. Em seguida, faça o mesmo no destino em que você está trabalhando.

A limpeza da libc permite marcar alocações de memória de heap em todo o sistema, bem como a verificação das tags em busca de operações de memória dentro do libc.so. Isso pode detectar bugs mesmo em binários em que o HWASan não estava ativado, se o acesso de memória inválido estiver em libc.so (por exemplo, pthread_mutex_unlock() em um mutex delete()ed).

Não é necessário mudar nenhum arquivo de build se toda a plataforma for criada usando o HWASan.

FlashStation

Para fins de desenvolvimento, é possível atualizar um build do AOSP com suporte a HWASan em um dispositivo Pixel com o carregador de inicialização desbloqueado usando a Flashstation. Selecione o destino _hwasan, por exemplo, aosp_flame_hwasan-userdebug. Consulte a Documentação do NDK para HWASan para desenvolvedores de apps para mais detalhes.

Stack traces melhores

O HWASan usa um unwinder rápido baseado em ponteiro de frame para registrar um stack trace para cada evento de alocação e desalocação de memória no programa. O Android ativa ponteiros de frame no código AArch64 por padrão. então isso funciona muito bem na prática. Se você precisar desfazer o código gerenciado, defina HWASAN_OPTIONS=fast_unwind_on_malloc=0 no ambiente do processo. Os rastros de pilha de acesso a memória incorretos usam o unwinder "lento" por padrão. Essa configuração afeta apenas rastros de alocação e desalocação. Essa opção pode ser muito Isso consome muita CPU, dependendo da carga.

Simbolização

Consulte Simbolização em "Noções básicas sobre os relatórios do HWASan".

HWASan em apps

Assim como o AddressSanitizer, o HWASan não consegue acessar o código Java, mas ele pode detectar bugs nas bibliotecas JNI. Até o Android 14, não era possível executar apps HWASan em um dispositivo que não fosse HWASan.

Em um dispositivo HWASan, os apps podem ser verificados com o HWASan criando o código com SANITIZE_TARGET:=hwaddress no Make ou -fsanitize=hwaddress nas flags do compilador. Em um dispositivo não HWASan com Android 14 ou mais recente, uma configuração de arquivo wrap.sh LD_HWASAN=1 precisa ser adicionado. Consulte a documentação do desenvolvedor de apps para mais detalhes.