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

HWAddressSanitizer

Hardware-assistida AddressSanitizer (Hwasan) é uma ferramenta de detecção de erro 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 você diretamente para o código responsável.

Você pode piscar pré-construídos imagens Hwasan para dispositivos pixel suportados a partir ci.android.com ( instruções de instalação detalhados ).

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%)

HWASan detecta o mesmo conjunto de bugs que ASan:

  • Estouro / estouro 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

Hwasan é baseado na marcação de memória abordagem, onde um pequeno valor tag aleatória está associada tanto com ponteiros e com 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 coincidir. Hwasan depende ARMv8 recurso superior byte ignorar (TBI), também chamado de endereço marcação virtual, para armazenar a tag ponteiro no mais alto dos bits do endereço.

Você pode ler mais sobre o projeto de 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.

Requisitos

O HWASan requer que o kernel do Linux aceite ponteiros marcados em argumentos de chamada do sistema. O suporte para isso foi implementado nos seguintes patchsets upstream:

Esses patches estão disponíveis como backports do comum Android do kernel no android-4.14 e galhos mais altos, mas não em Android ramos específicos 10, como android-4.14-q .

Apoio Userspace para Hwasan está disponível partida com Android 11.

Se você está construindo com um conjunto de ferramentas personalizada, certifique-se que ele inclui tudo até LLVM cometer 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

Para maior comodidade, você pode adicionar a configuração SANITIZE_TARGET a uma definição do produto, semelhante ao aosp_coral_hwasan .

Ao contrário do ASan, com o HWASan não há necessidade de construir duas vezes. Compilações incrementais apenas trabalho, não há especial piscar instruções ou limpando exigência, executáveis estáticos são suportados, e não há problema em pular sanitização de qualquer outra biblioteca que 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 sanitização de um módulo, o uso LOCAL_NOSANITIZE := hwaddress ou sanitize: { hwaddress: false } .

Os módulos individuais podem ser higienizado com Hwasan, com a ressalva de que libc é também Hwasan-acidificado. Isto pode ser feito através da adição de sanitize: { hwaddress: true } ao respectivo Android.bp definição de módulo. A plataforma Android inteiro é construído com Hwasan quando se utiliza um _hwasan compilação -suffixed (incluindo libc ), e como tal desinfecção manualmente libc não é necessário para Hwasan constrói.

Melhores rastreamentos de pilha

O HWASan usa um desenrolador rápido baseado em ponteiros de quadros 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ê precisa para relaxar através de código gerenciado, definir 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

Veja Simbolização na documentação Asan.

HWASan em aplicativos

Semelhante ao AddressSanitizer, o HWASan não pode ver o código Java, mas pode detectar bugs nas bibliotecas JNI. Ao contrário Asan, executando Hwasan aplicações em um dispositivo não-Hwasan não é suportada.

Em um dispositivo Hwasan, aplicativos pode ser verificado com Hwasan através da construção de seu código com SANITIZE_TARGET:=hwaddress em fazer, ou -fsanitize=hwaddress em bandeiras do compilador. Veja a documentação para desenvolvedores aplicativo para obter mais detalhes.