Bounds Sanitizer

BoundsSanitizer (BoundSan) adiciona instrumentação a binários para inserir verificações de limites em torno de acessos de array. Essas verificações são adicionadas se o compilador não puder provar em tempo de compilação que o acesso será seguro e se o tamanho do array for conhecido em tempo de execução, para que possa ser verificado. O Android 10 implanta o BoundSan em Bluetooth e codecs. O BoundSan é fornecido pelo compilador e é habilitado por padrão em vários componentes em toda a plataforma.

Implementação

O BoundSan usa o desinfetante de limites do UBSan . Essa mitigação é habilitada em um nível por módulo. Ele ajuda a manter os componentes críticos do Android seguros e não deve ser desativado.

Recomendamos que você habilite o BoundSan para componentes adicionais. Os candidatos ideais são código nativo privilegiado ou código nativo complexo que analisa a entrada do usuário não confiável. A sobrecarga de desempenho associada à ativação do BoundSan depende do número de acessos ao array que não podem ser comprovados como seguros. Espere uma pequena porcentagem de sobrecarga em média e teste se o desempenho é uma preocupação.

Habilitando o BoundSan em arquivos de blueprint

O BoundSan pode ser ativado em arquivos de blueprint adicionando "bounds" à propriedade de sanitização misc_undefined para módulos binários e de biblioteca:

sanitize: {
   misc_undefined: ["bounds"],
   diag: {
      misc_undefined: ["bounds"],
   },
   blacklist: "modulename_blacklist.txt",

diagnosticar

A propriedade diag habilita o modo de diagnóstico para os sanitizantes. Use o modo de diagnóstico apenas durante o teste. O modo de diagnóstico não aborta em estouros, o que nega a vantagem de segurança da mitigação e acarreta uma sobrecarga de desempenho mais alta, portanto, não é recomendado para compilações de produção.

lista negra

A propriedade blacklist permite a especificação de um arquivo de lista negra que os desenvolvedores podem usar para evitar que funções e arquivos de origem sejam higienizados. Use esta propriedade somente se o desempenho for uma preocupação e os arquivos/funções de destino contribuirem substancialmente. Audite manualmente esses arquivos/funções para garantir que os acessos ao array sejam seguros. Consulte Solução de problemas para obter detalhes adicionais.

Habilitando BoundSan em makefiles

BoundSan pode ser habilitado em makefiles adicionando "bounds" à variável LOCAL_SANITIZE para módulos binários e de biblioteca:

LOCAL_SANITIZE := bounds
# Optional features
LOCAL_SANITIZE_DIAG := bounds
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt

LOCAL_SANITIZE aceita uma lista de desinfetantes separados por vírgula.

LOCAL_SANITIZE_DIAG ativa o modo de diagnóstico. Use o modo de diagnóstico apenas durante o teste. O modo de diagnóstico não aborta em estouros, o que nega a vantagem de segurança da mitigação e acarreta uma sobrecarga de desempenho mais alta, portanto, não é recomendado para compilações de produção.

LOCAL_SANITIZE_BLACKLIST permite a especificação de um arquivo de lista negra que permite aos desenvolvedores impedir que funções e arquivos de origem sejam higienizados. Use esta propriedade somente se o desempenho for uma preocupação e os arquivos/funções de destino contribuirem substancialmente. Audite manualmente esses arquivos/funções para garantir que os acessos ao array sejam seguros. Consulte Solução de problemas para obter detalhes adicionais.

Desativando o BoundSan

Você pode desabilitar o BoundSan em funções e arquivos de origem com listas negras ou atributos de função. É melhor manter o BoundSan ativado, portanto, desative-o apenas se a função ou arquivo estiver criando uma grande sobrecarga de desempenho e a fonte tiver sido revisada manualmente.

Para obter mais informações sobre como desabilitar o BoundSan com atributos de função e formatação de arquivo de lista negra , consulte a documentação do Clang LLVM. Defina o escopo da lista negra para o desinfetante específico usando nomes de seção que especificam o desinfetante de destino para evitar afetar outros desinfetantes.

Validação

Não há teste CTS especificamente para BoundSan. Em vez disso, certifique-se de que os testes CTS sejam aprovados com ou sem o BoundSan ativado para verificar se ele não está afetando o dispositivo.

Solução de problemas

Teste completamente os componentes após habilitar o BoundSan para garantir que quaisquer acessos fora dos limites não detectados anteriormente sejam endereçados.

Os erros do BoundSan podem ser facilmente identificados, pois incluem a seguinte mensagem de interrupção da marca de exclusão:

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/foobar <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: out-of-bounds'

Ao executar no modo de diagnóstico, o arquivo de origem, o número da linha e o valor do índice são impressos no logcat . Por padrão, este modo não lança uma mensagem de aborto. Revise o logcat para verificar se há erros.

external/foo/bar.c:293:13: runtime error: index -1 out of bounds for type 'int [24]'