Webview Attacks

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricks をサポートする他の方法:

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を読み込むために使用される一般的な関数です。

webview.loadUrl("<url here>")

JavaScriptとIntentスキームの処理

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

  • Intentスキーム: WebViewはintentスキームを処理することができ、慎重に管理されていない場合には攻撃が発生する可能性があります。例として、公開されたWebViewパラメーター「support_url」を悪用してクロスサイトスクリプティング(XSS)攻撃を実行する可能性がある脆弱性がありました。

adbを使用した攻撃例:

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

Javascript Bridge

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

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

JavaScriptブリッジの実装

  • JavaScriptインターフェースは、ネイティブコードとやり取りできます。以下の例では、クラスメソッドがJavaScriptに公開されています:

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

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

<script>alert(javascriptBridge.getSecret());</script>
  • リスクを軽減するために、APK と一緒に配信されるコードに対してJavaScript ブリッジの使用を制限し、リモートソースからの JavaScript の読み込みを防止します。古いデバイス向けに、最小 API レベルを 17 に設定します。

反射ベースのリモートコード実行(RCE)

  • Reflection を使用して特定のペイロードを実行することで RCE を達成する方法が文書化されています。ただし、@JavascriptInterface アノテーションにより、未承認のメソッドアクセスが防止され、攻撃範囲が制限されます。

リモートデバッグ

  • Chrome 開発者ツールを使用してリモートデバッグが可能であり、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);

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricks をサポートする他の方法:

Last updated