MASTG-TEST-0284 WebView での正しくない SSL エラー処理 (Incorrect SSL Error Handling in WebViews)
概要
このテストは、Android アプリが適切なバリデーションなしで onReceivedSslError(...)
メソッドをオーバーライドして、SSL/TLS 証明書エラーを無視する WebView を有しているかどうかを評価します。
onReceivedSslError(...)
メソッドは WebView
がページをロード時に SSL 証明書エラーに遭遇すると呼び出されます。デフォルトでは、WebView
は安全でない接続からユーザーを保護するためにリクエストをキャンセルします。このメソッドをオーバーライドして、適切なバリデーションなしで SslErrorHandler.proceed()
を呼び出すと、これらの保護を無効にします。
これは事実上 WebView
での SSL 証明書チェックをバイパスし、無効、期限切れ、または自己署名の証明書を使用した MITM 攻撃 にアプリをさらすことになります。
手順
アプリをリバースエンジニアします (Java コードの逆コンパイル (Decompiling Java Code))。
ソースコードを検査し、静的解析 (Android での静的解析 (Static Analysis on Android)) ツールを実行し、
onReceivedSslError(...)
のすべての使用箇所を探します。
結果
出力には SSL エラーを適切に処理する例外処理なしで proceed()
を含む onReceivedSslError(...)
が使用されている場所のリストを含みます。
評価
onReceivedSslError(...)
がオーバーライドされ、適切なバリデーションやユーザーの関与なしで証明書エラーが無視される場合、そのテストは不合格です。
これには以下のようなケースを含みます。
SSL エラーを無条件に受け入れること: エラーの性質をチェックせずに
proceed()
を呼び出します。プライマリエラーコードのみに依存すること: プライマリエラーが
SSL_UNTRUSTED
でない場合に処理を続行するといった意思決定にgetPrimaryError()
を使用すると、チェーン内の追加のエラーを見逃す可能性があります。例外をサイレントに抑制すること:
cancel()
を呼び出さずにonReceivedSslError(...)
で例外をキャッチすることで、接続をサイレントに継続できます。
公式の Android ガイダンス によると、アプリは SSL エラーに応答して proceed()
を呼び出すべきではありません。正しい動作は、潜在的に安全でない接続からユーザーを保護するために、リクエストをキャンセルすることです。また、ユーザーは SSL の問題を確実に評価できないため、ユーザープロンプトも推奨されません。
自動化ツールを使用してテストする場合、リバースエンジニアされたコードで報告されたすべての場所を検査して、正しくない実装を確認する必要があります (逆コンパイルされた Java コードのレビュー (Reviewing Decompiled Java Code))。
Last updated
Was this helpful?