この情報は、クロスアプリ スクリプティングの脆弱性を持つアプリのデベロッパーを対象としています。
状況
デベロッパーが開発した 1 つまたは複数のアプリ内に WebView クロスアプリ スクリプティング問題が存在している場合、ユーザー Cookie などのデータが有害なアプリに盗まれる可能性があります。詳細については、Play Console の通知をご覧ください。Play Console に表示されている期限を過ぎてもセキュリティ脆弱性が修正されなかったアプリは、Google Play から削除される場合があります。
必要な対応
- Play Console にログインし、[アラート] セクションで該当するアプリや問題の解決期限を確認します。
- 該当のアプリを更新し、脆弱性を修正します。
- 対象アプリの更新バージョンを送信します。
新しいアプリやアップデートは、リクエストの審査が終わるまでの間、公開待ちステータスになります。アプリが適切に更新されていない場合は、引き続き警告が表示されます。
詳細情報
WebView で JavaScript が有効になっており、信頼できない Intent からデータを読み込む場合、有害なアプリによって、安全でない状況で JavaScript のコードが実行される可能性があります。以下のいずれかの方法でこの脆弱性への対応策を講じてください。
オプション 1: 影響を受けるアクティビティをエクスポートできないようにする
影響を受ける WebView を使用しているアクティビティをすべて見つけます。対象アクティビティが他のアプリからインテントを取得する必要がない場合は、マニフェスト内で対象アクティビティに対して android:exported=false を設定します。これにより、有害なアプリは、対象アクティビティ内の WebView に対して不正な入力を送信することができなくなります。
オプション 2: エクスポートされたアクティビティ内の WebView を保護する
影響を受ける WebView を使用したアクティビティをエクスポートしたい場合は、以下の変更を加えることをおすすめします。
- evaluateJavascript と loadUrl の呼び出しを保護する
evaluateJavascript には、常に信頼できるパラメータを渡す必要があります。evaluateJavascript を呼び出す際に、信頼できないインテントからの入力をサニタイズしないまま使用した場合、影響を受ける WebView 内で攻撃者が有害なスクリプトを実行できるようになります。同様に、loadUrl を呼び出す際に、javascript: スキーム URL を含む入力をサニタイズしないまま使用した場合、攻撃者が有害なスクリプトを実行できるようになります。
- 安全でないファイルの読み込みを防止する
影響を受ける WebView が Cookie データベースを読み込まないようにします。WebView が信頼できないインテントからサニタイズされていない file:// URL を読み込む場合、有害なアプリによって、次の 2 つの手順で攻撃を受ける可能性があります。1 つ目の手順: 悪意のあるウェブページが Cookie データベースに <script> タグを書き込む可能性があります。2 つ目の手順: 悪意のあるアプリが、WebView の Cookie データベースを指す file:// URL を含むインテントを送信した場合、または、悪意のあるウェブページ自体が WebView をファイル URL にリダイレクトした場合、上記の改変された Cookie データベース ファイルが読み込まれる可能性があります。Cookie データベースに格納されている悪意のある <script> が読み込まれて実行され、セッション情報が盗まれる可能性があります。
影響を受ける WebView が WebView の Cookie データベースを読み込まないようにするには、3 つの方法があります。
- すべてのファイル アクセスを無効にします。
- WebView で file:// URL のみが読み込まれることと、読み込まれる file:// URL が安全なファイルを指していることを確認します。なお、攻撃者は、URL パスのチェックを回避するために、シンボリック リンクを使用することがあります。そのような攻撃を防ぐには、単純に URL パスを確認するのではなく、信頼できない file:// URL の 正規パスを読み込み前に確認してください。
- http:// URL と file:// URL の両方を許可する場合は、WebViewClient で shouldOverrideUrlLoading と shouldInterceptRequest を使用して file:// URL の検証を実装します。これにより、loadUrl() 関数の呼び出しに直接提供される URL に限らず、WebView に読み込まれるすべての URL を検証できます。
お問い合わせ
この脆弱性に関して技術的な質問がある場合は、Stack Overflow に投稿してください。その際は、「android-security」タグを使用してください。この問題の解決手順に関して不明な点がある場合は、デベロッパー サポートチームにお問い合わせください。