Categoria do OWASP: MASVS-CODE - Qualidade do código (link em inglês)
Visão geral
A implementação de HostnameVerifier
é responsável por verificar se o
nome do host no certificado do servidor corresponde ao do servidor a que o
cliente está tentando se conectar.
Uma implementação não segura do HostnameVerifier em um app Android não verifica corretamente o nome do host 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.
Essa vulnerabilidade existe porque a classe HostnameVerifier
tem chamadas de
função que podem pular a validação do nome do host do certificado X.509 e, em vez disso, verificar
apenas o hash do certificado. Um equívoco comum é achar que a
função SSLSession#isValid
executa
uma operação relacionada à segurança, quando, na realidade, o objetivo dela é apenas
verificar se uma sessão é válida e está disponível para
ser retomada ou para participar dela. Isso
não valida a segurança de uma sessão. A
classe HostnameVerifier foi substituída por NetworkSecurityConfig.
Impacto
Implementações não seguras do HostnameVerifier podem levar a vulnerabilidades que podem ser usadas para realizar ataques "man-in-the-middle" (MiTM) no tráfego de rede do aplicativo vítima. 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 o NetworkSecurityConfig.xml para garantir que todas as conexões de produção, teste, depuração e estágio de desenvolvimento sejam tratadas corretamente, em vez de usar ou implementar um código de validação de certificado TLS/SSL personalizado.
Recursos
- Documentação sobre a configuração de segurança de rede
- Essa verificação procura implementações de HostnameVerifier cujo método de verificação sempre retorna "true" (confiando em qualquer nome de host)
- Documentação do desenvolvedor para a classe HostnameVerifier
- Classe AllowAllHostnameVerifierDetector no Android