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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
WebViewの設定とセキュリティに関するガイド
WebViewの脆弱性の概要
Android開発の重要な側面は、WebViewsの正しい取り扱いです。このガイドでは、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を読み込むために使用される一般的な関数です:
webview.loadUrl("<url here>")
もちろん、潜在的な攻撃者はアプリケーションが読み込む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 Bridgeは、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)
参考文献
- https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html
- https://github.com/authenticationfailure/WheresMyBrowser.Android
- https://developer.android.com/reference/android/webkit/WebView
- https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1
- https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。