Insecure File Provider Paths Setting
安全でないFile Providerのパス設定
説明
アプリケーションは、androidx.core.content.FileProviderを使用してFile Providerを公開しています。プロバイダーは、android.support.FILE_PROVIDER_PATHSという名前のメタデータ子属性で利用可能なファイルを指定します。
この属性は、android.support.FILE_PROVIDER_PATHS構成ファイルで指定されたディレクトリのURIを生成するために必要です。
Androidでは複数のパスタイプが定義されています。
<root-path name="name" path="path"/>
- FileProvider のドキュメントを確認しても、利用可能なパスの中に
<root-path...>は見つかりません。 このパスはドキュメント化されていませんが、利用可能であり、/dataやsdcardとともにアプリの内部ストレージへのアクセスを提供するために使用できます。 このパスはアプリおよびデバイスの保護された部分へのアクセスを許可するため、アプリケーションのファイルシステムを公開します。
<files-path name="name" path="path"/>
- アプリの内部ストレージ領域の files/ サブディレクトリ内のファイルを表します。このサブディレクトリは、
Context.getFilesDir()によって返される値と同じです。
<cache-path name="name" path="path"/>
- アプリの内部ストレージ領域の cache サブディレクトリ内のファイルを表します。このサブディレクトリのルートパスは、
getCacheDir()によって返される値と同じです。
<external-path name="name" path="path"/>
- 外部ストレージ領域のルートにあるファイルを表します。このサブディレクトリのルートパスは、
Environment.getExternalStorageDirectory()によって返される値と同じです。
<external-files-path name="name" path="path"/>
- アプリの外部ストレージ領域のルートにあるファイルを表します。このサブディレクトリのルートパスは、
Context.getExternalFilesDir(null)によって返される値と同じです。
<external-cache-path name="name" path="path"/>
- アプリの外部キャッシュ領域のルートにあるファイル。このサブディレクトリのルートパスは、
Context.getExternalCacheDir()によって返される値と同じです。
<external-media-path name="name" path="path"/>
- アプリの外部メディア領域のルートにあるファイルを表します。このサブディレクトリのルートパスは、
Context.getExternalMediaDirs()の最初の結果によって返される値と同じです。
以下の例では、プロバイダーがホームディレクトリ(/dataおよび/sdcardディレクトリも含む)へのアクセスを許可するルートフォルダー構成を持っていることがわかります。
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<root-path name="root" path="/"/>
</paths>
Intent Redirectionのような他の脆弱性と連鎖して機密データを盗んだり、ネイティブライブラリを上書きすることによるRemote Code Executionに繋がる可能性があります。
推奨事項
安全でないファイルパスプロバイダーはAndroidアプリの脆弱性であり、ファイルパスが他のアプリやユーザーに公開されることで、機密データが危険にさらされたり、システムリソースへの不正アクセスが許可されたりする可能性があります。
安全でないファイルパスプロバイダーに起因する脆弱性からAndroidアプリを保護するために、以下の推奨事項を考慮してください。
- external-path宣言で '.' のような寛容な設定を避ける。
root-pathの使用を避ける。- ルートパスとして
/を割り当てることを避ける。 <grant-uri-permission>タグを使用して共有ファイルへのアクセスを制御する。external-files-pathパスタイプを使用することを推奨する。- パス属性には特定のフォルダーを使用する。
たとえば、以下はexternal-files-pathタグと特定のDownload/パス属性を持つファイルプロバイダーの例です。
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path
name="downloads"
path="Download/" />
</paths>
リンク
基準
- OWASP_MASVS_L1:
- MSTG_PLATFORM_4
- OWASP_MASVS_L2:
- MSTG_PLATFORM_4
- CWE_TOP_25:
- CWE_22
- GDPR:
- ART_5
- ART_32
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_PLATFORM_1
- HIPAA_CONTROLS:
- SECURITY251
- SECURITY221
- SECURITY212
- SECURITY213
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5