この情報は、Fragment Injection に対して脆弱な、安全ではない方法で PreferenceActivity クラスを実装しているアプリのデベロッパーを対象としています。このような実装では、悪意のある外部アプリによって非公開の Fragment が読み込まれる可能性があります。
状況
2017 年の 3 月 1 日以降、Google Play では Fragment Injection の脆弱性のある PreferenceActivity クラスを使用するすべての新規アプリおよびアップデートの公開がブロックされるようになりました。詳しくは Play Console の通知をご覧ください。Play Console に表示されている期限を過ぎた後もセキュリティの脆弱性が修正されていないアプリは、Google Play から削除される場合があります。
必要な対応
- Play Console にログインし、[アラート] セクションで該当するアプリや問題の解決期限を確認します。
- 該当のアプリを更新し、脆弱性を修正します。
- 該当のアプリの更新バージョンを送信します。
再送信すると、アプリは再度審査されます。審査には数時間ほどかかることがあります。アプリが審査に合格して正常に公開された場合は、これ以上の対応は不要です。アプリが審査に不合格となった場合、アプリの更新バージョンは公開されず、メールで通知が届きます。
その他の詳細
可能であれば、マニフェストで PreferenceActivity に exported=false を設定します。これによって、外部アプリがこのクラスにインテントを送信するのを防ぐことができます。
脆弱性のある PreferenceActivity クラスを外部アプリにエクスポートする必要がある場合は、脆弱性の理由を確認して、適切な措置を取ってください。次の 2 つの理由が考えられます。
-
isValidFragment の実装が正しくない:
脆弱性のあるクラスが、すべてのコードパスで true を返す isValidFragment の実装を含んでいる、あるいは継承しているかどうかを確認します。これに当てはまる場合は、クラスを更新し、許可される Fragment クラスの一覧を確認します。たとえば、PreferenceActivity で MyFragment クラスのみが許可され、他の Fragment は許可されない場合は、次のような実装でチェックを行います。
public boolean isValidFragment(String fragmentName) {
return MyFragment.class.getName().equals(fragmentName);
}
-
targetSdkVersion が 19 未満で、isValidFragment が実装されていない:
現在アプリのマニフェストで targetSdkVersion の値が 19 未満に設定されており、脆弱性のあるクラスに isValidFragment の実装が含まれていない場合は、脆弱性が PreferenceActivity から継承されます。
これを修正するには、デベロッパーは targetSdkVersion を 19 以上に更新する必要があります。targetSdkVersion を更新できない場合は、上記 1 の説明に沿って isValidFragment を実装し、許可される Fragment クラスを確認します。
なお、アプリはデベロッパー販売 / 配布契約とコンテンツ ポリシーに準拠している必要があります。
サポートのご案内
脆弱性に関する技術的なご質問については、Stack Overflow にご投稿ください。その際、「android-security」タグをご利用ください。この問題を解決するための手順で不明な点がありましたら、デベロッパー サポートチームにお問い合わせください。