Android Intentのリダイレクト

ユーザーが指定したIntentによるリダイレクト

説明

外部のIntentに含まれる Intent オブジェクトやコンポーネント情報を検証せずに startActivity、startService、sendBroadcast などへ渡すと、攻撃者がアプリの権限や信頼関係を利用して、意図しないコンポーネントを起動するおそれがあります。

想定される影響

  • 内部コンポーネントの呼び出しや権限チェックの回避
  • 機密情報を含むextra値の受け渡し
  • フィッシング画面や悪意あるコンポーネントの起動

対処方法

  1. 外部から受け取ったIntentをそのまま転送しないでください。
  2. 対象のパッケージ、クラス、actionを許可リストで検証してください。
  3. setPackage、setClassName、setComponent を使い、信頼できる宛先を明示してください。

例

変更前

java
Intent next = getIntent().getParcelableExtra("next");
startActivity(next);

変更後

java
String target = getIntent().getStringExtra("target");
if ("safe".equals(target)) {
    Intent next = new Intent(this, SafeActivity.class);
    startActivity(next);
}

解説:

  • 変更前: 外部のIntentを検証せずに渡すと、攻撃者がこのアプリの権限で内部コンポーネントや他のアプリのコンポーネントを起動させるおそれがあります。
  • 変更後: 外部のIntentを転送せず、新しいIntentを作成して許可した宛先だけを設定します。

参考資料