安全でない 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 の使用を検討してください。

参考資料