X.509 TrustManager 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 clase X509TrustManager
es responsable de verificar la autenticidad de un servidor remoto. Para ello, valida el certificado del servidor.
Una implementación no segura de X509TrustManager
de una aplicación para Android es aquella que no verifica correctamente la autenticidad del servidor con el que se comunica la aplicación. A raíz de esto, un atacante podría robar la identidad de un servidor legítimo y engañar a la aplicación para que le envíe datos sensibles.
La vulnerabilidad existe porque, si usas la clase X509TrustManager
, Java y Android permiten la anulación completa de la verificación del servidor. La clase X509TrustManager
tiene dos funciones de interés: checkServerTrusted()
y getAcceptedIssuers()
. Estas llamadas a funciones se pueden configurar para que confíen en todos los certificados X.509. La lógica de validación personalizada puede tener errores o estar incompleta y permitir conexiones inesperadas. En todos estos casos, se negó el propósito de la clase y la conexión de red establecida en función del resultado de X509TrustManager
no es segura.
Impacto
Es posible que las implementaciones de X509TrustManager
no seguras generen vulnerabilidades que pueden usarse para realizar ataques MitM (de intermediario) en el tráfico de red desde la aplicación 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. Si es necesario usar un certificado autofirmado para las compilaciones de prueba y depuración, considera usar NetworkSecurityConfig en lugar de implementar un X509TrustManager
personalizado.
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-15 (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-15 (UTC)"],[],[],null,["# Unsafe X509TrustManager\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 `X509TrustManager` class is responsible for verifying the authenticity of a\nremote server. It does this by validating the server's certificate.\n\nAn insecure `X509TrustManager` implementation in an Android application is an\nimplementation that does not properly verify the authenticity 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\nThe vulnerability exists because using the [`X509TrustManager`](/reference/javax/net/ssl/X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate%5B%5D,%20java.lang.String)) class,\nJava/Android allows the complete overriding of server verification. The\n`X509TrustManager` class has two functions of interest:\n[`checkServerTrusted()`](/reference/javax/net/ssl/X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate%5B%5D,%20java.lang.String)) and [`getAcceptedIssuers()`](/reference/javax/net/ssl/X509TrustManager#getAcceptedIssuers()). These function\ncalls can be configured to trust all X.509 certificates. Finally, custom\nvalidation logic may be buggy or incomplete and permit unexpected connections.\nIn all these cases, the purpose of the class has been negated and the network\nconnection established based on the `X509TrustManager` output is not secure.\n\nImpact\n------\n\nUnsafe X509TrustManager 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) functionality 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. If\nusing a self-signed certificate is needed for test and debug builds, consider\nusing NetworkSecurityConfig instead of implementing a custom `X509TrustManager`.\n\nResources\n---------\n\n- [Play Warning docs](https://support.google.com/faqs/answer/6346016)\n- [Documentation to assist configuring the Network security configuration xml file.](/training/articles/security-config)\n- [Developer documentation for the TrustManager class.](/reference/javax/net/ssl/TrustManager)\n- [This check looks for X.509TrustManager implementations whose checkServerTrusted or checkClientTrusted methods do nothing (thus trusting any certificate chain).](https://googlesamples.github.io/android-custom-lint-rules/checks/TrustAllX509TrustManager.md.html)\n- [This check looks for custom X.509TrustManager implementations.](https://googlesamples.github.io/android-custom-lint-rules/checks/CustomX509TrustManager.md.html)\n- \u003chttps://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\u003e"]]