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 sanitização do sistema inteiro. O HWASan só está disponível no Android 10 e superiores, e apenas em hardware AArch64.
Embora útil principalmente para código C/C++, o HWASan também pode ajudar a depurar código Java que causa falha 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 de implementação
O HWASan é baseado no memória de inclusão de tag, em que um pequeno valor de tag aleatório é associado com ponteiros e com 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.
Você pode ler 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 disponibilização. 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 perder algum 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 oferecem suporte ao HWASan.
A compatibilidade com o espaço do usuário para o 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 patchsets upstream:
- ABI de endereço com tag arm64
- arm64: remover a tag dos ponteiros do usuário transmitidos para o kernel
- mm: evite criar aliases de endereços virtuais em brk()/mmap()/mremap()
- arm64: validação de endereços com tags em access_ok() chamado pelas linhas de execução do kernel
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
Por conveniência, adicione a configuração SANITIZE_TARGET a uma definição de produto, semelhantes a aosp_coral_hwasan (link em inglês).
Grande parte da complexidade do build desapareceu para usuários familiarizados com o AddressSanitizer:
- Não é necessário executar o Make duas vezes.
- Builds incrementais funcionam imediatamente.
- Não é necessário atualizar os dados do usuário.
Algumas restrições do AddressSanitizer também foram removidas:
- Há suporte para executáveis estáticos.
- É possível 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 com o 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).
Limpe alvos 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. Depois, 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 identificar bugs mesmo em binários
em que o HWASan não foi ativado se o acesso inválido à memória estiver em libc.so
(por exemplo, pthread_mutex_unlock()
em um mutex com delete()
).
Não será necessário alterar nenhum arquivo de build se toda a plataforma for criada com o HWASan.
Estação de flash
Para fins de desenvolvimento, você pode atualizar um build do AOSP compatível com HWASan em um dispositivo Pixel com o carregador de inicialização desbloqueado usando o 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 frames para gravar uma pilha
para cada evento de alocação e desalocação de memória
neste programa. Por padrão, o Android ativa ponteiros de frame no código AArch64.
então isso funciona muito bem na prática. Se você precisa relaxar
código gerenciado, definir HWASAN_OPTIONS=fast_unwind_on_malloc=0
no ambiente de processo. A pilha de acesso à memória ruim
usam o rastro "lento" desbobinado por padrão. essa configuração só afeta
traces 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, executar o HWASan em dispositivos não compatíveis com HWASan não são compatíveis.
Em um dispositivo HWASan, os apps podem ser verificados com o HWASan criando o
código com SANITIZE_TARGET:=hwaddress
pol.
Make ou -fsanitize=hwaddress
em sinalizações 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.