TEEOS基礎(chǔ)特性安全存儲(chǔ)技術(shù)簡介
1、安全存儲(chǔ)簡介
安全存儲(chǔ)是TEEOS重要特性之一,安全存儲(chǔ)主要用來為用戶保存敏感數(shù)據(jù)如密鑰等信息。用戶在使用安全存儲(chǔ)功能保存數(shù)據(jù)時(shí)會(huì)在TEE內(nèi)對(duì)數(shù)據(jù)進(jìn)行加密,然后保存到REE側(cè)的相關(guān)存儲(chǔ)區(qū)域中。根據(jù)對(duì)數(shù)據(jù)存儲(chǔ)的安全性要求和使用場景TEE常見的安全存儲(chǔ)一般分為RPMB安全存儲(chǔ)、SFS安全存儲(chǔ)。RPMB安全存儲(chǔ)是eMMC中的一個(gè)具有安全特性的分區(qū),其特點(diǎn)是非安全世界不可見,可以防止重放和回滾攻擊,但是其容量較小所以一般對(duì)于安全性要求高的數(shù)據(jù)會(huì)使用RPMB存儲(chǔ)。SFS安全存儲(chǔ)是利用了REE側(cè)文件系統(tǒng)進(jìn)行存儲(chǔ)服務(wù),TEE加密后的數(shù)據(jù)會(huì)利用非安全側(cè)的文件系統(tǒng)存放到REE側(cè)的存儲(chǔ)介質(zhì)中,因此其容量很大可以存放較多的文件,但是由于其利用了非安全側(cè)的文件系統(tǒng),因此存放的文件是REE側(cè)可見的,安全性相比RPMB較低。
本文將對(duì)OPTEE3.18版本中的SFS安全存儲(chǔ)基本實(shí)現(xiàn)來進(jìn)行分析,后文中的安全存儲(chǔ)均指SFS安全存儲(chǔ),安全存儲(chǔ)的整體框架如圖1.1所示:

圖1.1 安全存儲(chǔ)框架
OPTEE在用戶態(tài)提供了GP安全存儲(chǔ)API,TA調(diào)用GP API來對(duì)需要保存的數(shù)據(jù)進(jìn)行操作,具體的功能實(shí)現(xiàn)在OPTEE內(nèi)核態(tài)的File system模塊中實(shí)現(xiàn),內(nèi)核態(tài)的File system模塊主要實(shí)現(xiàn)了數(shù)據(jù)加解密相關(guān)功能以及對(duì)應(yīng)密文數(shù)據(jù)RPC消息發(fā)送功能。REE側(cè)的守護(hù)進(jìn)程tee_supplicant主要完成的是RPC消息接收以及安全存儲(chǔ)文件在REE側(cè)的操作功能。
OPTEE 安全存儲(chǔ)所涉及到的主要文件如圖1.2所示:

圖1.2安全存儲(chǔ)文件目錄
2、安全存儲(chǔ)文件操作
圖2.1列出了安全存儲(chǔ)文件操作的GP接口及相關(guān)系統(tǒng)調(diào)用關(guān)系圖,syscall開頭的函數(shù)是安全存儲(chǔ)GP API功能在OPTEE內(nèi)核中的具體實(shí)現(xiàn)。接下來我們對(duì)安全存儲(chǔ)中的文件格式、基本數(shù)據(jù)結(jié)構(gòu)以及文件的創(chuàng)建過程進(jìn)行分析。

圖2.1 安全存儲(chǔ)api
2.1 安全存儲(chǔ)文件格式及主要數(shù)據(jù)結(jié)構(gòu)
安全存儲(chǔ)的文件格式如圖2.2所示,主要分為三個(gè)部分,分別是文件頭信息,文件節(jié)點(diǎn)描述信息,以及數(shù)據(jù)體信息,其中數(shù)據(jù)體data block是以4K大小粒度存儲(chǔ)的。OPTEE使用哈希二叉樹方式管理安全存儲(chǔ)的文件數(shù)據(jù),樹中的每個(gè)節(jié)點(diǎn)tee_fs_htree_node_image保護(hù)其兩個(gè)子節(jié)點(diǎn)和一個(gè)數(shù)據(jù)塊。元數(shù)據(jù)存儲(chǔ)在頭節(jié)點(diǎn)tee_fs_htree_image中,它也保護(hù)頂層節(jié)點(diǎn)。安全存儲(chǔ)的文件格式所有字段都使用兩個(gè)版本ver0 ver1進(jìn)行復(fù)制管理從而確保了原子更新。

圖2.2 文件格式
頭節(jié)點(diǎn)tee_fs_htree_ image結(jié)構(gòu)體具體定義如下,其中iv是加密head時(shí)使用的,tag是加密head后生成的,enc_fek是加密數(shù)據(jù)文件的密鑰fek的密文數(shù)據(jù),imeta是加密head后生成的,counter是ver信息,標(biāo)識(shí)存儲(chǔ)到ver0還是ver1中。

節(jié)點(diǎn)tee_fs_htree_node_image結(jié)構(gòu)體具體定義如下,hash是保存節(jié)點(diǎn)的hash值,該值主要作用是在文件操作時(shí)找到該文件head,iv是加密data bloc使用的,不同的data block對(duì)應(yīng)的iv值不同,tag是加密數(shù)據(jù)塊后生成的,flags標(biāo)識(shí)data block的版本號(hào)信息。

另一個(gè)主要的結(jié)構(gòu)體tee_fs_fd具體定義如下,主要存放對(duì)文件操作時(shí)使用的fd、dir、uuid等信息。

2.2 安全文件操作
本節(jié)主要對(duì)OPTEE安全存儲(chǔ)文件基本操作過程安全存儲(chǔ)文件的創(chuàng)建、打開、讀寫過程進(jìn)行分析。
(1)安全存儲(chǔ)文件創(chuàng)建:安全存儲(chǔ)文件創(chuàng)建流程是整個(gè)文件操作最復(fù)雜的流程,安全存儲(chǔ)文件創(chuàng)建流程如圖2.3所示。當(dāng)?shù)谝淮问褂冒踩鎯?chǔ)功能保存用戶文件時(shí),將會(huì)在/data/tee目錄中生成兩類文件分別是dirf.db文件和以數(shù)字命名的文件,數(shù)字命名的文件會(huì)根據(jù)創(chuàng)建的不同文件名稱進(jìn)行累加。dirf.db文件保存的是整個(gè)安全存儲(chǔ)功能管理的所有文件的目錄信息和節(jié)點(diǎn)信息,該文件只會(huì)被創(chuàng)建一次,后續(xù)對(duì)文件的操作將會(huì)更新dirf.db內(nèi)容,以數(shù)字命名的文件保存的是用戶文件信息。OPTEE對(duì)用戶文件進(jìn)行基本操作都需要通過對(duì)dirf.db文件進(jìn)行索引來找到所需要的具體用戶文件。syscall_storage_obj_create是安全存儲(chǔ)創(chuàng)建文件功能在內(nèi)核空間的主入口。下面對(duì)創(chuàng)建過程主要流程進(jìn)行分析。
權(quán)限檢查:在創(chuàng)建安全文件之前會(huì)通過vm_check_access_rights函數(shù)對(duì)TA調(diào)用安全存儲(chǔ)操作的object權(quán)限進(jìn)行校驗(yàn),只有當(dāng)權(quán)限校驗(yàn)通過后才會(huì)執(zhí)行后續(xù)操作。
dirt.db文件創(chuàng)建:get_dirh是創(chuàng)建dirt.db主要實(shí)現(xiàn),tee_fs_rpc_create_dfh函數(shù)在首次創(chuàng)建dirt.db文件時(shí),通知ree側(cè)tee_supplicant創(chuàng)建該文件,tee_fs_htree_open建立文件節(jié)點(diǎn)信息。tee_fs_htree_sync_to_storage主要是將tee_fs_htree_node_image及tee_fs_htree_ image信息存放到dirt.db中。
安全文件創(chuàng)建:安全文件創(chuàng)建通過ree_fs_open_primitive實(shí)現(xiàn)的,該流程會(huì)通知ree側(cè)tee_supplicant創(chuàng)建以數(shù)字命名的文件,此時(shí)該文件中還沒有寫入具體的數(shù)據(jù)信息。
安全文件寫入:安全文件head及data block寫入通過ree_fs_write_primitive實(shí)現(xiàn)的,最終完成文件的創(chuàng)建過程,將初始化的數(shù)據(jù)寫入到ree側(cè)。

圖2.3安全文件創(chuàng)建流程
(2)安全存儲(chǔ)文件打開:當(dāng)需要打開某個(gè)安全存儲(chǔ)文件時(shí),需要先從全局目錄文件dirt.db中找到對(duì)應(yīng)的以數(shù)字命名的文件編號(hào),打開dirf.db是通過調(diào)用get_dirt函數(shù)實(shí)現(xiàn)的,最終調(diào)用到REE側(cè)的tee_supplicant打開/data/tee/dirf.db文件并返回該文件的fd值,讀取dirt.db中最新的文件頭部數(shù)據(jù),解密獲取文件加解密使用的FEK,并建立文件節(jié)點(diǎn)樹,打開dirf.db文件并建立了文件節(jié)點(diǎn)樹后,通過讀取dirf.db文件的數(shù)據(jù)區(qū)域中安全文件對(duì)應(yīng)的dirf_entry來找到該安全文件的存儲(chǔ)編號(hào)。在獲取安全存儲(chǔ)文件編號(hào)前需要進(jìn)行一系列校驗(yàn)檢查,檢查通過后則為正確的文件編號(hào)。得到安全文件編號(hào)后就可打開該文件,讀取該安全文件的頭部分,獲取根節(jié)點(diǎn)信息,并建立該安全文件的節(jié)點(diǎn)樹,然后就可開始對(duì)該安全文件進(jìn)行讀寫操作。
(3)安全存儲(chǔ)文件讀寫操作:安全存儲(chǔ)讀寫操作依賴打開操作,只有在執(zhí)行完打開操作之后才能進(jìn)行。安全文件讀操作首先會(huì)獲取TA的會(huì)話ID和運(yùn)行上下文并檢查權(quán)限。然后調(diào)用ree_fs_read函數(shù)來實(shí)現(xiàn)讀取數(shù)據(jù)的操作,調(diào)用ree_fs_write函數(shù)來實(shí)現(xiàn)寫入數(shù)據(jù)操作。
3、安全存儲(chǔ)文件加密流程
3.1安全存儲(chǔ)中的密鑰
在OPTEE的安全存儲(chǔ)中主要涉及三種類型密鑰分別是SSK安全存儲(chǔ)密鑰、TSK TA的存儲(chǔ)密鑰、FEK文件加密密鑰三者關(guān)系如圖3.1所示。其中huk是芯片唯一密鑰,其通過chipid及其他相關(guān)參數(shù)派生出安全存儲(chǔ)的基礎(chǔ)密鑰SSK。針對(duì)不同的TA,根據(jù)uuid值及SSK派生出每個(gè)TA自己的存儲(chǔ)密鑰TSK。這樣能夠保證不同的TA加密存儲(chǔ)的文件不能被其他文件解密,在一定程度上保證了安全性。TSK并不是最終對(duì)文件加密的密鑰,而是對(duì)隨機(jī)派生出的文件加密密鑰FEK進(jìn)行加解密的key。三種類型密鑰中SSK TSK無論明文密文都不出TEE,F(xiàn)EK密文與數(shù)據(jù)密文封裝到一起存儲(chǔ)到REE側(cè)文件系統(tǒng)中。

圖3.1密鑰關(guān)系圖
3.2 安全存儲(chǔ)文件加密流程
安全存儲(chǔ)中的核心操作是對(duì)安全文件進(jìn)行加解密操作,需要加密操作的數(shù)據(jù)分別為元數(shù)據(jù)加密,以及具體的數(shù)據(jù)區(qū)塊進(jìn)行加密。元數(shù)據(jù)及區(qū)塊數(shù)據(jù)加密流程如圖3.2所示,元數(shù)據(jù)是tee_fs_hreee_node_image中的數(shù)據(jù),加密過程中會(huì)首先生成隨機(jī)的AES密鑰FEK,該值一般以enc_fek的形式保存,在使用時(shí)通過TSK解密后使用。數(shù)據(jù)塊區(qū)域是具體需要保存的用戶數(shù)據(jù)信息和tee_fs_htree_node_image中的數(shù)據(jù)。元數(shù)據(jù)和區(qū)塊數(shù)據(jù)的加密算法在OPTEE中都采用AES GCM算法,采用的KEY都是FEK,不同的是在加密過程中有各自不同的IV值。

圖3.2 元數(shù)據(jù) 區(qū)塊數(shù)據(jù)加密流程
4、總結(jié)
安全存儲(chǔ)功能是TEEOS中的重要功能,不同TEE產(chǎn)品有不同實(shí)現(xiàn)。本文對(duì)OPTEE安全存儲(chǔ)SFS部分進(jìn)行了簡單的分析,我們發(fā)現(xiàn)安全存儲(chǔ)操作涉及到的流程是比較復(fù)雜的,其中涉及到了加解密密鑰派生方式,數(shù)據(jù)加解密算法的選擇,數(shù)據(jù)文件管理的方式,TEE主動(dòng)與REE交互方式等功能。這些部分均影響著安全存儲(chǔ)的安全性穩(wěn)定性和性能。OPTEE安全存儲(chǔ)雖然對(duì)各個(gè)數(shù)據(jù)文件是分開存儲(chǔ)的,但是對(duì)文件操作的索引信息又是集中存儲(chǔ)到了dirt.db中,因此當(dāng)dirt.db文件損壞時(shí)將會(huì)導(dǎo)致所有的文件無法讀取的風(fēng)險(xiǎn)。因此在實(shí)際使用OPTEE時(shí)可以考慮定制化修改,對(duì)該文件在REE側(cè)不同分區(qū)進(jìn)行備份操作。
5、參考資料
1.《手機(jī)安全和可信應(yīng)用開發(fā)指南》
2.https://optee.readthedocs.io/en/latest/architecture/secure_storage.html
3.https://blog.csdn.net/xcxhzjl/article/details/127257463
4. https://github.com/OP-TEE/optee_os
5. https://schspa.tk/2020/01/10/persistent-object.html
6.https://blog.csdn.net/xy010902100449/article/details/124551205