【OP-TEE】安全存储
背景
OP-TEE中的安全存儲是根據 GlobalPlatform 的 TEE 內部核心 API(這里稱為可信存儲)中定義的內容來實現的。本規范規定,應該可以存儲通用數據和關鍵材料,以保證所存儲數據的機密性和完整性以及修改存儲的操作的原子性(這里的原子性意味著整個操作要么成功完成,要么不寫)。
目前,OP-TEE中有兩種安全存儲實現:
- 第一個依賴于普通世界(REE)文件系統,默認實現。它在編譯時通過 CFG_REE_FS=y 啟用。
- 第二種方法利用eMMC設備的重放保護內存塊(RPMB)分區,通過設置 CFG_RPMB_FS=y 來啟用。
REE 文件系統安全存儲
?
OP-TEE 系統安全文件
| Source file | Purpose |
|---|---|
| core/tee/tee_svc_storage.c | TEE trusted storage service calls |
| core/tee/tee_ree_fs.c | TEE file system & REE file operation interface |
| core/tee/fs_htree.c | Hash tree |
| core/tee/tee_fs_key_manager.c | Key manager |
| lib/libutee/ | GlobalPlatform Internal API library |
GlobalPlatform 安全存儲要求
以下是規范摘錄,列出了最重要的要求:
1. 只要應用了適當的加密保護,可信存儲就可以由非安全資源支持,而加密保護必須與保護TEE代碼和數據本身的方法一樣強大。2. 可信存儲必須綁定到特定設備,這意味著數據被創建時只有在同一TEE和同一設備上運行的授權ta才能訪問或修改它3. TA本身能夠隱藏敏感關鍵數據4. 每個TA都可以訪問其自己的存儲空間,該存儲空間在該TA的所有實例之間共享,但與其他TA分離。5. 受信任存儲必須提供最低級別的保護,以防回滾攻擊??梢越邮艿氖?#xff0c;實際的物理存儲可能位于不安全的區域,因此容易受到來自TEE外部的操作的影響。通常,一個實現可以依賴于REE來達到這個目的(保護級別100),或者依賴于TEE控制的硬件資產(保護級別1000)。(see GP TEE Internal Core API section 2.5 and 5.2)
如果配置CFG_RPMB_FS=y,則回滾保護由TEE控制,并設置為1000。如果CFG_RPMB_FS=n,則沒有針對回滾的保護,并且保護級別設置為0。
Linux 文件系統中的 TEE 文件結構
默認情況下,OP-TEE 使用 /data/tee/ 作為 Linux 文件系統中的安全存儲空間。每個持久化對象都分配了一個內部標識符。它是一個整數,在 Linux 文件系統中顯示為 /data/tee/<file number> 。
目錄文件 /data/tee/dirf.db,列出安全存儲中的所有對象。所有正常世界的文件都是完整性保護和加密的,如下所述。
密鑰管理器
密鑰管理器是 TEE 文件系統中的一個組件,負責處理數據的加密和解密以及對敏感密鑰的管理。密鑰管理器使用三種類型的密鑰:安全存儲密鑰(Secure Storage Key, SSK)、TA存儲密鑰(Trusted Application?Storage Key, TSK)和文件加密密鑰(File Encryption Key, FEK)。
硬件唯一密鑰(Hardware Unique Key, HUK)
大多數設備都有某種硬件唯一密鑰(HUK),主要用于派生其他密鑰。例如,當派生密鑰用于安全存儲等時,可以使用 HUK 派生。HUK 的重要之處在于它需要得到很好的保護,并且在最好的情況下,HUK 永遠不應該直接從軟件讀取,甚至不應該從安全方面讀取。有不同的解決方案,加密加速器可能支持它,或者,它可能涉及另一個安全的協處理器。
在 OP-TEE 中,HUK 只是一個存根,您將看到在 core/include/kernel/TEE_common_otp.h 中名為 TEE_otp_get_hw_unique_key(…)的函數中,在真正安全的產品中,必須用其他東西替換它。如果你的設備缺少對HUK的硬件支持,那么你至少必須將其更改為除零之外的其他內容。但是,請記住,在軟件中存儲密鑰不是一個好的安全做法,尤其是不能將密鑰作為其他所有內容的根,因此我們建議您不要這樣做。
安全存儲密鑰(Secure Storage Key, SSK)
SSK是每個設備的密鑰,在OP-TEE啟動時生成并存儲在安全內存中。SSK用于派生TA存儲密鑰(TSK)。
SSK = HMACSHA256?(HUK, Chip ID || “static string”)
獲取硬件唯一密鑰(HUK)和芯片ID的功能取決于平臺實現。目前,OP-TEE 系統中每臺設備只有一把 SSK,用于安全存儲子系統。但是,為了將來,我們可能需要為每臺設備使用生成 SSK 的相同算法為不同的子系統創建不同的密鑰。為不同子系統生成不同的密鑰的簡單方法是使用不同的靜態生成密鑰的字符串。
TA存儲密鑰(Trusted Application?Storage Key, TSK)
TSK是每個受信任的應用程序密鑰,由SSK和TA的標識符(UUID)生成。它被用來保護FEK,換句話說,用來加密/解密FEK。
TSK = HMACSHA256 (SSK, TA_UUID)
文件加密密鑰(File Encryption Key, FEK)
當一個新的TEE文件被創建時,密鑰管理器將通過 PRNG(pesudo隨機數生成器)為TEE文件生成一個新的 FEK,并將加密的 FEK 存儲在 meta 文件中。FEK 用于對存儲在 meta 文件中的TEE文件信息或塊文件中的數據進行加密/解密。
哈希樹
哈希樹負責處理安全存儲文件的數據加密和解密。哈希樹被實現為二叉樹,樹中的每個節點(struct tee_fs_htree_node_image)保護其兩個子節點和一個數據塊。元數據(meta data)存儲在一個頭(struct tee_fs_htree_image)中,它也保護頂層節點。
所有字段(頭、節點和塊)都使用0和1兩個版本進行復制,以確保原子更新。有關詳細信息,請參見core/tee/fs_htree.c。
元數據解密流程
當需要更新元數據時,PRNG將生成一個新的 Meta IV。Meta IV 的大小在 core/include/tee/fs_htree.h 中定義,元數據和節點數據的數據結構在 fs_htree.h 中定義如下:
struct tee_fs_htree_node_image {uint8_t hash[TEE_FS_HTREE_HASH_SIZE];uint8_t iv[TEE_FS_HTREE_IV_SIZE];uint8_t tag[TEE_FS_HTREE_TAG_SIZE];uint16_t flags;
};struct tee_fs_htree_meta {uint64_t length;
};struct tee_fs_htree_imeta {struct tee_fs_htree_meta meta;uint32_t max_node_id;
};struct tee_fs_htree_image {uint8_t iv[TEE_FS_HTREE_IV_SIZE];uint8_t tag[TEE_FS_HTREE_TAG_SIZE];uint8_t enc_fek[TEE_FS_HTREE_FEK_SIZE];uint8_t imeta[sizeof(struct tee_fs_htree_imeta)];uint32_t counter;
};
塊數據(Block Data)解密流程
當需要更新塊數據時,PRNG將生成新的 Block IV。Block IV 的大小在core/include/tee/fs_htree.h中定義。
原子操作
根據原子性的GlobalPlatform可信存儲要求,以下操作應支持原子更新:
Write, Truncate, Rename, Create and Delete
?
總結
以上是生活随笔為你收集整理的【OP-TEE】安全存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教你做Ghost系统盘--Windows
- 下一篇: Educational Codeforc