OWASP カテゴリ: MASVS-CODE: コード品質
概要
WebView は、Android アプリに埋め込まれたブラウザ コンポーネントで、アプリ内にウェブ コンテンツを表示します。アプリのユーザー インターフェース内で HTML、CSS、JavaScript をレンダリングします。
クロスアプリ スクリプティングは、被害者のアプリのコンテキストで悪意のあるコードを実行することと広く関連しています。このドキュメントでは、脆弱な WebView に悪意のある JavaScript コードを挿入することに限定して説明します。
アプリが十分な検証やサニタイズを行わずに悪意のある JavaScript を WebView に受け入れると、アプリはクロスアプリ スクリプティングに対して脆弱になります。
影響
攻撃者が制御する JavaScript コンテンツが検証やサニタイズを行わずに脆弱なアプリの WebView に渡されると、クロスアプリ スクリプティングの脆弱性が悪用される可能性があります。その結果、攻撃者が提供した JavaScript コードが被害者のアプリの WebView のコンテキストで実行されます。悪意のある JavaScript コードは、被害者のアプリと同じ権限を使用できるため、機密性の高いユーザーデータの盗難やアカウントの乗っ取りにつながる可能性があります。
リスクの軽減
JavaScript を無効にする
アプリで JavaScript が不要な場合は、無効にすることで脅威を防ぐことができます。
Kotlin
// Get the WebView Object
val webView = findViewById<WebView>(R.id.webView)
val webSettings = webView.settings
// Disable JavaScript
webSettings.javaScriptEnabled = false
Java
// Get the WebView Object
WebView webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
// Disable JavaScript for the WebView
webSettings.setJavaScriptEnabled(false);
アプリで JavaScript が必要な場合は、WebView に渡される JavaScript を所有または制御していることを確認してください。WebView が任意の JavaScript を実行しないようにしてください。次のセクションのガイダンスをご覧ください。
WebView に読み込まれるコンテンツが想定どおりのものだけであることを確認する
shouldOverrideUrlLoading()、loadUrl()、または
evaluateJavascript(), などのメソッドを使用する場合は、渡された URL が
チェックされていることを確認してください。前述のとおり、WebView に渡される JavaScript は想定されるドメインからのみ取得する必要があります。そのため、読み込まれる内容を確認することが重要です。
適切なアドバイスと例については、OWASP の入力検証に関するドキュメントと、WebView の Android セキュリティ チェックリストをご覧ください。
WebView の安全なファイル アクセス設定を行う
ファイルにアクセスできないようにすることで、WebView 内で任意の JavaScript が
実行されるのを防ぐことができます。ファイル アクセスを保護する際は、次の WebSettings を
考慮してください。
- ファイル アクセスを無効にします。デフォルトでは、
setAllowFileAccessはTrueに API レベル 29 以前では設定され、ローカル ファイルへのアクセスが許可されます。API レベル 30 以降では、デフォルトはFalseです。ファイル アクセスが許可されないようにするには、setAllowFileAccessを明示的にFalseに設定します。 コンテンツ アクセスを無効にします。
setAllowContentAccessのデフォルト設定はTrueです。コンテンツ URL アクセスを使用すると、WebView はシステムにインストールされているコンテンツ プロバイダからコンテンツを読み込むことができます。アプリでコンテンツ アクセスが不要な場合は、クロスアプリ スクリプティング攻撃が発生した場合の不正使用を防ぐため、setAllowContentAccessをFalseに設定します。kotlin
kotlin webView.settings.javaScriptEnabled = false webView.settings.domStorageEnabled = true webView.settings.allowFileAccess = false webView.settings.allowContentAccess = falsejava
java webView.getSettings().setJavaScriptEnabled(false); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setAllowFileAccess(false); webView.getSettings().setAllowContentAccess(false);
セーフ ブラウジングを有効にする
AndroidManifest.xml でセーフ ブラウジングを有効にすると、
WebView に渡された URL でフィッシング ドメインや悪意のあるドメインがスキャンされます。
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
リソース
- セーフ ブラウジングのドキュメント
- WebView デベロッパー リファレンス
- WebView デベロッパー リファレンスの WebSettings
- setAllowFileAccess デベロッパー ドキュメント
- setAllowContentAccess デベロッパー リファレンス