Android IntentのURI権限操作

ユーザーが指定したIntentの結果としての返却

説明

外部から受け取ったIntentを、FLAG_GRANT_READ_URI_PERMISSION や FLAG_GRANT_WRITE_URI_PERMISSION などのURI権限フラグを残したまま渡すと、攻撃者がアプリのアクセス可能なコンテンツURIの権限を他のコンポーネントへ委譲させるおそれがあります。

想定される影響

  • アプリ内部のファイルやコンテンツURIの情報漏えい
  • 書き込み権限の委譲によるデータ改ざん
  • 権限の境界の回避

対処方法

  1. 外部のIntentを渡す前に、不要な権限付与フラグを取り除いてください。
  2. URIと宛先のコンポーネントを許可リストで検証してください。
  3. 必要最小限の権限だけを明示的に付与し、使用後は取り消してください。

例

変更前

java
Intent result = getIntent();
result.putExtra("status", "ok");
setResult(RESULT_OK, result);
finish();

変更後

java
Intent result = new Intent();
result.putExtra("status", "ok");
setResult(RESULT_OK, result);
finish();

解説:

  • 変更前: 外部から受け取ったIntentを setResult でそのまま返すと、攻撃者がURI権限フラグを含め、アプリのContentProviderへのアクセス制限を回避するおそれがあります。
  • 変更後: setResult 用に新しいIntentを作成し、必要なデータだけをコピーします。

参考資料