老闆交待任務,這個星期我都在研究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,更專業的知識可以參考其它資料。
謝謝