(中國電信股份有限公司廣州研究院,廣東 廣州 510630)
基于TEE的移動終端數據安全研究與實現
陳淑珍,楊敏維,何峣
(中國電信股份有限公司廣州研究院,廣東 廣州 510630)
分析對比了移動終端數據安全的3種實現方式,提出了基于TEE的移動終端數據安全框架,并探討了典型TEE移動支付方案。在典型方案基礎上,創新性地提出了基于TEE的指紋動態調整支付額度的業務方案,最后給出了核心代碼實現。
移動終端;數據安全;移動支付;TEE
隨著移動互聯網及移動支付的普及,移動終端數據安全日益重要。由全球平臺組織(Global Plantform,GP)制定并推進的可信執行環境 (trusted execution environment,TEE)標準,是面向移動終端,由硬件實現,通過開辟移動終端主處理器內部的安全區域,提供一個隔離的可信執行環境。 終端通過分離 TEE和 REE (rich execution environment,富執行環境)的軟硬件資源,實現對敏感數據的存儲與保護,確保TEE內代碼和數據的安全性、機密性以及完整性。TEE的安全級別比REE安全級別更高,能夠滿足大多數應用的安全需求。
特別在移動支付、移動辦公等對安全需求較高的領域,將指紋識別+TEE等技術引入移動終端,是一種更安全的數據安全保護機制,也成為產業鏈眾多終端廠商的選擇。
目前,產業鏈實現移動終端數據安全的方式主要有如下3種,如圖1所示。
(1)單域應用級

圖1 移動終端數據安全3種實現方式
單域應用級的安全機制就是permission機制。應用訪問系統敏感數據或者特權資源,必須在 AndroidManifest. xml配置文件中進行權限申請,并在安裝時由用戶決定是否賦予相應的權限。單域應用級數據安全分為兩種方式:應用級容器和雙容器。應用級容器采用完全的應用層數據隔離,提供基礎加解密功能,如沙箱技術、權限管控、SEAndroid等;雙容器基于系統層的雙存儲空間,實現數據軟隔離,如LXC、Docker Cgroups技術等。市面上終端廠商實采用單域應用級方式實現“隱私空間”,完成數據加解密和隔離存儲,如三星GalaxyS4/5的KNOX應用。
(2)雙域系統級
基于系統層的雙存儲空間,實現數據軟隔離。雙域系統級數據安全分為兩種方式:操作系統虛擬化和雙操作系統。操作系統虛擬化是同一個操作系統,為不同應用創建隔離的、獨立的執行環境,并賦予不同的權限。雙操作系統是同一個公共內核、REE內,分別安裝兩個不同的操作系統,實現數據軟隔離。市面上主流安全終端,均基于雙域系統構建了安全辦公環境、安全支付環境,如酷派鉑頓。
(3)TEE芯片硬件級
基于芯片的雙操作系統,實現數據硬隔離。TEE芯片硬件級與雙域系統級的最大區別是:TEE是硬件實現,集成在移動終端處理器內部,硬件隔離出兩個執行環境:REE和TEE,是獨立的兩個安全體系。REE是普通的非保密執行環境,運行普通終端操作系統,如Android;TEE是安全的保密執行環境,硬件部分以硬件隔離提供基礎安全硬件能力(如安全存儲、安全加密、安全輸入輸出),目前芯片廠商主要采用ARM可信區,技術成熟;軟件部分需加載安全操作系統,如MobiCore、SEAndroid等,并基于安全操作系統與上層應用、REE、SE交互,提供密鑰存儲、密鑰加解密、密鑰驗證、敏感數據存儲、可信應用等系列安全服務。三星Galaxy S3歐版中,普通域安裝Android,安全域(security domain,SD)采用MobiCore安全OS,構建安全的數據版權管理。華為Mate7基于TEE安裝SEAndroid,進行指紋安全存儲等。
移動終端3種數據安全實現方式對比見表1。
由于TEE芯片硬件級可實現數據硬隔離,為數據安全提供更高的安全性,成為了主流數據安全方式。如圖2所示,基于TEE的移動終端數據安全框架主要分為兩部分:TEE遠程管理平臺(TEEM)和TEE終端。

圖2 基于TEE的移動終端數據安全框架
TEEM是指TEE終端遠程管理平臺,負責TEE遠程管理和TA(trusted application,可信應用)的生命周期遠程管理,是TEE能力入口點和安全應用的匯聚點。TEEM通過REE中的 CA(client application,客戶端應用)和TEE客戶端API,對TEE下發管理指令,實現對 TEE的管理與授權。TEEM也接受其他TAM所有方的請求,為其在TEE里創建相應的安全域,且自己也是一個 TAM服務器,可以下載和管理自己安全域及 TA。TEEM主要功能包括:TEE上的可信應用安全/刪除/變更、TEE安全域創建/刪除、TEE初始化/配置等。
TEE終端是指基于TEE的移動終端,是軟件+硬件的全面移動終端安全解決方案。TEE終端分為兩個獨立運行的環境區域:REE和TEE。REE作為普通執行環境,即俗稱的Android系統,是一個開放的系統平臺,可運行豐富的CA,具有通用處理器和硬件環境,負責處理應用業務邏輯和UI;運行TAM業務,負責與TEEM進行通信,同時具有訪問TEE的能力,作為可信任執行環境,相當于硬件上隔離安全區域,加載安全專用系統,具有專用處理器和硬件環境,負責運行簽名的TA,負責數據安全存儲(如根密鑰、指紋等密鑰存儲)、數據安全算法(如加解密)、數據隔離和數據安全訪問等。
基于TEE的移動終端數據安全框架實現了可信應用加載、應用安全訪問、數據安全存儲(如指紋存儲)、數據安全校驗(如指紋校驗、隱私數據加解密保護等)、數據安全算法等,具備安全性、可靠性、可維護性,廣泛應用于移動支付、隱私數據保護、權限管控、移動辦公等業務場景。
4.1 典型TEE移動支付方案
現有移動支付方案中,移動支付應用主要部署在REE,移動應用密鑰主要存儲在后臺系統中,屬于應用級保護,密鑰容易偽造、泄露。典型TEE移動支付方案中,移動支付應用作為可信應用部署在TEE中,并在TEE中完成密鑰存儲、加密服務等功能,密鑰保護等級屬于芯片級保護。
如圖3所示,基于TEE的移動支付方案中,TEE主要完成可信應用(移動支付TA)的安裝部署、安全訪問,并通過生物識別、加密服務、可信UI為移動支付業務提供安全防護。
典型TEE移動支付方案的關鍵流程如下。
(1)可信應用安裝部署
步驟1通過TEEM下發指令給REE,REE承載的CA通過代理訪問TEE,并創建SD。

圖3 典型TEE移動支付方案
步驟2通過向TEE的SD下載安裝移動支付業務的可信應用。
步驟3也可在終端出廠時以預置的方式完成安裝部署。
(2)可信應用安全訪問
步驟4REE承載支付CA,當支付時調用TEE進行身份認證。
(3)TEE安全防護
步驟 5通過生物識別,如指紋存儲,向支付應用提供身份認證。
步驟 6通過安全算法,向支付應用、隱私數據提供可信的加密服務。
步驟7通過可信UI,提供可信的安全輸入。
4.2 創新型TEE指紋動態調整支付額度方案
創新型 TEE指紋動態調整支付額度方案是在典型TEE移動支付方案基礎上,進行創新改進。與典型TEE移動支付方案一樣,在創新型 TEE指紋動態調整支付額度方案中,移動終端也可在TEE部署,運行可信任的移動支付可信應用,并錄入指紋作為身份認證的密鑰。該方案最大的優點和創新點是:利用移動終端TEE可錄入多個指紋的功能,為不同指紋關聯不同授權額度,每個指紋對應一個額度,所有限制額度的處理都在終端側 TEE中完成,與后臺無關,從而彌補通過系統側限制額度導致的改造大、密碼記憶難等方面的不足。創新型TEE指紋動態調整支付額度方案支持多指紋多額度的動態調整,并可隱秘地啟動報警流程等。
(1)指紋授權級別登記流程
指紋授權級別登記流程如圖4所示。
步驟1用戶打開移動支付 CA,觸發指紋授權級別登記的功能,選擇一種級別(正常級別、限制級別 1、限制級別2等)后,CA調用Android的指紋API,提示用戶輸入對應級別的指紋,用戶輸入指紋。
步驟2Android對指紋驗證成功后,CA通知TA本次指紋對應的授權級別。
步驟3TA調用TEE的指紋功能,獲取最后一次成功驗證的指紋 ID,并把指紋 ID與對應的授權級別進行綁定登記,綁定關系存儲在TEE中。用戶可繼續執行步驟1,針對不同的授權級別錄入不同的指紋。
(2)指紋使用流程
指紋使用流程如圖5所示。

圖4 指紋授權級別登記流程

圖5 指紋使用流程
步驟1用戶打開移動支付 CA,在未進入應用主功能界面之前,應用調用Android的指紋API,提示用戶輸入指紋,用戶輸入指紋。
步驟2Android對指紋驗證成功后,應用向TA查詢本次指紋對應的授權級別。
步驟3TA調用TEE的指紋功能,獲取最后一次成功驗證的指紋ID,并從之前的登記記錄中,根據指紋ID查出對應的授權級別。
步驟4TA向應用返回授權級別。
步驟5應用根據授權級別,對余額顯示、支付和轉賬額度進行正?;蛳拗频牟僮?。
步驟6應用根據限制級別中的預先設置,選擇性地向后臺發出報警通知。
基于TEE的移動數據終端安全的核心代碼實現邏輯關系如圖6所示,關鍵實現邏輯包括:TEE初始化、TEE共享內存申請及分配、TEE私有內存數據的保存 (如保存指紋數據、保存指紋對應的支付額度、權限管控等隱私數據)、TEE私有內存數據的讀取、TEE私有內存數據處理(如指紋驗證、權限驗證等)。

圖6 代碼實現邏輯關系
(1)CA側函數調用
/*CA初始化TEE*/
TEEC_InitializeContext(NULL,context);
/*CA申請TEE的共享內存,共享內存是CA和TA之間傳遞數據的“池”*/
TEEC_AllocateSharedMemory(context,SharedMem0);
/*CA設置具體某個命令的輸入字段,輸入字段放置在共享內存*/
TEEC_InvokeCommand(&session, FingerprintSetINparamsCmd,&operation,&origin);
/*CA設置具體某個命令的輸出字段,輸出字段放置在共享內存*/
TEEC_InvokeCommand(&session, FingerprintGetOutparamsCmd,&operation,&origin);
/*CA調用TA,保存指紋*/
TEEC_InvokeCommand(&session, FingerprintStorageCmd,&operation,&origin);
/*CA調用TA,驗證指紋 */
TEEC_InvokeCommand(&session, FingerprintAuthenticateCmd,&operation,&origin);
/*CA調用TA,保存私密數據,如指紋對應的支付額度、權限管控等 */
TEEC_InvokeCommand(&session, FingerprintSetCAdataCmd,&operation,&origin);
/*CA調用TA,獲取私密數據 */
TEEC_InvokeCommand(&session, FingerprintGetCAdataCmd,&operation,&origin);
(2)TA側函數調用
①/*指紋存儲*/
StorageCmd()
{
/*獲取 TA私有內存的全局變量指針 fpdata,fpdata即CA送到TA的數據/*
/*fpdata->fingerprint表示 CA送來的指紋,變量fpdata->appid表示CA送來的應用ID/*
FingerprintParams*fpdata=NULL;
fpdata=(FingerprintParams*)TEE_GetInstanceData();
/*根據摘要算法確定size_hash和block,對CA送來的指紋進行摘要計算,求出hash*/
TEE_AllocateOperation(&operation,HASH_ ALOGORITHMID,TEE_MODE_DIGEST,*size_hash);
…
TEE_DigestDoFinal(operation,fpdata->fingerprint+ i*block,remainder,hash,(size_t*)size_hash);
/*用應用ID和指紋摘要散列構造摘要的唯一存儲文件名,保存摘要*/
filename=fpdata->appid+hash
TEE_OpenPersistentObject(TEE_OBJECT_STORAGE_ PRIVATE,filename,strlen (filename),TEE_DATA_FLAG_ ACCESS_WRITE,(&persistent_storageobj));
TEE_WriteObjectData(persistent_storageobj,hash, size_hash);
}
②/*指紋驗證*/
AuthCmd()
{
/*獲取 TA私有內存的全局變量指針 fpdata,fpdata即CA送到TA的數據/*
/*fpdata->fingerprint表示CA送來的指紋,變量fpdata->appid表示CA送來的應用ID/*
FingerprintParams*fpdata=NULL;
fpdata=(FingerprintParams*)TEE_GetInstanceData();
/*根據摘要算法確定size_hash和block,對CA送來的指紋進行摘要計算,求出hash1*/
TEE_AllocateOperation (&operation, HASH_ ALOGORITHMID,TEE_MODE_DIGEST,*size_hash1);
…
TEE_DigestDoFinal(operation,fpdata->fingerprint+ i*block,remainder,hash1,(size_t*)size_hash1);
/*用應用ID和指紋摘要hash1構造摘要的唯一存儲文件名,取出存儲的指紋摘要*/
filename=fpdata->appid+hash1
TEE_OpenPersistentObject(TEE_OBJECT_STORAGE_ PRIVATE,filename,strlen(filename),TEE_DATA_FLAG_ ACCESS_READ,(&persistent_storageobj));
TEE_ReadObjectData(persistent_storageobj,hash2, *size_hash,&count);
/*對比hash1和hash2,如果相等則通過認證*/
}
③/*保存私密數據,如指紋對應的支付額度、指紋對應的權限、隱私數據等*/
SetdataCmd()
{
/*獲取 TA私有內存的全局變量指針 fpdata,fpdata即CA送到TA的數據*/
FingerprintParams*fpdata=NULL;
fpdata=(FingerprintParams*)TEE_GetInstanceData();
/*判斷fpdata中需要保存的字段,判斷依據:要保存的字段長度不為0,不保存的字段長度為0*/
if(fpdata->字段1長度 !=0){
TEE_OpenPersistentObject(TEE_OBJECT_ STORAGE_PRIVATE,字段1,fpdata->字段1長度,TEE_ DATA_FLAG_ACCESS_WRITE,(&persistent_storageobj));
TEE_WriteObjectData (persistent_storageobj, fpdata->字段1,fpdata->字段1長度);
}
…
}
④/*獲取私密數據*/
GetdataCmd()
{
/*獲取 TA私有內存的全局變量指針 fpdata,fpdata即TA送回CA的數據*/
FingerprintParams*fpdata=NULL;
fpdata=(FingerprintParams*)TEE_GetInstanceData();
/*判斷fpdata中需要保存的字段,判斷依據:要保存的字段長度不為0,不保存的字段長度為0*/
if(fpdata->字段1長度 !=0)
{
TEE_OpenPersistentObject(TEE_OBJECT_STORAGE_PRIVATE,字段1,fpdata->字段1長度,TEE_ DATA_FLAG_ACCESS_READ,(&persistent_storageobj));
TEE_ReadObjectData(persistent_storageobj,fpdata->字段1,fpdata->字段1長度,
&count);
}
…
}
⑤/*CA送數據進TA*/
SetINparamsCmd(uint32_t nParamTypes,TEE_Param pParams[4])
{
/*獲取 TA私有內存的全局變量指針 fpdata,fpdata保存CA送進TA的數據*/
FingerprintParams*fpdata=NULL;
fpdata=(FingerprintParams*)TEE_GetInstanceData();
/*把共享內存中的字段送進TA的變量fpdata中,pParams即共享內存*/
switch(pParams[0].value.a)
{
case字段1:
{
fpdata->字段1長度 =pParams[2].value.a;
fpdata->字段1:=TEE_Malloc(fpdata->字段1長度,0);
TEE_MemMove(fpdata->字段1,pParams[1]. memref.buffer,fpdata->字段1長度);
break;
}
…
}
//將fpdata設置為全局變量,供TA其他函數調用
TEE_SetInstanceData((void*)fpdata);
}
⑥*/*TA送數據回CA*/
GetOutparamsCmd(uint32_t nParamTypes,TEE_Param pParams[4])
{
/*獲取 TA私有內存的全局變量指針 fpdata,fpdata保存TA送回CA的數據*/
FingerprintParams*fpdata=NULL;
fpdata=(FingerprintParams*)TEE_GetInstanceData();
/*把 TA的變量 fpdata的字段送回共享內存中,pParams即共享內存*/
switch(pParams[0].value.a)
{
case字段1:
{
TEE_MemMove(pParams[1].memref.buffer, fpdata->字段1,fpdata->字段1長度);
pParams[2].value.a=fpdata->字段1長度;
break;
}
…
}
}
⑦/*安全算法*/
enum TEE_CRYPTO_ALGORITHM_ID
{
TEE_ALG_AES_ECB_NOPAD=0x10000010,/**<算法:AES_ECB_NOPAD*/
TEE_ALG_DES_CBC_NOPAD=0x10000111,/**<算法:DES_CBC_NOPAD*/
TEE_ALG_RSA_NOPAD=0x60000030,/**<算法:RSA_NOPAD*/
TEE_ALG_MD5=0x50000001,/**<算法:MD5*/
TEE_ALG_SHA1=0x50000002,/**<算法:SHA1*/
TEE_ALG_SHA256=0x50000004,/**<算法:SHA256*/
…
};
在指紋+TEE方案中,將指紋存儲(密鑰存儲)、指紋驗證(密鑰驗證)和可信支付應用加載到基帶芯片的TEE中處理,有助于提升數據安全處理環境的安全級別至CC EAL2+,是當前移動終端數據安全的主流選擇。未來伴隨著移動支付技術的迅猛發展和安全需求的不斷升級,運營商著重考慮結合SIM卡的SE安全能力,通過指紋+TEE+ SE方案,將數據安全處理環境的安全級別從CC EAL2+提升至CC EAL5+。指紋+TEE+SE方案還有助于運營商管控SIM卡,并提供TEE+SE的差異化安全能力,形成機卡一體化的移動終端數據安全解決方案,這必將是未來運營商在移動終端數據安全上的重要布局。
[1]張大偉,郭烜,韓臻.安全可信智能移動終端研究[J].中興通信技術,2015,21(5):39-44. ZHANG D W,GUO X,HAN Z.Security and trusted intelligent mobile terminal[J].ZTE Technology Journal,2015,21(5):39-44.
[2]郭茂文.基于FIDO協議的指紋認證方案研究 [J].廣東通信技術,2016,36(4):2-5. GUO M W.Research on fingerprint authentication scheme based on FIDO protocol[J].Guangdong Communication Technology,2016, 36(4):2-5.
[3]國煒,王宗岳.移動終端安全隔離技術分析 [J].移動通信, 2016,40(21). GUO W,WANG Z Y.Analysis on security isolation techniques on mobile terminal[J].Mobile Communications,2016,40(21).
[4]范冠男,董攀.基于TrustZone的可信執行環境構建技術研究[J].信息網絡安全,2016(3). FAN G N,DONG P.Research on trusted execution environment building technology based on TrustZone[J].Netinfo Security, 2016(3).
[5]紀祥敏,趙波,陳璐,等.基于信任擴展的可信云執行環境[J].華中科技大學學報(自然科學版),2016,44(3):105-109. JI X M,ZHAO B,CHEN L,et al.Trusted cloud execution environment based on trust extension[J].Journal of Huazhong University of Science and Technology(Nature Science Edition), 2016,44(3):105-109.
[6]包依勤.TrustZone技術在Android系統中的安全性研究[J].物聯網技術,2015(10):70-73. BAO Y Q.Research on the security of TrustZone technology in Android system[J].InternetofThings Technologies,2015(10):70-73.
Research and implementation of data security for mobile term inal based on TEE
CHEN Shuzhen,YANG Minwei,HE Yao
Guangzhou Research Institute of China Telecom Co.,Ltd.,Guangzhou 510630,China
The three kinds of data security scheme for mobile terminal were analyzed and compared.The framework of data security for mobile terminal based on TEE was proposed,and the typical mobile payment scheme based on TEE was discussed.On the basis of the typical scheme,an innovative business p lan based on TEE to ad just the payment amount of fingerprintsdynamically was proposed,and finally the core code was given.
mobile terminal,data security,mobile payment,trusted execution environment
TN929.5
:A
10.11959/j.issn.1000-0801.2017036

陳淑珍(1985-),女,中國電信股份有限公司廣州研究院工程師,主要研究方向為物聯網、安全、測試技術等。

楊敏維(1972-),男,中國電信股份有限公司廣州研究院高級工程師,主要研究方向為物聯網、安全、測試技術等。

何峣(1977-),男,中國電信股份有限公司廣州研究院高級工程師,主要研究方向為物聯網終端通信、安全、測試技術等。
2016-12-14;
2017-01-23