安全でない HostnameVerifier
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
OWASP カテゴリ: MASVS-CODE: コード品質
概要
HostnameVerifier
の実装は、サーバーの証明書のホスト名がクライアントが接続しようとしているサーバーのホスト名と一致することを確認する役割を担います。
Android アプリでの安全でない HostnameVerifier
実装とは、アプリが通信しているサーバーのホスト名を適切に検証しない実装です。これにより、攻撃者は正規のサーバーになりすまし、アプリに誤認させてセンシティブ データを攻撃者に送信させることができます。
この脆弱性は、HostnameVerifier
クラスにある関数呼び出しで、X.509 証明書のホスト名の検証がスキップされ、代わりに証明書のハッシュのみが検証されることに起因します。SSLSession#isValid
関数はセキュリティ関連のオペレーションを行うとよく誤解されますが、実際の目的は、セッションが有効で再開や参加が可能かどうかを確認することであり、セッションのセキュリティは検証しません。HostnameVerifier
クラスは NetworkSecurityConfig に置き換えられています。
影響
安全でない HostnameVerifier
の実装により脆弱性が悪用され、被害を受けたアプリからネットワーク トラフィックへの中間者(MiTM)攻撃が行われるおそれがあります。この安全でないコードの悪用の影響として、コードがトリガーされた場合、ユーザーのアプリ ネットワーク データがネットワーク攻撃者(リモートまたはローカル)によって侵害される可能性があります。その影響は、意図せず公開されてしまうネットワーク トラフィックの内容(個人情報、非公開情報、機密性の高いセッション値、サービス認証情報など)によって異なります。
リスクの軽減
NetworkSecurityConfig.xml 機能を使用して、カスタムの TLS / SSL 証明書の検証コードを使用または実装せずに、すべての本番、テスト、デバッグ、開発の各ステージの接続が適切に処理されるようにします。
参考資料
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。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 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)"]]