我們通常提到的安卓手機(jī)不僅僅只有安卓系統(tǒng),還有與安全息息相關(guān)的TEE系統(tǒng),當(dāng)然除了這兩個(gè)系統(tǒng)之外,還會(huì)有其他系統(tǒng),在此我僅僅闡述TEE與安卓是如何并存的,先向大家介紹下這兩個(gè)系統(tǒng)如何部署,緊接著從SMC調(diào)度和通信方式,庫(kù)的角度來(lái)分別說(shuō)明兩個(gè)系統(tǒng)的通信機(jī)制,最后為大家簡(jiǎn)單說(shuō)明一下TEE API的GP標(biāo)準(zhǔn)。
1.TEE和安卓架構(gòu)
首先,我們從整體大方向上,先看一下安卓系統(tǒng)和TEE系統(tǒng)是如何并存的。如下圖 1 TEE和安卓系統(tǒng)并存架構(gòu)所示:
圖 1 TEE和安卓系統(tǒng)并存架構(gòu)
上圖中的左半部分非安全側(cè)(Non-secure)就是大家熟悉的安卓系統(tǒng),通常我們稱之為REE,右半部分安全側(cè)(Secure)就是TEE系統(tǒng),目前市場(chǎng)上存在多種TEE系統(tǒng),如高通的QSEE,Trustonic,開(kāi)源的OPTEE等。
圖中的EL0,EL1,EL3是ARM架構(gòu)中的異常等級(jí),其中EL0和EL1是必須實(shí)現(xiàn)的,可以粗略的認(rèn)為EL0是應(yīng)用層,EL1是系統(tǒng)內(nèi)核層,其中最重要的是REE側(cè)EL1中需要部署TEE相關(guān)驅(qū)動(dòng),REE側(cè)最后是通過(guò)該驅(qū)動(dòng),同后面提到的EL3進(jìn)行通信,進(jìn)而完成一些功能的。EL2主要提供對(duì)虛擬化的支持,在本文中先忽略EL2。EL3是比較重要的部分,提供了REE側(cè)(Non-secure)和安全側(cè)(Secure)的功能切換。從圖中也可以看出,只有EL3橫跨REE側(cè)和安全側(cè),從而為這兩個(gè)系統(tǒng)提供了通信的接口,比如我們常用的指紋功能和支付功能就需要REE側(cè)和安全側(cè)交互的,后面內(nèi)容中我會(huì)給大家具體闡述兩個(gè)系統(tǒng)的通信。
在ARM提供的Trustzone白皮書(shū)中有提到,為了使系統(tǒng)更加健壯,建議EL3中的Monitor模式在執(zhí)行時(shí),關(guān)閉中斷。
2.SMC
在此我首先強(qiáng)調(diào)一點(diǎn),TEE系統(tǒng)和安卓系統(tǒng)是兩個(gè)完全獨(dú)立的系統(tǒng),這兩個(gè)系統(tǒng)獨(dú)立運(yùn)行。但在實(shí)際實(shí)用中,這兩個(gè)系統(tǒng)需要進(jìn)行通信,比如我們手機(jī)鎖屏或者使用指紋進(jìn)行解鎖時(shí),均需要安卓系統(tǒng)和TEE系統(tǒng)共同配合完成,其通信是通過(guò)SMC指令來(lái)完成的,其本質(zhì)上就是觸發(fā)一個(gè)SMC的中斷(如下圖2中紅色框中所示),從而讓安卓或者TEE跳轉(zhuǎn)到Monitor模式(下圖中的Monitor/Firmware),而SMC的中斷處理類似于系統(tǒng)中的上下文切換。
圖 2 環(huán)境切換
至此大家應(yīng)該對(duì)SMC有了簡(jiǎn)單的認(rèn)識(shí),但在此我需要明確一點(diǎn),進(jìn)入Monitor模式并非只有SMC一種方式,比如直接寫(xiě)寄存器CPSR等。
3. REE/TEE傳輸方式
上面簡(jiǎn)單說(shuō)明了SMC,那當(dāng)REE和TEE側(cè)要進(jìn)行數(shù)據(jù)傳輸時(shí),又該如何處理呢?在現(xiàn)有的處理方案中采用了共享內(nèi)存,包括靜態(tài)的共享內(nèi)存和動(dòng)態(tài)的共享內(nèi)存。由于靜態(tài)的共享內(nèi)存是REE側(cè)和TEE側(cè)約定好的一塊共享內(nèi)存,不管是否需要,都會(huì)預(yù)留一塊區(qū)域,比較浪費(fèi)內(nèi)存。動(dòng)態(tài)共享內(nèi)存,操作步驟較復(fù)雜,需要我們先申請(qǐng)內(nèi)存,再進(jìn)行mmap映射(TEE側(cè)和REE側(cè)都需要進(jìn)行映射)),然后通過(guò)共享內(nèi)存進(jìn)行數(shù)據(jù)傳輸。
那大家再思考一個(gè)問(wèn)題, TEE側(cè)傳輸數(shù)據(jù)到REE側(cè)和REE側(cè)傳輸數(shù)據(jù)到TEE側(cè)時(shí),其共享內(nèi)存分別是由誰(shuí)申請(qǐng)的?解答此問(wèn)題前,我需要引入一個(gè)Session的名詞,TEE側(cè)和REE側(cè)通信前都需要建立一個(gè)Session,在REE側(cè)建立Session時(shí),共享內(nèi)存就準(zhǔn)備好了,之后不管數(shù)據(jù)是從哪邊傳遞到哪邊,均使用的是之前已經(jīng)準(zhǔn)備好的共享內(nèi)存。
大家有機(jī)會(huì)看CA(REE側(cè)的一個(gè)可執(zhí)行程序)的代碼,會(huì)發(fā)現(xiàn)都會(huì)先建立Session,之后就可以進(jìn)行響應(yīng)的業(yè)務(wù)處理。目前市場(chǎng)有不同的TEE廠商,他們實(shí)現(xiàn)細(xì)節(jié)會(huì)存在一些差異,但其思路都是一致的。
4. 庫(kù)
一般TEE廠家會(huì)給我們提供TEE相關(guān)的庫(kù),這個(gè)庫(kù)里面會(huì)通過(guò)調(diào)用TEE對(duì)應(yīng)驅(qū)動(dòng)進(jìn)而完成各項(xiàng)功能。通常在開(kāi)發(fā)需要TEE環(huán)境的程序時(shí),最好可以找對(duì)應(yīng)TEE廠家索要Demo,有這個(gè)Demo后,我們就知道該如何基于對(duì)應(yīng)的TEE進(jìn)行程序開(kāi)發(fā)。
5.GP
我在同一些從事安卓的朋友交流時(shí),發(fā)現(xiàn)他們要么是不知道TEE,要么是知道TEE,但不知道GP。試想一下,市場(chǎng)上存在很多TEE廠商,比如我們熟悉的豆莢,Trustonic等,每一家都有他們獨(dú)有的API接口,那對(duì)于一些基于TEE的功能,如指紋,支付等,那是不是需要針對(duì)每一個(gè)TEE,要進(jìn)行不同的適配?而GP全稱是Global Platform,它提供了一些安全相關(guān)的API要求,假如所有項(xiàng)目上均采用GP的方式,那基于TEE的模塊(如常見(jiàn)的指紋,支付等),就無(wú)需做很大的改動(dòng),且在同這類供應(yīng)商溝通時(shí),需要告知供應(yīng)商,當(dāng)前項(xiàng)目上是否采用GP接口的方式。
總結(jié)
至此,我已經(jīng)介紹了我們需要知道的五大要素,此時(shí),我們來(lái)思考一下,假如我的項(xiàng)目上需要增加指紋功能,我需要做什么工作呢?
- TEE環(huán)境的部署,包含TEE系統(tǒng)本身,Monitor, REE側(cè)同TEE相關(guān)的驅(qū)動(dòng),庫(kù)等,其他的細(xì)節(jié)可以同TEE供應(yīng)商溝通。
- 同指紋廠商溝通,告知其項(xiàng)目上使用的TEE系統(tǒng)和TEE版本是否采用GP接口,項(xiàng)目上采用的指紋器件型號(hào)等。
本文中,我把TEE拆分為五要素,但實(shí)際上,TEE系統(tǒng)遠(yuǎn)比本文介紹的要復(fù)雜,希望大家可以通過(guò)本文對(duì)TEE有一個(gè)大框架的認(rèn)識(shí),在此基礎(chǔ)上,可以繼續(xù)深入研究。
作者介紹
趙青窕,51CTO社區(qū)編輯,從事多年驅(qū)動(dòng)開(kāi)發(fā)。研究興趣包含安全OS和網(wǎng)絡(luò)安全領(lǐng)域,發(fā)表過(guò)網(wǎng)絡(luò)相關(guān)專利。