Categoria do OWASP: MASVS-CODE - Qualidade do código (link em inglês)
Visão geral
A classe X509TrustManager
é responsável por verificar a autenticidade de um
servidor remoto. Isso é feito validando o certificado do servidor.
Uma implementação insegura de X509TrustManager
em um app Android não
verifica corretamente a autenticidade do servidor
com que o aplicativo está se comunicando. Isso permite que um invasor
se passe por um servidor legítimo e induza o aplicativo a enviar dados
sensíveis para ele.
A vulnerabilidade existe porque o uso da classe X509TrustManager
,
Java/Android, permite a substituição completa da verificação do servidor. A
classe X509TrustManager
tem duas funções de interesse:
checkServerTrusted()
e getAcceptedIssuers()
. Essas chamadas de
função podem ser configuradas para confiar em todos os certificados X.509. Por fim, a lógica de validação personalizada pode ter bugs ou estar incompleta, além de permitir conexões inesperadas.
Em todos esses casos, a finalidade da classe foi negada e a conexão de rede
estabelecida com base na saída X509TrustManager
não é segura.
Impacto
Implementações não seguras do X509TrustManager podem levar a vulnerabilidades que podem ser usadas para realizar ataques man-in-the-middle (MitM) no tráfego de rede do aplicativo alvo. O impacto dessa exploração de código não seguro é que os dados da rede do aplicativo de um usuário podem ser comprometidos por invasores na rede (de forma remota ou local) caso esse código seja acionado. O impacto depende do conteúdo do tráfego de rede que está sendo exposto acidentalmente (PII, informações particulares, valores de sessões sensíveis, credenciais de serviço etc.).
Mitigações
Use a funcionalidade NetworkSecurityConfig.xml para garantir que todas as conexões de produção, teste, depuração e estágio de desenvolvimento sejam tratadas adequadamente, em vez de usar ou implementar um código de validação de certificado TLS/SSL personalizado. Se o uso de um certificado autoassinado for necessário para versões de teste e depuração, use NetworkSecurityConfig em vez de implementar um X509TrustManager
personalizado.
Recursos
- Documentação de alerta do Google Play
- Documentação para auxiliar na configuração do arquivo XML de configuração de segurança da rede
- Documentação do desenvolvedor para a classe TrustManager
- Essa verificação procura implementações de X.509TrustManager em que os métodos checkServerTrusted ou checkClientTrusted não fazem nada (confiando em qualquer cadeia de certificados).
- Essa verificação procura implementações personalizadas de X.509TrustManager.
- https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/X509TrustManagerDetector.java