trust zone之我見

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

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

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


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




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

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





that is all,夠了嗎?

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

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


.



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

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

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

所以人們轉向安全芯片的研製:

即:TPM(Trusted Platform Module)

就是加密解密動作在芯片中進行,甚至可把信息存儲在芯片裏。

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




那麼下面的trust zone則完全不同,它從硬件角度做到安全。即受它保護的硬件,就算黑客root了你的設備也沒辦法訪問的,只有生產者自己寫的trust app才能訪問。

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

從下面圖可知:



入侵系統後,通常喜歡從內存,硬盤獲取信息,有些木馬還能通過截取你的touch或者display內容獲取信息。

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


什麼是trust zone?

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

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

android跑起後CPU跑在普通世界,運行的是普通世界的APP,當SMC系統調用觸發進入安全世界時,CPU跑在安全世界,運行安全世界的APP,安全世界APP裏所用到的資源,包括內存,cache,touch,display,普通世界的app是不能夠訪問的,攻擊者沒辦法拿到敏感信息

那trust zone怎麼做隔離?

ARM架構上:




第一: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)


如下圖:





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模式,不過這些異常需要配置才能使用






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

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

如果NS=0,系統處於安全狀態,NS=1,系統處於非安全狀態。當系統處於monitor模式,不管NS=0,1,都可以訪問所有安全環境的資源,這個NS不僅影響CPU內核,內存子系統,還影響外設工作,是支持trustzone功能的關鍵擴展。從上圖可知,系統的安全狀態與系統的應用模式和特權模式無關,也就是說應用程序運行在非安全態,不管是用戶模式還是特權模式,都是屬於非安全世界。反之安全世界的應用程序也有應用模式與特權模式。兩個世界都有應用和特權模式,每種模式所具有的權限是不同的,NS位只能被運行在安全世界處於特權模式的軟件改變,系統在非安全狀態時不能訪問SCR寄存器。


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

如下圖:



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。




關於trustzone的異常向量表

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

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

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

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

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

謝謝

發佈了28 篇原創文章 · 獲贊 10 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章