この情報は、パス トラバーサルの脆弱性が含まれるアプリのデベロッパーを対象としています。
状況
2018 年 1 月 16 日以降、Google Play では、パス トラバーサルの脆弱性が含まれる新しいアプリやアップデートの公開がブロックされるようになりました。詳しくは Play Console の通知をご覧ください。Play Console に表示されている期限を過ぎた後もセキュリティの脆弱性が修正されていないアプリは、Google Play から削除される場合があります。
必要な対応
- Play Console にログインし、[アラート] セクションで該当するアプリや問題の解決期限を確認します。
- 該当のアプリを更新し、脆弱性を修正します。
- 該当のアプリの更新バージョンを送信します。
再送信すると、アプリは再度審査されます。審査には数時間ほどかかることがあります。アプリが審査に合格して正常に公開された場合は、これ以上の対応は不要です。アプリが審査に不合格となった場合、アプリの更新バージョンは公開されず、メールで通知が届きます。
その他の詳細
エクスポートする ContentProvider 内に openFile を実装している場合、入力される URI パラメータの検証が適切に行われていないと、脆弱になる可能性があります。悪意のあるアプリは、細工された URI(たとえば、「/../」を含むもの)を供給することで、デベロッパーのアプリを欺き、目的のディレクトリの外部にあるファイルの ParcelFileDescriptor を返させるようにすることができます。これにより、悪意のあるアプリは、デベロッパーのアプリにアクセスできるあらゆるファイルにアクセスできるようになります。
ContentProvider 内のパス トラバーサルの脆弱性を取り除く戦略として、次の 2 つをおすすめします。
1. ContentProvider を他のアプリにエクスポーズする必要がない場合:
- マニフェスト内で、対象 ContentProvider の <provider> タグを変更して、android:exported="false" に設定します。これにより、他のアプリは対象 ContentProvider にインテントを送信できなくなります。
- また、android:permission 属性を android:protectionLevel="signature" の permission に設定することで、他のデベロッパーが記述したアプリが対象の ContentProvider にインテントを送信できないようにすることもできます。
2. ContentProvider を他のアプリにエクスポーズする必要がある場合:
openFile に対する入力がパス トラバーサル文字を含むときに、アプリが絶対に想定外のファイルを返すことのないように、正しく設定する必要があります。そのためには、ファイルの正規パス(canonical path)をチェックします。たとえば、次のように設定します。
public ParcelFileDescriptor openFile (Uri uri, String mode)
throws FileNotFoundException {
File f = new File(DIR, uri.getLastPathSegment());
if (!f.getCanonicalPath().startsWith(DIR)) {
throw new IllegalArgumentException();
}
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
警告: URI パラメータで getLastPathSegment を呼び出す方法は安全ではありません。悪意のあるアプリは、エンコードされた URI パスを供給できます。たとえば、「%2F..%2F..path%2Fto%2Fsecret.txt」が供給されると、getLastPathSegment の出力結果は「/../../path/to/secret.txt」となります。次の実装例は、攻撃に対して依然として脆弱です。
public ParcelFileDescriptor openFile(Uri uri, String mode){
File f = new File(DIR, uri.getLastPathSegment());
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
サポートのご案内
脆弱性に関する技術的なご質問については、Stack Overflow にご投稿ください。その際、「android-security」タグをご利用ください。この問題を解決するための手順で不明な点がありましたら、デベロッパー サポートチームにお問い合わせください。