HostnameVerifier no seguro
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
Categoría de OWASP: MASVS-CODE: Calidad de código
Descripción general
La implementación de HostnameVerifier
es responsable de verificar que el nombre de host que figura en el certificado del servidor coincida con el nombre de host del servidor al que el cliente intenta conectarse.
Una implementación no segura de HostnameVerifier
de una aplicación para Android es aquella que no verifica correctamente el nombre de host del servidor con el que se comunica la aplicación. A raíz de esto, un atacante podría suplantar la identidad de un servidor legítimo y engañar a la aplicación para que le envíe datos sensibles.
Esta vulnerabilidad existe porque la clase HostnameVerifier
tiene llamadas a función que pueden omitir la validación del nombre de host del certificado X.509 y, en su lugar, solo verificar el hash del certificado. Un error común es pensar que la función SSLSession#isValid
realiza una operación relacionada con la seguridad, cuando, en realidad, solo sirve para comprobar si una sesión es válida y está disponible para reanudarse o para unirse a ella, lo cual no valida seguridad de una sesión. La clase HostnameVerifier
se reemplazó por NetworkSecurityConfig.
Impacto
Es posible que las implementaciones de HostnameVerifier
no seguras generen vulnerabilidades que pueden usarse para realizar ataques MiTM (de intermediario) en el tráfico de red desde la aplicación de la víctima. El impacto de aprovecharse de este código no seguro es que los atacantes podrían vulnerar (de forma remota o local) los datos de red de la aplicación de un usuario si se activa el código. El impacto depende del contenido de tráfico de red que se expone de forma involuntaria (PII, información privada, valores de sesión sensibles, credenciales de servicio, etcétera).
Mitigaciones
Usa la funcionalidad NetworkSecurityConfig.xml para asegurarte de que todas las conexiones de producción, prueba, depuración y etapa de desarrollo se administren correctamente, en lugar de usar o implementar código personalizado de validación de certificados TLS/SSL.
Recursos
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2023-12-14 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2023-12-14 (UTC)"],[],[],null,["# Unsafe HostnameVerifier\n\n\u003cbr /\u003e\n\n**OWASP category:** [MASVS-CODE: Code Quality](https://mas.owasp.org/MASVS/10-MASVS-CODE)\n\nOverview\n--------\n\nThe [`HostnameVerifier`](/reference/javax/net/ssl/HostnameVerifier#verify(java.lang.String,%20javax.net.ssl.SSLSession)) implementation is responsible for verifying that the\nhostname in the server's certificate matches the hostname of the server that the\nclient is trying to connect to.\n\nAn unsafe HostnameVerifier implementation in an Android application is an\nimplementation that does not properly verify the hostname of the server with\nwhich the application is communicating. This can allow an attacker to\nimpersonate a legitimate server and trick the application into sending sensitive\ndata to the attacker.\n\nThis vulnerability exists because the `HostnameVerifier` class has function\ncalls that can skip X.509 certificate hostname validation and, instead, only\nverify the hash of the certificate. A common misconception is that the\n[`SSLSession#isValid`](/reference/javax/net/ssl/SSLSession#isValid()) function performs a security-related operation, when\nin reality its purpose is only to check if a session is valid and available for\nresuming or joining; neither of which validate the *security* of a session. The\nHostnameVerifier class has been superseded by [NetworkSecurityConfig](/training/articles/security-config).\n\nImpact\n------\n\nUnsafe HostnameVerifier implementations can lead to vulnerabilities which can be\nused to perform MiTM (Man-in-The-Middle) attacks on network traffic from the\nvictim application. The impact of exploiting this insecure code is that a user's\napplication network data can be compromised by network attackers (remotely or\nlocally) if this code is triggered. The impact is dependent on the content of\nthe network traffic being inadvertently exposed (PII, private information,\nsensitive session values, service credentials, etc).\n\nMitigations\n-----------\n\nUse the [NetworkSecurityConfig.xml](/training/articles/security-config) to ensure that all\nproduction, testing, debugging, and dev stage connections are properly handled\nrather than using or implementing custom TLS/SSL certificate validation code.\n\nResources\n---------\n\n- [Network Security Configuration Documentation](/training/articles/security-config)\n- [This check looks for implementations of HostnameVerifier whose verify method always returns true (thus trusting any hostname)](https://googlesamples.github.io/android-custom-lint-rules/checks/BadHostnameVerifier.md.html)\n- [Developer documentation for the HostnameVerifier class](/reference/javax/net/ssl/HostnameVerifier#verify(java.lang.String,%20javax.net.ssl.SSLSession))\n- [AllowAllHostnameVerifierDetector class in Android](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/AllowAllHostnameVerifierDetector.java)"]]