Androidのファイルベース暗号化とメタデータ保護

AndroidのFBE(File-Based Encryption)は、セキュリティを強化するための重要な技術です。以下では、その基本概念と実装方法について説明します。

FBEの概要

FBEは、異なるファイルに異なる鍵を使用して個別に暗号化できる仕組みです。Android 7.0以降でサポートされ、デバイスのロック状態に関係なく一部のアプリケーションが動作するDirect Boot機能と密接に関連しています。

Direct Bootとデータストレージ

Direct Bootモードでは、デバイスが電源投入された直後から特定のアプリケーションが利用可能になります。この際、以下の二つのデータ保存領域が提供されます: - デバイス暗号化ストレージ (DE):直接ブートモード中およびユーザーがデバイスをアンロックした後に使用可能です。 - 資格情報暗号化ストレージ (CE):ユーザーがデバイスをアンロックした後にのみ利用できます。 未ロック状態での/data/dataディレクトリの例:
xxxx:/data/data # ls
+1przBAAAAwizOmydDSDnmSuhpM2bC7XfR9jRqjsS1cBxirM2baIjB Us9kyDAAAAQN8hVX,BGKFiZuYU0LtcFXicKkKMc998iMOAOeWqG9e4WMV7XNHBTtPnDtBpPL6KK
+7euADAAAAQEYEQSkZXnTBNfTSOddnPmgwozN13nE7R+gpNx4,M89A VYRlUAAAAAwMbYllyGVzyY3ayZgfkbzTiUpHZbX,1qHGBeyL44bZDIYf295x7melh2CfdQHqs8A
+AM4bCAAAAQkJ,wSGXhucLTX73pwH4Xz1wHWd9HYoUIm5iRRv0yVcB VuLCbDAAAAQNHLYk+3ZqlHf1v,st1VqwMeHqhgzmZ5SPhD71tJexTA
+hAk4DAAAAQF8eOkirWvlnPJaPVxA6IwtmSCq4S,KFlK95EVtW7JLA W+mHDAAAAAAgNph8Kkt67gHDwIh60HOa
新しいファイルを作成しようとするとエラーが発生します:
xxxx:/data/data # touch a
touch: 'a': Required key not available

メタデータ暗号化

ユーザーデータパーティションの内容が読み取れる前に、メタデータ暗号化キーが必要です。そのため、専用のメタデータ分区が設けられます。サイズは通常16MBです。 メタデータ暗号化キーの一覧:
xxxx:/metadata/vold/metadata_encryption/key # ls -l
total 52
-rw------- 1 root root    92 1970-04-04 18:28 encrypted_key
-rw------- 1 root root   464 1970-04-04 18:28 keymaster_key_blob
-rw------- 1 root root 16384 1970-04-04 18:28 secdiscardable
-rw------- 1 root root    10 1970-04-04 18:28 stretching
-rw------- 1 root root     1 1970-04-04 18:28 version

Keymasterサービスの起動プロセス

Keymasterは/initプロセスより前に起動し、/dataのマウント準備を行います。以下は初期化シーケンスの一部です。 初期化設定例:
service vendor.keymanager-4-0-custom /vendor/bin/hw/android.hardware.keymaster@4.0-service.custom
class early_hal
user system
group system drmrpc
init.rc内のクラス起動:
on late-fs
chmod 0755 /sys/kernel/tracing
chmod 0755 /sys/kernel/debug/tracing

# HALs required before storage encryption can get unlocked (FBE/FDE)
class_start early_hal
メモ:Keymasterの起動時にTEE Supplicantの依存関係により問題が発生することがあります。これを解決するために、セキュアストレージをpersistパーティションに移動することが推奨されます。 修正例:
diff --git a/Android.mk b/Android.mk
index 28ccce8..08e28f9 100644
--- a/Android.mk
+++ b/Android.mk
@@ -10,7 +10,7 @@ CFG_TEE_SUPP_LOG_LEVEL ?= 2
CFG_TEE_CLIENT_LOAD_PATH ?= /vendor/lib
TEEC_TEST_LOAD_PATH ?= /data/vendor/tee
-CFG_TEE_FS_PARENT_PATH ?= /data/vendor/tee
+CFG_TEE_FS_PARENT_PATH ?= /mnt/vendor/persist/tee
ifneq ($(strip $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)),)
CFG_TEE_PLUGIN_LOAD_PATH ?= /vendor/lib64/tee-supplicant/plugins/
else

タグ: Android FBE DirectBoot Keymaster メタデータ暗号化

7月20日 22:03 投稿