天天看點

trust zone之我見

老闆交待任務,這個星期我都在研究trust zone的東東,之前有看過代碼,但沒有深入了解!

好吧,這次看來我要跟它杠上了。

網上有很多資料,但很多講得太抽象,至少對門外漢來說有些難以了解,我估計有些文單可能翻譯過來的吧,有些拗口。

在介紹trust zone之前!我們來看兩個字,慢慢引導大家trust zone與之前的安全方式有何不同?

trust zone之我見

好吧,太熟悉了,你有多少密碼?QQ密碼有沒有?銀行密碼有沒有?支付寶密碼有沒有?

那你怎麼保證你的密碼安全?

trust zone之我見
trust zone之我見

that is all,夠了嗎?

還記得11年的CSDN密碼事件嗎?我也是受害者。

事實證明,還要靠服務商!他們把我們的密碼記錄在磁盤上,一但被黑客讀取破解。

trust zone之我見

.

trust zone之我見

系統這塊--->比如各種防火牆,各種安全機制。

密碼加密--->比如用各種方法加密,越複雜越好,密鑰鬼長鬼長的。

其實我們知道,是軟體就有漏洞,遲早被破解。

是以人們轉向安全晶片的研制:

即:TPM(Trusted Platform Module)

就是加密解密動作在晶片中進行,甚至可把資訊存儲在晶片裡。

理論上來說隻有晶片才能解密。但是TPM沒有辦法保護運作時攻擊,比如黑客在你運作進破解,直接去記憶體讀你解密過的東西,這樣TPM就形同虛設了。

trust zone之我見

那麼下面的trust zone則完全不同,它從硬體角度做到安全。即受它保護的硬體,就算黑客root了你的裝置也沒辦法通路的,隻有生産者自己寫的trust app才能通路。

而且secure boot技術保證了别人沒辦法竄改你的image。

從下面圖可知:

trust zone之我見

入侵系統後,通常喜歡從記憶體,硬碟擷取資訊,有些木馬還能通過截取你的touch或者display内容擷取資訊。

這樣你防不勝防,除非你不要開機。

trust zone之我見

什麼是trust zone?

Trust zone 是ARM核心中新添加一種架構,從ARM v6KZ開始。

支援這種功能的CPU會跑在兩個世界,普通世界/安全世界。

android跑起後CPU跑在普通世界,運作的是普通世界的APP,當SMC系統調用觸發進入安全世界時,CPU跑在安全世界,運作安全世界的APP,安全世界APP裡所用到的資源,包括記憶體,cache,touch,display,普通世界的app是不能夠通路的,攻擊者沒辦法拿到敏感資訊

那trust zone怎麼做隔離?

ARM架構上:

trust zone之我見

第一:the core AXI bus:AXI總線,增加一條控制線。

第二:ARM core,可支援虛拟化核

第三:Trust zone Address Space controller:TZASC

第四:Trust zone protection controller:TZPC

TZMA,APB-to-AXI是可選的看SOC是否支援保護外設功能

軟體上:

軟體上就是基于第二點可虛拟化核心,加上SMC系統調用,使CPU進入安全世界,跑安全世界的APP。

基于上述架構加上SMC調用就可以做安完全隔離了。

先談談AXI總線

是記憶體,片内靜态RAM ROM,外設隔離的基礎。

主要原理是:AXI總線上每個讀寫信道都增加了一個額外的控制信号

AWPROT[1]:總線寫事務控制信号---低電平為安全寫事物,高電平為非安全寫事物

ARPROT[1]:總線讀事物控制信号---低電平為安全讀事物,高電平為非安全讀事物

當裝置向總線提出讀寫事物請求時必須将控制信号發送到總線上。總線根據這個信号和CPU目前的世界來判斷能否讀寫。防止非安全程式/裝置讀寫安全裝置。

基于AXI總線,記憶體,片内靜态RAM ROM是如何隔離的?

TrustZone通過兩個裝置來保障實體記憶體的安全

一個是TrustZone位址空間控制器(TZASC)

一個是TrustZone存儲擴充卡(TZMA)

如下圖:

trust zone之我見
trust zone之我見

TZASC是AXI總線的主裝置,用它可以把記憶體位址空間劃分一系列的記憶體空間,通過運作在安全世界的軟體把部分空間配置為安全、非安全的,TZASC防止非安全事物通路安全記憶體空間。

使用TZASC的主要目的就是AXI的從裝置分區為幾個安全裝置,防止非安全事物通路安全裝置。ARM的DMC本身不支援建立安全,非安全區,為此需要連接配接到TZASC上。

注:ZASC隻用來支援存儲映射裝置,不能用于塊裝置,比如NAND FLASH

TZMA是AXI總線的主裝置,用它來劃分片内RAM,ROM的安全區間

基于AXI總線,外設是如何隔離的?

看上圖,由于APB總線沒有AXI總線有trustzone安全相關的控制信号,需要APB-to-AXI橋負責,外設還是與APB連接配接,APB-to-AXI橋有上TZPCDECPORT信号輸入,用它來決定配置外設是安全的,非安全的。APB-to-AXI橋杜絕非安全事物通路外設

TZPCDECPORT輸入信号可以在SoC設計時靜态地設定,也可以通過對TrustZone保護控制器(TZPC)進行程式設計,在程式運作時動态地設定,也就是說通過TZPC可能動态配置外設是安全的,非安全的。

另外:cache和記憶體為了支援trustzone安全政策,需要做些擴充。

cache的tag都增加了NS位,用于辨別這一行的安全狀态,NS=0這一行處于安全狀态,NS=1這一行處于非安全狀态。

MMU的TLB的tag增加NSTID位,功能與NS一樣

現在已經了解trustzone保護記憶體外設的基本思想。

從上面已經知道,隻有安全世界才能起保護作用,那如何進入安全世界的呢?

引入特殊機制--監控模式,負責不同執行環境切換。

如下圖:普通世界是如何進入安全世界得到服務的。

第一:運作在普通世界使用者模式的APP進入特權模式

第二:該模式下調用SMC進入安全世界的monitro模式

第三:安全世界的monitor儲存普通世界的上下文,然後進入安全世界的特權模式

第四:然後進入安全世界的使用者模式,執行相應的安全服務

從下面小框框得知:除了軟體調用SMC,還有外部各種異常都可以進入monitor模式,不過這些異常需要配置才能使用

trust zone之我見

上面通過SMC進入Secure world,那麼ARM處理器如何知道目前是什麼狀态?

支援trustzone的ARM處理器的協處理器CP15有個安全配置寄存器(SCR),該寄存器有個NS位,這個NS位指明目前系統狀态。

如果NS=0,系統處于安全狀态,NS=1,系統處于非安全狀态。當系統處于monitor模式,不管NS=0,1,都可以通路所有安全環境的資源,這個NS不僅影響CPU核心,記憶體子系統,還影響外設工作,是支援trustzone功能的關鍵擴充。從上圖可知,系統的安全狀态與系統的應用模式和特權模式無關,也就是說應用程式運作在非安全态,不管是使用者模式還是特權模式,都是屬于非安全世界。反之安全世界的應用程式也有應用模式與特權模式。兩個世界都有應用和特權模式,每種模式所具有的權限是不同的,NS位隻能被運作在安全世界處于特權模式的軟體改變,系統在非安全狀态時不能通路SCR寄存器。

關于進入monitor模式方式的祥細說明

如下圖:

trust zone之我見

1:SMC是一個特殊指令,類似于軟體中斷指令(SWI),通過它來進入mointor模式

2:外部中止預取指令外部中止和資料中止,外部中止是通路存儲系統時發生,但不被MMU所檢測到異常,通常發生在普通世界通路安全世界資源時發生。

3:中斷,包括FIQ,IRQ。

其中第一種進入monitor模式是無條件的,後面兩種情況依賴于SCR寄存器相關配置

*EA,=0,表示發生外部中止時處理器進入中止模式,=1,表示發生外部中止時處理器進入monitor模式。

*IRQ,=0,表示發生IRQ時處理器進入中止模式,=1,表示發生IRQ時處理器進入monitor模式。

*FIQ,=0,表示發生FIQ時處理器進入中止模式,=1,表示發生FIQ時處理器進入monitor模式。

我們知道了如何通過monitor模式,進而進入安全世界,那如何從安全世界傳回到普通世界呢?

答:也得從monitor模式切回來,雖然運作在安全世界的軟體有更改SCR寄存器NS位的權利,但不建議這麼做。因為如果安全環境的軟體在非monitor模式下直接将SCR的NS位設定為1,則系統直接進入非安全狀态,這使得非安全世界有看到正在流水線的指令,以及正在寄存器中的資料的可能,如果這些指令和資料都是敏感資訊的話,這就給系統帶來安全威脅,因為通常隻有monitor可能直接修改主SCR的NS位。

好吧,現在我們已經對trustzone的工作原理有了大緻了解,下面還要補充幾個比較細的知識點

關于trustzone的中斷控制器

在ARM傳統的向量中斷控制器(VIC)基礎上,添加了trustzone中斷控制器(TZIC)。TZIC,VIC控制器通過菊花鍊的方式連接配接組成兩級中斷控制系統,目的是做到普通中斷與安全中斷的隔離,安全中斷不能被普通世界捕獲。TZIC是第一級中斷控制器,所有中斷源的中斷請求都在連在TZIC上的,它最先截獲裝置的中斷請求,通過對TZIC的TZICIntSelect寄存器進行程式設計,可以對中斷源産生的中斷類型進行設定。如果TZICIntSelect中的某一位=1,則相應中斷源請求被配置為FIQ中斷,如果=0,則該中斷源的中斷請求将交由第二級中斷控制器VIC處理。凡是由TZICIntSelect為FIQ中斷的中斷源提出的中斷請求将繞過VIC而直接由TZIC處理,沒有被TZICIntSelect配置為FIQ中斷的中斷源具體會被設定為FIQ還是IRQ,這将由VIC的VICIntSelect寄存器來決定,當然一般情況下應該配置為IRQ,如果被配置為FIQ,中斷請求又将p被回報給TZIC。

TZICIntSelect寄存器複位值=0,也就是說預設所有中斷都交給VIC處理,這樣對不支援trustzone的軟體系統來說,可以把TZIC看作完全透明的。

如下圖所示:

中斷1,中斷2在TZICIntSelect都設定為1,是以直接由TZIC處理了,

中斷3在TZICIntSelect設定為0,交由VIC處理

中斷4在TZICIntSelect設定為0,交由VIC處理,但在VICIntSelect也設定為0,又交還給TZIC了。

最後總結:中斷1,中斷2,中斷4屬于FIQ,中斷3屬于IRQ。

trust zone之我見

關于trustzone的異常向量表

帶trustzone的ARM處理有三個異常向量表,一個普通世界的異常向量表,一個安全世界的異常向量表,一個monitor的異常向量表。

在系統開機時,安全世界的異常向量表基位址是0x00000000或者0xffff0000,取決于處理器輸入信号VINTHI,其它兩個向量表的基位址開機是未定義,使用前必須軟體設定。

與以前的普通ARM處理器不同,每個異常向量表的位置在運作時可以動态移動,将新的異常向量表基位址寫入CP15的VBAR寄存器即可,monitor的向量表基位址由monitor的異常向量表基位址寄存器指定。

另外普通世界與安全世界的向量表基位址除了與VBAR有關,還與處理器的V位有關,v=1,則向量表基位址采用高位址,而與VBAR無關。普通世界與安全世界的V位是獨立的。

好了,基本講完,我講不是很祥細,目的是讓初學者也能按照我的思路慢慢了解trustzone,更專業的知識可以參考其它資料。

謝謝