Webview Attacks
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Android開発の重要な側面は、WebViewの正しい取り扱いです。このガイドでは、WebViewの使用に関連するリスクを軽減するための主要な設定とセキュリティプラクティスを強調します。
デフォルトでは、WebViewはファイルアクセスを許可します。この機能は、Android APIレベル3(Cupcake 1.5)以降で利用可能なsetAllowFileAccess()
メソッドによって制御されます。android.permission.READ_EXTERNAL_STORAGE権限を持つアプリケーションは、ファイルURLスキーム(file://path/to/file
)を使用して外部ストレージからファイルを読み取ることができます。
ファイルURLからのユニバーサルアクセス:この非推奨機能は、ファイルURLからのクロスオリジンリクエストを許可し、潜在的なXSS攻撃による重大なセキュリティリスクをもたらしました。デフォルト設定は、Android Jelly Bean以降を対象とするアプリでは無効(false
)です。
この設定を確認するには、getAllowUniversalAccessFromFileURLs()
を使用します。
この設定を変更するには、setAllowUniversalAccessFromFileURLs(boolean)
を使用します。
ファイルURLからのファイルアクセス:この機能も非推奨で、他のファイルスキームURLからのコンテンツへのアクセスを制御しました。ユニバーサルアクセスと同様に、デフォルトはセキュリティ向上のために無効です。
getAllowFileAccessFromFileURLs()
を使用して確認し、setAllowFileAccessFromFileURLs(boolean)
を使用して設定します。
アセットやリソースにアクセスしながらファイルシステムアクセスを無効にするには、setAllowFileAccess()
メソッドを使用します。Android R以降では、デフォルト設定はfalse
です。
getAllowFileAccess()
で確認します。
setAllowFileAccess(boolean)
で有効または無効にします。
WebViewAssetLoaderクラスは、ローカルファイルを読み込むための現代的なアプローチです。これは、ローカルアセットやリソースにアクセスするためにhttp(s) URLを使用し、同一オリジンポリシーに沿ってCORS管理を容易にします。
これは、webviewで任意のURLを読み込むために使用される一般的な関数です:
Ofc、潜在的な攻撃者は、アプリケーションが読み込むURLを決して制御できるべきではありません。
JavaScript: WebViewではデフォルトで無効になっており、setJavaScriptEnabled()
を介して有効にできます。適切な保護策なしにJavaScriptを有効にすると、セキュリティの脆弱性を引き起こす可能性があるため、注意が必要です。
Intentスキーム: WebViewはintent
スキームを処理でき、注意深く管理しないと脆弱性につながる可能性があります。ある脆弱性の例は、クロスサイトスクリプティング(XSS)攻撃を実行するために悪用される可能性のある、公開されたWebViewパラメータ「support_url」に関するものでした。
adbを使用した悪用の例:
Androidには、JavaScriptがWebView内でネイティブAndroidアプリの機能を呼び出すことを可能にする機能が提供されています。これは、addJavascriptInterface
メソッドを利用することで実現され、JavaScriptとネイティブAndroid機能を統合します。これは_ウェブビューJavaScriptブリッジ_と呼ばれます。このメソッドはWebView内のすべてのページが登録されたJavaScriptインターフェースオブジェクトにアクセスできるため、機密情報がこれらのインターフェースを通じて漏洩する場合、セキュリティリスクがあるため注意が必要です。
Androidバージョン4.2未満をターゲットとするアプリには、極めて注意が必要です。これは、悪意のあるJavaScriptを通じてリモートコード実行を可能にする脆弱性が存在するためです。
JavaScriptインターフェースはネイティブコードと相互作用でき、クラスメソッドがJavaScriptに公開される例で示されています:
JavaScriptブリッジは、WebViewにインターフェースを追加することで有効になります:
JavaScriptを通じた潜在的な悪用、例えばXSS攻撃を介して、公開されたJavaメソッドを呼び出すことが可能です:
リスクを軽減するために、JavaScriptブリッジの使用を制限し、APKに同梱されたコードのみを許可し、リモートソースからのJavaScriptの読み込みを防ぎます。古いデバイスの場合、最小APIレベルを17に設定します。
文書化された方法により、特定のペイロードを実行することでRCEを達成できます。ただし、@JavascriptInterface
アノテーションは不正なメソッドアクセスを防ぎ、攻撃面を制限します。
リモートデバッグはChrome Developer Toolsを使用して可能で、WebViewコンテンツ内での相互作用や任意のJavaScript実行を可能にします。
アプリケーション内のすべてのWebViewに対してリモートデバッグを有効にするには:
アプリケーションのデバッグ可能な状態に基づいてデバッグを条件付きで有効にするには:
XMLHttpRequestを使用して任意のファイルの抽出を示します:
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)