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]'