説明
SharedPreferencesは、Androidアプリ内へ値を簡単に保存するAPIです。認証トークン、セッションID、個人識別情報などを平文で保存すると、root化された端末、バックアップ、デバッグによる抽出、他のローカルな侵害経路から漏えいするおそれがあります。
想定される影響
- 認証トークンやセッションの窃取
- 個人情報やアプリ内部設定の漏えい
- 盗まれた値の再利用によるアカウントへのアクセス
対処方法
- 可能なら機密性のある値を端末へ保存しないでください。
- 保存が必要なら、Android Keystoreで鍵を保護し、維持管理されているプラットフォームの暗号APIや、検証済みの暗号化ストレージを使ってください。
EncryptedSharedPreferencesはAndroidX Security 1.1.0から非推奨なので、新規コードの標準的な選択肢にしないでください。 - 同じ値がログ、バックアップ、デバッグ経路から漏れていないかも確認してください。
例
変更後は、既存のEncryptedSharedPreferences実装を説明するレガシーの例です。contextとKeystoreを使うmasterKeyの準備は省略しています。復元後に鍵が使えない可能性があるため、このファイルはAuto Backupから除外してください。
変更前
java
preferences.edit().putString("auth_token", token).apply();
変更後
java
SharedPreferences preferences = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
preferences.edit().putString("auth_token", token).apply();
説明:
- 変更前: 機密性のある値を平文で保存し、バックアップ、root化端末、デバッグ抽出、脆弱なローカルアクセス経路から漏えいする可能性があります。
- 変更後: 既存の
EncryptedSharedPreferencesがキーと値を暗号化します。新しい実装では、前述のサポートされる暗号化方式を選んでください。端末やアプリプロセスが侵害された状況のすべてを、暗号化だけで防ぐことはできません。