安全でない X.509 TrustManager
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
OWASP カテゴリ: MASVS-CODE: コード品質
概要
X509TrustManager
クラスはリモート サーバーの真正性を検証するもので、サーバーの証明書を検証することにより、これを行います。
Android アプリに X509TrustManager
が安全に実装されていない場合、その実装ではアプリが通信しているサーバーの真正性は適切に検証されません。攻撃者はこの脆弱性を利用して、正規のサーバーになりすまし、アプリをだまして機密情報を送信させることができます。
この脆弱性が生じる原因は、X509TrustManager
クラスを使用すると、Java と Android でサーバー検証を完全にオーバーライドできることにあります。X509TrustManager
クラスには、checkServerTrusted()
および getAcceptedIssuers()
という 2 つの重要な関数があります。これらの関数呼び出しは、すべての X.509 証明書を信頼するように構成することが可能です。カスタム検証ロジックはバグがあるか不完全で、予期せぬ接続が許可される可能性があります。いずれの場合もこのクラス本来の目的を無効にしてしまい、X509TrustManager
の出力に基づいて確立されるネットワーク接続は安全なものではなくなります。
影響
安全でない X509TrustManager
の実装による脆弱性が悪用され、被害を受けるアプリからのネットワーク トラフィック上で MitM(中間者)攻撃が行われる可能性があります。安全でないコードの脆弱性が悪用された場合、そのコードがトリガーされると、ユーザーのアプリのネットワーク データがネットワーク攻撃者に(リモートまたはローカルで)侵害される可能性があります。その影響は、意図せず公開されてしまうネットワーク トラフィックの内容(個人情報、非公開情報、機密性の高いセッション値、サービス認証情報など)によって異なります。
リスクの軽減
NetworkSecurityConfig.xml 機能を使用することで、カスタムの TLS / SSL 証明書の検証コードを使用または実装することなく、あらゆる本番環境、テスト、デバッグ、開発の各ステージで接続を適切に処理できるようにします。テストビルドとデバッグビルドに自己署名証明書が必要な場合は、カスタム X509TrustManager
を実装せずに NetworkSecurityConfig の使用を検討してください。
参考資料
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2024-02-23 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2024-02-23 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"]]