TrustManager X.509 non sécurisé
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Catégorie OWASP : MASVS-CODE : qualité du code
Présentation
La classe X509TrustManager
est chargée de vérifier l'authenticité d'un serveur distant. Pour ce faire, elle valide le certificat du serveur.
Une implémentation X509TrustManager
non sécurisée dans une application Android est une implémentation qui ne vérifie pas correctement l'authenticité du serveur avec lequel l'application communique. Cela peut permettre à un pirate informatique d'usurper l'identité d'un serveur légitime et d'inciter l'application à envoyer des données sensibles au pirate.
La faille existe, car l'utilisation de la classe X509TrustManager
permet à Java et Android de remplacer complètement la validation du serveur. La classe X509TrustManager
comporte deux fonctions d'intérêt : checkServerTrusted()
et getAcceptedIssuers()
. Ces appels de fonction peuvent être configurés pour approuver tous les certificats X.509. La logique de validation personnalisée peut être erronée ou incomplète, et autoriser des connexions inattendues. Dans tous ces cas, l'objectif de la classe a été annulé et la connexion réseau établie sur la sortie X509TrustManager
n'est pas sécurisée.
Impact
Les implémentations X509TrustManager
non sécurisées peuvent entraîner des failles qui permettent de lancer des attaques MITM ("man in the middle") sur le trafic réseau à partir de l'application victime. Si vous exploitez ce code non sécurisé, les données réseau de l'application d'un utilisateur peuvent être compromises par des pirates informatiques (à distance ou localement) si ce code est déclenché. L'impact dépend du contenu du trafic réseau exposé par inadvertance (informations permettant d'identifier personnellement l'utilisateur, informations privées, valeurs de session sensibles, identifiants de service, etc.).
Stratégies d'atténuation
Utilisez la fonctionnalité NetworkSecurityConfig.xml pour vous assurer que toutes les connexions de production, de test, de débogage et de développement sont correctement gérées, au lieu d'utiliser ou d'implémenter un code de validation de certificat TLS/SSL personnalisé. Si un certificat autosigné est nécessaire pour les versions de test et de débogage, envisagez d'utiliser NetworkSecurityConfig au lieu d'implémenter un X509TrustManager
personnalisé.
Ressources
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2023/12/08 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2023/12/08 (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"]]