MASTG-TEST-0250 WebView におけるコンテンツプロバイダアクセスへの参照 (References to Content Provider Access in WebViews)
概要
このテストでは WebView におけるコンテンツプロバイダアクセスへの参照をチェックします。これはデフォルトで有効になっており、WebSettings
クラスの setAllowContentAccess
メソッドを使用して無効にできます。不適切に構成すると、不正なファイルアクセスやデータ流出などのセキュリティリスクを引き起こす可能性があります。
JavaScript コードは以下のようにデバイス上のあらゆるコンテンツプロバイダにアクセスできます。
そのアプリで宣言されたもの、エクスポートされていない場合でも。
他のアプリで宣言されたもの、エクスポートされている場合のみ、およびアクセス制限に関して推奨される ベストプラクティス に従っていない場合。
setAllowContentAccess
メソッド、アクセスできる特定のファイル、アクセスできる条件の詳細については、WebView コンテンツプロバイダアクセス を参照してください。
攻撃シナリオの例:
ある銀行アプリが WebView を使用して動的コンテンツを表示しているとします。開発者は setAllowContentAccess
メソッドを明示的に設定していないため、デフォルトで true
です。さらに、WebView で JavaScript が有効であり、setAllowUniversalAccessFromFileURLs
メソッドも有効になっています。
攻撃者は脆弱性 (XSS 欠陥など) を悪用し、WebView に悪意のある JavaScript を注入します。これは、WebView が適切なバリデーションなしでロードする、危殆化したリンクや悪意のあるリンクによって発生する可能性があります。
setAllowUniversalAccessFromFileURLs(true)
のおかげで、悪意のある JavaScript はcontent://
URI へのリクエストを発行し、ローカルに保存されているファイルやコンテンツプロバイダで公開されているデータを読み取ることができます。悪意のあるコードは信頼できるコードと同じプロセスと同じオリジンで実行されているため、アプリからエクスポートされていないコンテンツプロバイダにもアクセスできます。攻撃者が制御するスクリプトがデバイスから外部サーバーに機密データを流出します。
注 1: Android バージョンに関係なく setAllowContentAccess
はデフォルトで true
になるため、minSdkVersion
は考慮しません。
注 2: プロバイダの android:grantUriPermissions
属性は、アプリ自体が自身のコンテンツプロバイダにアクセスする際には影響しないため、このシナリオでは無関係です。permission
属性や android:exported="false"
などの制限が設定されている場合でも、他のアプリ がプロバイダから URI に一時的にアクセスできるようになります。また、アプリが FileProvider
を使用する場合、定義 によって android:grantUriPermissions
属性が true
に設定されていなければなりません (そうしないと SecurityException: Provider must grant uri permissions"
が発生します)。
注 3: allowUniversalAccessFromFileURLs
はデフォルトの制限を緩和し、file://
からロードされたページが content://
URI を含む任意のオリジンからコンテンツにアクセスできるようにするため、攻撃において重要です。
この設定が有効でない場合、logcat
に以下のエラーが表示されます。
[INFO:CONSOLE(0)] "Access to XMLHttpRequest at 'content://org.owasp.mastestapp.provider/sensitive.txt'
from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported
for protocol schemes: http, data, chrome, https, chrome-untrusted.", source: file:/// (0)
外部サーバーへの fetch
リクエストは依然として機能しますが、content://
経由でのファイルコンテンツの取得は失敗します。
手順
semgrep などのツールを使用して、以下への参照を探します。
WebView
クラス。WebSettings
クラス。setJavaScriptEnabled
メソッド。WebSettings
クラスのsetAllowContentAccess
メソッド。WebSettings
クラスのsetAllowUniversalAccessFromFileURLs
メソッド。
アプリの AndroidManifest.xml ファイルで宣言されているすべてのコンテンツプロバイダを取得します。
結果
出力には以下を含む可能性があります。
以下のメソッドとその引数を含む WebView インスタンスのリスト:
setAllowContentAccess
setJavaScriptEnabled
setAllowUniversalAccessFromFileURLs
アプリの AndroidManifest.xml ファイルで宣言されているコンテンツプロバイダのリスト。
評価
不合格:
以下のすべてが当てはまる場合、そのテストは不合格です。
setJavaScriptEnabled
が明示的にtrue
に設定されている。setAllowContentAccess
が明示的にtrue
に設定されているか、まったく使用されていない (デフォルト値true
を継承している)。setAllowUniversalAccessFromFileURLs
メソッドが明示的にtrue
に設定されている。
結果ステップで取得したコンテンツプロバイダのリストを使用して、コンテンツプロバイダが機密データを処理しているかどうかを検証する必要があります。
注: setAllowContentAccess
メソッドを true
に設定されていること自体はセキュリティ脆弱性を表すものではありませんが、他の脆弱性と組み合わせて使用することで攻撃の影響を拡大する可能性があります。したがって、アプリがコンテンツプロバイダにアクセスする必要がない場合は、明示的に false
を設定することをお勧めします。
合格:
以下のいずれかが当てはまる場合、そのテストは合格です。
setJavaScriptEnabled
が明示的に falseに設定されているか、_まったく使用されていない_ (デフォルト値
false` を継承している)。setAllowContentAccess
メソッドが明示的にfalse
に設定されている。setAllowUniversalAccessFromFileURLs
メソッドが明示的にfalse
に設定されている。
Last updated
Was this helpful?