インテント リダイレクトに対する脆弱性の修正

この情報は、インテント リダイレクトに対する脆弱性があるアプリのデベロッパーを対象としています。

現在の状況

インテント リダイレクトの問題があるアプリが 1 つ以上存在します。この問題により、非公開のアプリ コンポーネントやファイルが悪意のあるアプリによるアクセスを受ける可能性があります。下記の詳細な手順を確認して、アプリの問題を解決してください。Play Console に表示されている期限を過ぎた後もセキュリティの脆弱性が修正されていないアプリはすべて、Google Play から削除されます。

必要な対応

  1. Play Console にログインし、[アラート] セクションで、該当するアプリや問題の解決期限を確認します。
  2. 下記の手順に沿って該当するアプリを更新します。
  3. 該当するアプリの更新バージョンを送信します。

再送信すると、アプリは再度審査されます。審査には数時間ほどかかることがあります。アプリが審査に合格して正常に公開された場合、これ以上の対応は不要です。アプリが審査に不合格となった場合、アプリの更新バージョンは公開されず、メールで通知が届きます。

その他の詳細

アプリで、信頼できないインテントの Extras フィールドからインテントが抽出され、抽出されたインテントで startActivity(または同じように startService)が呼び出されてコンポーネントが起動された場合、予期せぬ非公開のコンポーネントが起動されるおそれがあります。この場合は、(1)引数を悪用して機密情報の操作が実行されたり、(2)付与された URI の権限を利用して機密性の高いファイルが盗まれたりする可能性があります。

以下のいずれかの方法でこの脆弱性への対応策を講じてください。

方法 1: 抽出されたインテントのリダイレクト元である、該当するアプリ コンポーネントを非公開にする。

該当するアプリ コンポーネントが、他のアプリからインテントを受け取る必要がない場合は、マニフェストに android:exported=”false” を設定して、そのアプリ コンポーネントを非公開にできます。

方法 2: 抽出されたインテントの提供元が信頼できることを確認する。

提供元のアクティビティが信頼できるかどうかを確認するには、getCallingActivity などのメソッドを使用します。次に例を示します。

 // check if the originating Activity is from trusted package
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // extract the nested Intent
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // redirect the nested Intent
   startActivity(forward);
 }

方法 3: リダイレクト対象のインテントが有害ではないことを確認する。

リダイレクトするインテントの動作を確認します。

  1. アプリの非公開コンポーネントに送信されない。
  2. アプリの非公開コンテンツ プロバイダURI の権限を付与しない。

インテントをリダイレクトする前にどのコンポーネントを使用してそのインテントを処理するかを確認するには、resolveActivity などのメソッドを使用します。次に例を示します。

 Intent intent = getIntent();
 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the component name
 ComponentName name = forward.resolveActivity(getPackageManager());
 // check that the package name and class name are as intended
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // redirect the nested Intent
   startActivity(forward);
 }

インテントが URI の権限を付与するかどうかを確認するには、getFlags などのメソッドを使用します。次に例を示します。

 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the flags
 int flags = forward.getFlags();
 // check that the nested intent does not grant URI permissions
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION > 0) ||
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION > 0) {
   // redirect the nested Intent
   startActivity(forward);
 }

サポートのご案内

脆弱性に関する技術的なご質問については、Stack Overflow にご投稿ください。その際、「android-security」タグをご利用ください。この問題を解決するための手順で不明な点がありましたら、デベロッパー サポートチームにお問い合わせください。

この情報は役に立ちましたか?
改善できる点がありましたらお聞かせください。