バックアップのセキュリティに関する推奨事項

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 バックアップ システムを使用できない場合、バックアップ データを安全に保存し、バックアップから除外するデータを指定することはより複雑になります。これはコードレベルで指定する必要があるため、エラーが発生しやすく、データ漏洩のリスクがあります。このシナリオでは、バックアップの想定動作に変更がないことを確認するため、実装を定期的にテストすることもおすすめします。

リソース