Webview Attacks
WebView構成とセキュリティのガイド
WebViewの脆弱性の概要
Android開発の重要な側面の1つは、WebViewsの適切な処理です。このガイドでは、WebViewの使用に関連するリスクを軽減するための主要な構成とセキュリティプラクティスを強調しています。
WebViewsでのファイルアクセス
デフォルトでは、WebViewsはファイルアクセスを許可します。この機能は、Android APIレベル3(カップケーキ1.5)以降で利用可能な setAllowFileAccess()
メソッドによって制御されます。android.permission.READ_EXTERNAL_STORAGE 権限を持つアプリケーションは、ファイルURLスキーム(file://path/to/file
)を使用して外部ストレージからファイルを読み取ることができます。
非推奨の機能: ファイルURLからのユニバーサルアクセスとファイルアクセス
ファイルURLからのユニバーサルアクセス: この非推奨の機能は、ファイルURLからのクロスオリジンリクエストを許可し、潜在的なXSS攻撃のための重大なセキュリティリスクを引き起こしました。Android Jelly Bean以降をターゲットにしたアプリのデフォルト設定は無効(
false
)です。この設定を確認するには、
getAllowUniversalAccessFromFileURLs()
を使用します。この設定を変更するには、
setAllowUniversalAccessFromFileURLs(boolean)
を使用します。ファイルURLからのファイルアクセス: この機能も非推奨で、他のファイルスキームURLからのコンテンツへのアクセスを制御しました。ユニバーサルアクセスと同様に、セキュリティ向上のためデフォルト設定は無効です。
チェックするには
getAllowFileAccessFromFileURLs()
を使用し、設定するにはsetAllowFileAccessFromFileURLs(boolean)
を使用します。
安全なファイルの読み込み
ファイルシステムへのアクセスを無効にしながらアセットとリソースにアクセスするために、setAllowFileAccess()
メソッドが使用されます。Android R以降では、デフォルト設定は false
です。
getAllowFileAccess()
で確認します。setAllowFileAccess(boolean)
で有効または無効にします。
WebViewAssetLoader
WebViewAssetLoader クラスは、ローカルファイルを読み込むための現代的なアプローチです。ローカルアセットとリソースにアクセスするためにhttp(s) URLを使用し、Same-Originポリシーに準拠しているため、CORS管理が容易になります。
loadUrl
これは、Webviewで任意のURLを読み込むために使用される一般的な関数です。
JavaScriptとIntentスキームの処理
JavaScript: WebViewではデフォルトで無効になっていますが、
setJavaScriptEnabled()
を介して有効にすることができます。適切な保護措置なしにJavaScriptを有効にすると、セキュリティの脆弱性が発生する可能性があるため、注意が必要です。Intentスキーム: WebViewは
intent
スキームを処理することができ、慎重に管理されていない場合には攻撃が発生する可能性があります。例として、公開されたWebViewパラメーター「support_url」を悪用してクロスサイトスクリプティング(XSS)攻撃を実行する可能性がある脆弱性がありました。
adbを使用した攻撃例:
Javascript Bridge
Androidが提供する機能により、WebView内のJavaScriptがネイティブAndroidアプリの機能を呼び出すことができます。これは、addJavascriptInterface
メソッドを利用して実現され、JavaScriptをネイティブAndroid機能と統合する_WebView JavaScriptブリッジ_と呼ばれます。このメソッドにより、WebView内のすべてのページが登録されたJavaScriptインターフェースオブジェクトにアクセスできるため、これらのインターフェースを介して機密情報が公開されるとセキュリティリスクが発生する可能性があるため、注意が必要です。
Androidバージョン4.2未満をターゲットにしたアプリでは、悪意のあるJavaScriptを介してリモートコード実行を許可する脆弱性があるため、極めて注意が必要です。
JavaScriptブリッジの実装
JavaScriptインターフェースは、ネイティブコードとやり取りできます。以下の例では、クラスメソッドがJavaScriptに公開されています:
JavaScript Bridgeは、WebViewにインターフェースを追加することで有効になります:
JavaScriptを介した潜在的な悪用は、たとえばXSS攻撃を介して、公開されたJavaメソッドの呼び出しを可能にします:
リスクを軽減するために、APK と一緒に配信されるコードに対してJavaScript ブリッジの使用を制限し、リモートソースからの JavaScript の読み込みを防止します。古いデバイス向けに、最小 API レベルを 17 に設定します。
反射ベースのリモートコード実行(RCE)
Reflection を使用して特定のペイロードを実行することで RCE を達成する方法が文書化されています。ただし、
@JavascriptInterface
アノテーションにより、未承認のメソッドアクセスが防止され、攻撃範囲が制限されます。
リモートデバッグ
Chrome 開発者ツールを使用してリモートデバッグが可能であり、WebView コンテンツ内での相互作用や任意の JavaScript 実行が可能です。
リモートデバッグの有効化
アプリケーション内のすべての WebView でリモートデバッグを有効にするには:
アプリケーションのデバッグ可能な状態に基づいてデバッグを条件付きで有効にするには:
任意のファイルの流出
XMLHttpRequestを使用して任意のファイルを流出させるデモ:
参考文献
Last updated