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