OWASP カテゴリ: MASVS-STORAGE: ストレージ
概要
アプリは通常、使用するデータを、ローカルのデバイス、外部ストレージ、またはリモートのクラウド ストレージに保存します。アプリの状態を保持するため、アプリのバックアップが実行されて、これにより、重大な障害やユーザーエラーが発生してデータが失われてもアプリの復元が可能となります。機密情報(ユーザーの個人データ、認証キーやパスワードなど)に関連するデータが保存されている場合は、対象ユーザー以外からバックアップがアクセスを受けた場合に情報が漏洩しないよう、追加のセキュリティ対策を適用することができます。
バックアップ データの最も一般的な取得方法の 1 つが ADB バックアップ コマンドの使用です。このためには、デバイスで開発者向けオプション有効にする必要があり、開発者向けオプションを有効にするには、ユーザーの PIN が必要となります。攻撃者は、バックアップ データを取得するには、まずユーザーの PIN に不正アクセスする必要があります。
影響
攻撃者はアプリのバックアップ ファイルへのアクセス権を得ると、アプリでバックアップされた、暗号化されていない状態のデータを取得する可能性があります。その結果、漏洩した機密情報が今後の攻撃で攻撃者に使用されたり、簡単に悪用されたりすることがあります。
リスク: アプリのバックアップを許可する
ロック解除されたデバイスに物理的にアクセスした攻撃者や Google アカウントに不正にアクセスした攻撃者は、アプリとアプリのデータのバックアップを実行する可能性があります。Android 12 以降では、Android マニフェストの android:debuggable
属性が false
に設定されていない限り、アプリのデータはバックアップ データに含まれません。そのため、バックアップに含まれる暗号化されていない状態のアプリデータは攻撃者に漏洩し、悪用される可能性があります。
以下のように設定を変更すれば、バックアップ ファイル内の機密情報の漏洩を防ぐことができますが、すべてのスマートフォン メーカーがアプリのバックアップ ポリシーに準拠しているとは限りません。そのため、バックアップ対象ではないデータが、OEM 独自のバックアップ ソリューションを介してバックアップされる可能性があります。こうしたケースに対応するため、暗号化や、機密情報と思われる不要なデータを取り除く、保存しないといった、ユーザーデータを保護するための追加措置の導入をご検討ください。
リスクの軽減
アプリのバックアップを無効にする
アプリのバックアップ データがアプリの通常の動作に不要と思われる場合は、バックアップの実行を防ぐためのルールを追加することをご検討ください。アプリのバックアップを制限するには、AndroidManifest.xml
ファイル内の android:allowBackup
属性を false
に設定します。Android バージョン 12 以降では、allowBackup
を false
に設定すると、クラウドと ADB のバックアップは制限されますが、デバイス間の移行は許可されます。
<application android:name="com.example.foo" android:allowBackup="false">
...
</application>
バックアップ対象のデータを管理する
アプリの通常の使用にバックアップが必要な場合は、バックアップ ルールを設定して、バックアップするデータの種類を指定できます。このルールは backup_rules.xml ファイルで定義します。これらのルールの設定方法は、使用する Android のバージョンによって異なります。
Android バージョン 12 以降では、以下の例のように android:dataExtractionRules
属性を AndroidManifest.xml 内の <application>
要素に追加します。
<application android:name="com.example.foo"
android:dataExtractionRules="backup_rules.xml">
…
</application>
<application android:name="com.example.foo"
android:fullBackupContent="@xml/backup_rules">
…
</application>
リスク: 機密情報を暗号化されていない状態で保存する
アプリの目的に応じて、デバイスにバックアップするデータの中には、個人データや財務データなど、機密情報と見なされるものがある場合があります。ユーザーのデバイスに不正アクセスした攻撃者がデバイスからデータを取得し、その結果、攻撃者に漏洩したクリアテキスト データが悪用される可能性があります。
リスクの軽減
機密情報をすべて暗号化する
データ セキュリティを強化するため、Android の暗号化ガイドラインに沿って機密情報と見なされる可能性がある保存済みのデータをすべて暗号化し、Android Keystore システムを使用して暗号鍵を保護します。
新しいデバイスへのアプリデータの移行をサポートする必要がある場合は、アプリのデータ移行モードの実装をご検討ください。このモードでは、暗号化されたデータは暗号化されない状態でアプリの内部ファイルにごく短い時間のみ保存されます。これにより、アプリのデータを新しいデバイスに移行することが可能となります。
データ移行モードを実装する場合は、以下の方法をおすすめします。
- データ移行モードは認証されたアプリユーザーのみが有効にできるようにします。
- 暗号化されていない状態のデータは、外部ストレージではなく、アプリの内部ファイルにローカルに保存します。
- 暗号化されていないファイルはごく短い時間のみ存在することを許可し、その時間が過ぎたらファイルが削除されるようにします。
- ファイルが移行されたら、暗号化されていないファイルを起動時にアプリで暗号化します。
このモードでは、暗号化されていない状態のデータのバックアップも許可されますが、バックアップを暗号化しないままにしておく時間は限られているため、未認証の攻撃者がクリアテキスト データにアクセスする可能性は低くなります。
リソース
- allowBackup 属性の説明
- デバイス間の移行動作の変更
- Android 12 以上でバックアップを管理する
- Android 11 以下でバックアップを管理する
- Google の契約とポリシーにおける個人情報の扱いを理解する
- 暗号化
- Android Keystore システム
- ADB
- 開発者向けオプション