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

Scudo

Scudo é um alocador dinâmica do modo de utilizador de memória, ou alocador montão, concebido para ser resistente contra vulnerabilidades pilha-relacionados (como transbordamento baseado em pilha, tampão , após uso livre , e duplo livre ), mantendo o desempenho. Ele fornece as primitivas padrão de alocação C e desalocação (como malloc e livre), bem como os primitivos C ++ (como novo e excluir).

Scudo é mais uma mitigação do que um detector de erro de memória de pleno direito como AddressSanitizer (Asan) .

A partir da versão Android 11, o scudo é usado para todos os códigos nativos (exceto em dispositivos com pouca memória, onde jemalloc ainda é usado). Em tempo de execução, todas as alocações e desalocações de heap nativas são atendidas pelo Scudo para todos os executáveis ​​e suas dependências de biblioteca, e o processo é abortado se uma corrupção ou comportamento suspeito for detectado no heap.

Em Android 10, Scudo tinha de ser ativado em uma base per-binária, definindo o LOCAL_SANITIZE := scudo opção no arquivo .mk ou sanitize: { scudo: true, } no arquivo .bp.

Scudo é open source e parte do projeto de compilador-rt do LLVM. A documentação está disponível em https://llvm.org/docs/ScudoHardenedAllocator.html . Os navios de tempo de execução Scudo como parte do conjunto de ferramentas Android e foi adicionado suporte para Soong e fazer para permitir a fácil habilitação do alocador de binário.

Você pode habilitar ou desabilitar a mitigação extra dentro do alocador usando as opções descritas abaixo.

Costumização

Alguns parâmetros do alocador podem ser definidos por processo de várias maneiras:

  • Estaticamente: definir um __scudo_default_options funcionar no programa que retorna a seqüência de opções para ser analisado. Esta função deve ter o seguinte protótipo: extern "C" const char *__scudo_default_options() .
  • Dinamicamente: Use o ambiente variáveis SCUDO_OPTIONS contendo a cadeia de opções para ser analisado. As opções definidas desta forma substituir qualquer definição feita através __scudo_default_options .

As seguintes opções estão disponíveis.

Opção Padrão de 64 bits Padrão de 32 bits Descrição
QuarantineSizeKb 256 64 O tamanho (em KB) da quarentena usado para atrasar a desalocação real de blocos. Um valor mais baixo pode reduzir o uso de memória, mas diminuir a eficácia da mitigação; um valor negativo volta aos padrões. Definir tanto isso e ThreadLocalQuarantineSizeKb a zero desabilita a quarentena inteiramente.
QuarantineChunksUpToSize 2048 512 O tamanho (em bytes) até o qual os pedaços podem ser colocados em quarentena.
ThreadLocalQuarantineSizeKb 64 16 O tamanho (em KB) do cache por thread usado para descarregar a quarentena global. Um valor mais baixo pode reduzir o uso de memória, mas pode aumentar a contenção na quarentena global. Definir tanto isso e QuarantineSizeKb a zero desabilita a quarentena inteiramente.
DeallocationTypeMismatch false false Ativa o relatório de erros em malloc / delete, new / free, new / delete []
DeleteSizeMismatch true true Ativa o relatório de erros na incompatibilidade entre os tamanhos de novo e de exclusão.
ZeroContents false false Ativa o conteúdo do bloco zero na alocação e desalocação.
allocator_may_return_null false false Especifica que o alocador pode retornar nulo quando ocorrer um erro recuperável, em vez de encerrar o processo.
hard_rss_limit_mb 0 0 Quando o RSS do processo atinge esse limite, o processo é encerrado.
soft_rss_limit_mb 0 0 Quando RSS do processo atinge esse limite, novas alocações de falhar ou de retorno null (dependendo do valor de allocator_may_return_null ), até que o RSS vai de volta para baixo para permitir novas atribuições.
allocator_release_to_os_interval_ms N / D 5000 Afeta apenas um alocador de 64 bits. Se definido, tenta liberar a memória não utilizada para o sistema operacional, mas não com mais freqüência do que este intervalo (em milissegundos). Se o valor for negativo, a memória não é liberada para o SO.
abort_on_error true true Se definido, as chamadas ferramentas abort() em vez de _exit() depois de imprimir a mensagem de erro.

Validação

Atualmente, não há testes CTS específicos para Scudo. Em vez disso, certifique-se de que os testes CTS sejam aprovados com ou sem Scudo habilitado para um determinado binário para verificar se ele não afeta o dispositivo.

Solução de problemas

Se um problema irrecuperável for detectado, o alocador exibirá uma mensagem de erro para o descritor de erro padrão e, em seguida, encerrará o processo. Os rastreamentos de pilha que levam ao encerramento são adicionados ao log do sistema. A saída geralmente começa com Scudo ERROR: seguido por um breve resumo do problema junto com os ponteiros.

Aqui está uma lista das mensagens de erro atuais e suas possíveis causas:

  • corrupted chunk header : A verificação de checksum do cabeçalho pedaço falhou. Provavelmente, isso se deve a uma de duas coisas: o cabeçalho foi sobrescrito (parcial ou totalmente) ou o ponteiro passado para a função não é um pedaço.
  • race on chunk header : Dois tópicos diferentes estão a tentar manipular o mesmo cabeçalho, ao mesmo tempo. Isso geralmente é sintomático de uma condição de corrida ou falta geral de travamento ao realizar operações naquele bloco.
  • invalid chunk state : O pedaço não está no estado esperado para uma determinada operação, por exemplo, não é alocada ao tentar libertá-la, ou não está em quarentena ao tentar reciclá-lo. Um duplo grátis é o motivo típico para esse erro.
  • misaligned pointer : requisitos de alinhamento básicos são fortemente aplicada: 8 bytes em plataformas de 32 bits e 16 bytes em plataformas de 64-bit. Se um ponteiro passado para nossas funções não se encaixar neles, o ponteiro passado para uma das funções está desalinhado.
  • allocation type mismatch : Quando esta opção é ativada, uma função deallocation chamado em um pedaço tem que corresponder ao tipo de função que foi chamado para alocá-lo. Esse tipo de incompatibilidade pode apresentar problemas de segurança.
  • invalid sized delete : Quando o operador de exclusão de tamanho C ++ 14 é usado, ea verificação opcional estiver ativado, há uma incompatibilidade entre o tamanho que foi passado quando desalocá um pedaço e do tamanho que foi solicitado quando respectiva atribuição. Isto é tipicamente uma questão compilador ou um tipo de confusão sobre o objeto sendo desalocada.
  • RSS limit exhausted : O RSS máxima opcionalmente especificado foi excedido.

Se você está depurando uma falha no próprio sistema operacional, você pode usar uma construção Hwasan OS . Se você está depurando um acidente em um aplicativo, é possível usar um aplicativo de construção Hwasan também.