OWASP カテゴリ: MASVS-CODE: コード品質
概要
アプリのバックアップは、ユーザーのデータを保持して、後で新しいデバイスに復元したり、データが失われた場合に復元したりすることを目的としています。アプリのバックアップに関する既存のセキュリティ推奨事項は、Android のバージョンやデバイスのメーカーによって微妙に異なります。共通のテーマは、これらの推奨事項がセンシティブ データの漏洩を防ぐことを目的としています。
標準の Android バックアップ システムは、アプリがデータをクラウドにバックアップしたり、自動バックアップ (デフォルトで有効で、実装に作業を必要とせず、拡張も可能)と Key-Value バックアップを介して新しいデバイスにデータを転送したりするための、最も安全で堅牢かつ簡単なソリューションです。このソリューションを使用することをおすすめします。このソリューションでは、生成されたバックアップ データが他のサードパーティ製アプリからアクセスできないディレクトリに保存されるためです。また、保存データの暗号化、転送中のデータの暗号化、機密データをバックアップから除外できる構成も容易になります。
代わりに、標準の Android バックアップ システムに依存しないバックアップ ソリューションをアプリが実装すると、誤って機密データが漏洩する可能性が高まります。ユーザーデータを漏洩させる標準以外のバックアップ ソリューションの例としては、他のアプリが読み取り可能なディレクトリにアプリデータのコピーを作成する「エクスポート」または「バックアップ」機能を提供するアプリなどがあります。このようなアプリは、(直接的または他の脆弱性を通じて)漏洩しやすくなっています。
影響
アプリのバックアップを設定する際にセキュリティの推奨事項に従うことで、バックアップに含まれる機密データの漏洩を防ぐことができます。実際のデータと攻撃者の意図に応じて、機密データの漏洩により、情報の漏洩、ユーザーのなりすまし、金銭的損失につながる可能性があります。
リスクの軽減
標準の Android バックアップ システムを使用する
標準の Android バックアップ システムでは、転送中と保存中のバックアップ データが常に暗号化されます。この暗号化は、使用している Android のバージョンや、デバイスにロック画面があるかどうかに関係なく適用されます。Android 9 以降では、デバイスにロック画面が設定されている場合、バックアップ データは暗号化されるだけでなく、Google に知られていない鍵で暗号化されます(ロック画面のシークレットで暗号鍵が保護され、エンドツーエンドの暗号化が可能になります)。
一般に、データ ストレージとセキュリティ ガイドラインに沿って操作してください。
バックアップに特に機密性の高いデータが含まれている場合は、このデータを除外するか、除外できない場合は、次のセクションで説明するようにエンドツーエンド暗号化を必須にすることをおすすめします。
バックアップからデータを除外する
バックアップから除外するデータを指定するには、ルールファイルを使用します。このファイルは通常 backup_rules.xml
と呼ばれ、res/xml
アプリ フォルダに配置します。バックアップ ルールの設定方法は、使用する Android のバージョンによって異なります。
- Android バージョン 12(API レベル 31)以降では、
AndroidManifest.xml
内の<application>
要素にandroid:dataExtractionRules
属性を追加します。 - xml
xml <application android:name="com.example.foo" android:dataExtractionRules="@xml/backup_rules_extraction"> … </application>
次に、更新された構成形式に従って、アプリケーションのデータ永続性とセキュリティ要件に従って backup_rules.xml
ファイルを構成します。
backup_rules.xml
ファイルの構成に必要な形式では、デベロッパーはクラウドとデバイス間(D2D)転送の両方にカスタム バックアップ ルールを定義できます。<device-transfer>
属性が設定されていない場合、D2D 移行中にすべてのアプリケーション データが転送されます。ターゲット アプリが Android 12 以降をターゲットとしている場合でも、Android 11(API レベル 30)以前を搭載しているデバイスには、追加のバックアップ ルール セットを含む別のファイルを常に指定する必要があることを強調することが重要です。
- Android バージョン 11 以前の場合は、
AndroidManifest.xml
内の<application>
要素にandroid:fullBackupContent
属性を追加します。 - xml
xml <application android:name="com.example.foo" android:fullBackupContent="@xml/backup_rules_full"> … </application>
次に、ユーザーデータのバックアップに関する記事で報告されている構文を使用して、アプリケーションのデータの永続性とセキュリティの要件に従って backup_rules.xml
ファイルを構成します。
エンドツーエンドの暗号化の必須
機密データをバックアップから除外できない場合は、エンドツーエンドの暗号化を必須にすることをおすすめします。つまり、Android 9 以降で、ロック画面が設定されている場合にのみバックアップを許可します。これは requireFlags="clientSideEncryption"
フラグを使用して実現できます。このフラグは、Android 12 以降は disableIfNoEncryptionCapabilities
に名前を変更し、true
に設定する必要があります。
標準の Android バックアップ システムを使用できない場合
標準の Android バックアップ システムを使用できない場合、バックアップ データを安全に保存し、バックアップから除外するデータを指定することはより複雑になります。これはコードレベルで指定する必要があるため、エラーが発生しやすく、データ漏洩のリスクがあります。このシナリオでは、バックアップの想定動作に変更がないことを確認するため、実装を定期的にテストすることもおすすめします。
リソース
- allowBackup 属性の説明
- ファイルベースの暗号化
- デバイス間の移行動作の変更
- 自動バックアップでユーザーデータをバックアップする
- Android Backup Service を使用して Key-Value ペアをバックアップする
- Android 12 以上でバックアップを管理する
- Android 11 以下でバックアップを管理する
- Google の契約とポリシーにおける個人情報の扱いを理解する
- バックアップと復元をテストする
- 暗号化
- Android Keystore システム
- ADB
- 開発者向けオプション