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 drmrpcinit.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