Webview Attacks

Support HackTricks

WebViewの設定とセキュリティに関するガイド

WebViewの脆弱性の概要

Android開発の重要な側面は、WebViewの正しい取り扱いです。このガイドでは、WebViewの使用に関連するリスクを軽減するための主要な設定とセキュリティプラクティスを強調します。

WebViewにおけるファイルアクセス

デフォルトでは、WebViewはファイルアクセスを許可します。この機能は、Android APIレベル3(Cupcake 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を使用し、同一オリジンポリシーに沿ってCORS管理を容易にします。

loadUrl

これは、webviewで任意のURLを読み込むために使用される一般的な関数です:

webview.loadUrl("<url here>")

Ofc、潜在的な攻撃者は、アプリケーションが読み込むURLを決して制御できるべきではありません。

JavaScriptとIntentスキームの処理

  • JavaScript: WebViewではデフォルトで無効になっており、setJavaScriptEnabled()を介して有効にできます。適切な保護策なしにJavaScriptを有効にすると、セキュリティの脆弱性を引き起こす可能性があるため、注意が必要です。

  • Intentスキーム: WebViewはintentスキームを処理でき、注意深く管理しないと脆弱性につながる可能性があります。ある脆弱性の例は、クロスサイトスクリプティング(XSS)攻撃を実行するために悪用される可能性のある、公開されたWebViewパラメータ「support_url」に関するものでした。

adbを使用した悪用の例:

adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"

Javascript Bridge

Androidには、JavaScriptがWebView内でネイティブAndroidアプリの機能を呼び出すことを可能にする機能が提供されています。これは、addJavascriptInterfaceメソッドを利用することで実現され、JavaScriptとネイティブAndroid機能を統合します。これは_ウェブビューJavaScriptブリッジ_と呼ばれます。このメソッドはWebView内のすべてのページが登録されたJavaScriptインターフェースオブジェクトにアクセスできるため、機密情報がこれらのインターフェースを通じて漏洩する場合、セキュリティリスクがあるため注意が必要です。

  • Androidバージョン4.2未満をターゲットとするアプリには、極めて注意が必要です。これは、悪意のあるJavaScriptを通じてリモートコード実行を可能にする脆弱性が存在するためです。

JavaScriptブリッジの実装

  • JavaScriptインターフェースはネイティブコードと相互作用でき、クラスメソッドがJavaScriptに公開される例で示されています:

@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • JavaScriptブリッジは、WebViewにインターフェースを追加することで有効になります:

webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
  • JavaScriptを通じた潜在的な悪用、例えばXSS攻撃を介して、公開されたJavaメソッドを呼び出すことが可能です:

<script>alert(javascriptBridge.getSecret());</script>
  • リスクを軽減するために、JavaScriptブリッジの使用を制限し、APKに同梱されたコードのみを許可し、リモートソースからのJavaScriptの読み込みを防ぎます。古いデバイスの場合、最小APIレベルを17に設定します。

リフレクションベースのリモートコード実行 (RCE)

  • 文書化された方法により、特定のペイロードを実行することでRCEを達成できます。ただし、@JavascriptInterfaceアノテーションは不正なメソッドアクセスを防ぎ、攻撃面を制限します。

リモートデバッグ

  • リモートデバッグChrome Developer Toolsを使用して可能で、WebViewコンテンツ内での相互作用や任意のJavaScript実行を可能にします。

リモートデバッグの有効化

  • アプリケーション内のすべてのWebViewに対してリモートデバッグを有効にするには:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • アプリケーションのデバッグ可能な状態に基づいてデバッグを条件付きで有効にするには:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

任意のファイルを抽出する

  • XMLHttpRequestを使用して任意のファイルの抽出を示します:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText);
}
}
xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db', true);
xhr.send(null);

参考文献

HackTricksをサポートする

Last updated