- 手機安全和可信應用開發指南:TrustZone與OP-TEE技術詳解
- 帥峰云 黃騰 宋洋
- 5004字
- 2019-01-03 15:01:35
第2章 ARM的TrustZone技術
2.1 TrustZone技術
為提高系統的安全性,ARM早在ARMv6架構中就引入了TrustZone技術,且在ARMv7和ARMv8中得到增強,TrustZone技術能提供芯片級別對硬件資源的保護和隔離,當前在手機芯片領域已被廣泛應用。
2.1.1 片上系統硬件框架
一個完整的片上系統(System on Chip, SoC)由ARM核、系統總線、片上RAM、片上ROM以及其他外圍設備組件構成。只有支持TrustZone技術的ARM核配合安全擴展組件,才能為整個系統提供芯片硬件級別的保護和隔離。如圖2-1所示是個支持TrustZone的SoC的硬件框圖。

圖2-1 SoC硬件框
支持TrustZone技術的ARM核在運行時將工作狀態劃分為兩種:安全狀態和非安全狀態。當處理器核處于安全狀態時只能運行TEE側的代碼,且具有REE側地址空間的訪問權限。當處理器核處于非安全狀態時只能運行REE側的代碼,且只能通過事先定義好的客戶端接口來獲取TEE側中特定的數據和調用特定的功能。
系統通過調用安全監控模式調用(secure monitor call, smc)指令實現ARM核的安全狀態與非安全狀態之間的切換。而ARM核對系統資源的訪問請求是否合法,則由SoC上的安全組件通過判定ARM核發送到SoC系統總線上的訪問請求中的安全狀態讀寫信號位(Non-secure bit, NS bit)來決定。只有當ARM核處于安全狀態(NS bit = 0)時發送到系統總線上的讀寫操作才會被識別為安全讀寫操作,對應TEE側的數據資源才能被訪問。反之,當ARM核處于非安全狀態(NS bit = 1)時,ARM核發送到系統總線上的讀寫操作請求會被作為非安全讀寫操作,安全組件會根據對資源的訪問權限配置來決定是否響應該訪問請求。這也是TrustZone技術能實現對系統資源硬件級別的保護和隔離的根本原因。
2.1.2 ARMv7架構的TrustZone技術
ARMv7架構中使用了TrustZone技術的系統軟件層面的框圖如圖2-2所示。

圖2-2 ARMv7系統軟件框架
在ARMv7架構中CPU在運行時具有不同的特權等級,分別是PL0(USR)、PL1(FIQ/IRQ、SYS、ABT、SVC、UND和MON)以及PL2(Hyp),即ARMv7架構在原有七種模式之上擴展出了Monitor模式和Hyp模式。Hyp模式是ARM核用于實現虛擬化技術的一種模式。系統只有在Monitor模式下才能實現安全狀態和非安全狀態的切換。
當系統在REE側或者TEE側運行時,系統執行smc(安全監控模式調用)指令進入Monitor模式,通過判定系統SCR寄存器中對應的值來確定請求來源(REE/TEE)以及發送目標(REE/TEE),相關寄存器中的值只有當系統處于安全態時才可以更改,關于安全狀態與非安全狀態之間的切換過程,在本書第10章中將進行詳細介紹。
2.1.3 ARMv8架構的TrustZone技術
在ARMv8架構中改用執行等級(Execution Level, EL)EL0~EL3來定義ARM核的運行等級,其中EL0~EL2等級分為安全態和非安全態。ARMv8架構與ARMv7架構中ARM核運行權限的對應關系如圖2-3所示。

圖2-3 ARMv7/v8運行權限對比
ARMv7和ARMv8架構下特權等級和工作模式的對應關系分別如表2-1所示。
表2-1 ARMv7和ARMv8架構下各模式對應關系

ARMv7架構中的PL0(USR)對應ARMv8架構中的EL0, PL1(SVC/ABT/IRQ/FIQ/UND/SYS)對應ARMv8架構中的EL1, ARMv7架構中的Hyp模式對應ARMv8架構中的EL2,而ARMv7架構中的Mon(Monitor)則對應于ARMv8架構中的EL3。
ARMv8架構同樣也是使用安全監控模式調用指令使處理器進入EL3,在EL3中運行的代碼負責處理器安全狀態和非安全狀態的切換,其中關于TEE和REE切換的處理方式與ARMv7架構中Monitor模式下的處理方式類似,本書第10章將結合實際代碼進行詳細分析。
2.2 ARM安全擴展組件
TrustZone技術之所以能提高系統的安全性,是因為對外部資源和內存資源的硬件隔離。這些硬件隔離包括中斷隔離、片上RAM和ROM的隔離、片外RAM和ROM的隔離、外圍設備的硬件隔離、外部RAM和ROM的隔離等。實現硬件層面的各種隔離,需要對整個系統的硬件和處理器核做出相應的擴展。這些擴展包括:
□ 對處理器核的虛擬化,也就是將AMR處理器的運行狀態分為安全態和非安全態。
□ 對總線的擴展,增加安全位讀寫信號線。
□ 對內存管理單元(Memory Management Unit, MMU)的擴展,增加頁表的安全位。
□ 對緩存(Cache)的擴展,增加安全位。
□ 對其他外圍組件進行了相應的擴展,提供安全操作權限控制和安全操作信號。
2.2.1 AXI總線上安全狀態位的擴展
為了支持TrustZone技術,控制處理器在不同狀態下對硬件資源訪問的權限,ARM對先進可擴展接口(Advanced eXtensible Interface, AXI)系統總線進行了擴展。在原有AXI總線基礎上對每一個讀寫信道增加了一個額外的控制信號位,用來表示當前的讀寫操作是安全操作還是非安全操作,該信號位稱為安全狀態位(NS bit)或者非安全狀態位(Non-Secure bit)。
□ AWPROT[1]:總線寫事務——低位表示安全寫事務操作,高位表示非安全寫事務操作。
□ ARPROT[1]:總線讀事務——低位表示安全讀事務操作,高位表示非安全讀事務操作。
當主設備通過總線發起讀寫操作時,從設備或者外圍資源同時也需要將對應的PROT控制信號發送到總線上。總線或者從設備的解碼邏輯必須能夠解析該PROT控制信號,以便保證安全設備在非安全態下不被非法訪問。所有的非安全主設備必須將安全狀態位置成高位,這樣就能夠保證非安全主設備無法訪問到安全從設備。如果一個非安全主設備試圖訪問一個安全從設備,將會在總線或者從設備上觸發一個錯誤操作,至于該錯誤如何處理就依賴于從設備的處理邏輯和總線的配置。通常這種非法操作最終將產生一個SLVERR(slave error)或者DECERR(decode error)。
2.2.2 AXI-to-APB橋的作用
TrustZone同樣能夠保護外圍設備的安全,例如中斷控制、時鐘、I/O設備,因此Trust-Zone架構還能用來解決更加廣泛的安全問題。比如一個安全中斷控制器和安全時鐘允許一個非中斷的安全任務來監控系統,能夠為DRM提供可靠的時鐘,能夠為用戶提供一個安全的輸入設備從而保證用戶密碼數據不會被惡意軟件竊取。
AMBA3規范包含了一個低門數、低帶寬的外設總線,被稱作外設總線(Advanced Peripheral Bus, APB), APB通過AXI-to-APB橋連接到系統總線上。而APB總線并不具有安全狀態位,為實現APB外設與TrustZone技術相兼容,APB-to-AXI橋將負責管理APB總線上設備的安全。APB-to-AXI橋會拒絕不匹配的安全事務設置,并且不會將該事務請求發送給外設。
2.2.3 TrustZone地址空間控制組件
TrustZone地址空間控制組件(TrustZone Address Space Controller, TZASC是AXI總線上的一個主設備,TZASC能夠將從設備全部的地址空間分割成一系列的不同地址范圍。
在安全狀態下,通過編程TZASC能夠將這一系列分割后的地址區域設定成安全空間或者是非安全空間。被配置成安全屬性的區域將會拒絕非安全的訪問請求。
使用TZASC主要是將一個AXI從設備分割成幾個安全設備,例如off-Soc、DRAM等。ARM的動態內存控制器(Dynamic Memory Controller, DMC)并不支持安全和非安全分區的功能。如果將DMC接到TZASC上,就能實現DRAM支持安全區域和非安全區域訪問的功能。需要注意的是,TZASC組件只支持存儲映射設備對安全和非安全區域的劃分與擴展,但不支持對塊設備(如EMMC、NAND flash等)的安全和非安全區域的劃分與擴展。圖2-4所示為使用TZASC組件的例子。

圖2-4 TZASC組件示意
2.2.4 TrustZone內存適配器組件
TrustZone內存適配器組件(TrustZone Memory Adapter, TZMA)許對片上靜態內存(on-SoC Static Memory)或者片上ROM進行安全區域和非安全區域的劃分。TZMA支持最大2MB空間的片上靜態RAM的劃分,可以將2MB空間劃分成兩個部分,高地址部分為非安全區域,低地址部分為安全區域,兩個區域必須按照4KB進行對齊。分區的具體大小通過TZMA的輸入信號R0SIZE來控制,該信號來自TZPC的輸出信號TZPCR0SIZE。即通過編程TZPC可以動態地配置片上靜態RAM或者ROM的大小。使用TZMA組件的鏈接框圖如圖2-5所示。

圖2-5 使用TZMA組件的鏈接示意
2.2.5 TrustZone保護控制器組件
TrustZone保護控制器組件(TrustZone Protection Controller, TZPC是用來設定TZPCDECPORT信號和TZPCR0SIZE等相關控制信號的。這些信號用來告知APB-to-AXI對應的外設是安全設備還是非安全設備,而TZPCR0SIZE信號用來控制TZMA對片上RAM或片上ROM安全區域大小的劃分。TZPC包含三組通用寄存器TZPCDECPROT[2:0],每組通用寄存器可以產生8種TZPCDECPROT信號,也就是TZPC最多可以將24個外設設定成安全外設。TZPC組件還包含一個TZPCROSIZE寄存器,該寄存器用來為TZMA提供分區大小信息。TZPC組件的接口示意如圖2-6所示。

圖2-6 TZPC組件接口示意
當上電初始化時,TZPC的TZPCDECROT寄存器中的位會被清零,同時TZPCR0SIZE寄存器會被設置成0x200,表示接入到TZMA上的片上RAM或者ROM的安全區域大小為2MB。通過修改TZPC的寄存器配置的值可實現用戶對資源的特定配置。TZPC的使用例子如圖2-7所示。

圖2-7 TZPC使用示例
2.2.6 TrustZone中斷控制器組件
在支持TrustZone的SoC上,ARM添加了TrustZone中斷控制器(TrustZone Interrupt Controller, TZIC。TZIC的作用是讓處理器處于非安全態時無法捕獲到安全中斷。TZIC是第一級中斷控制器,所有的中斷源都需要接到TZIC上。TZIC根據配置來判定產生的中斷類型,然后決定是將該中斷信號先發送到非安全的向量中斷控制器(Vector Interrupt Controller, VIC)后以nIRQ信號發送到處理器,還是以nTZICFIQ信號直接發送到處理器。圖2-8所示為TZIC在SoC中的使用示意。

圖2-8 TZIC在SoC中的使用示意
通過對TZIC的相關寄存器進行編程,可對TZIC進行配置并設定每個接入到TZIC的中斷源的中斷類型。TZIC具有眾多寄存器,細節說明可以參考相關ARM的文檔。在TZIC中用來設置中斷源類型的寄存器為TZICIntSelect,如果TZICIntSelect中的某一位被設置成1,則該相應的中斷源請求會被設置成快速中斷請求(Fast Interrupt Request, FIQ)。如果某一位被設置成0,則該中斷源的中斷請求會被交給VIC進行處理。如果VIC的IntSelect將獲取到的中斷源設置成FIQ,那么該中斷源會被再次反饋給TZIC進行處理。
2.2.7 Cache和MMU的擴展
在支持TrustZone的SoC上,會對MMU進行虛擬化,使得寄存器TTBR0、TTBR1、TTBCR在安全狀態和非安全狀態下是相互隔離的,因此兩種狀態下的虛擬地址轉換表是獨立的。
存放在MMU中的每一條頁表描述符都會包含一個安全狀態位,用以表示被映射的內存是屬于安全內存還是非安全內存。虛擬化的MMU共享轉換監測緩沖區(Translation Lookaside Buffer, TLB),同樣TLB中的每一項也會打上安全狀態位標記,只不過該標記是用來表示該條轉換是正常世界狀態轉化的還是安全世界狀態轉化的。
Cache也同樣進行了擴展,Cache中的每一項都會按照安全狀態和非安全狀態打上對應的標簽,在不同的狀態下,處理器只能使用對應狀態下的Cache。
2.3 TrustZone技術對資源隔離的實現
ARM處理器核的虛擬化和資源隔離是TrustZone實現安全需求的根本。支持TrustZone的處理器核具有虛擬化,也即將一個物理核分成安全狀態和非安全狀態。當處理器處于非安全狀態時,只能訪問屬于非安全的外設和內存,而不能訪問安全的資源;當處理器處于安全態時,處理器既可以訪問安全資源,也可以訪問非安全的資源,只有當處理器核為安全世界狀態時才可能發出PROT的安全訪問信號。
2.3.1 中斷源的隔離
在原來的ARM芯片中,使用VIC來對外部中斷源進行控制和管理,支持TrustZone后,ARM提出了TZIC組件,在芯片設計時,該組件作為一級中斷源控制器,控制所有的外部中斷源,通過編程TZIC組件的相關寄存器來設定哪個中斷源為安全中斷源FIQ,而未被設定的中斷源將會被傳遞給VIC進行處理。一般情況下VIC會將接收到的中斷源設定成普通中斷請求(Interrupt Request, IRQ),如果在VIC中將接收到的中斷源設定成FIQ,則該中斷源會被反饋給TZIC組件,TZIC組件會將安全中斷源送到安全世界狀態中進行處理。
2.3.2 片上RAM和片上ROM的隔離
芯片內部存在小容量的RAM或者ROM,以供芯片上電時運行芯片ROM或者存放芯片自身相關的數據。TrustZone架構對該部分也進行了隔離操作。隔離操作通過使用TZMA和TZPC組件來實現。
TZMA用來將片上RAM或者ROM劃分成安全區域和非安全區域,安全區域的大小則由接入的TZPCR0SIZE信號來決定。而TZPCR0SIZE的值可以通過編程TZPC組件中的TZPCR0SIZE寄存器來實現。
當處理器核訪問片上RAM或者ROM時,TZMA會判定訪問請求的PROT信號是安全操作還是非安全操作,如果處理器發出的請求為非安全請求而該請求又嘗試去訪問安全區域時,TZMA就會認為該請求為非法請求。這樣就能實現片上RAM和ROM的隔離,達到非安全態的處理器核無法訪問片上安全區域的RAM和ROM。
2.3.3 片外DRA M的隔離
一個完整的系統必然會有片外RAM,對片外RAM的隔離是通過TZASC組件實現的,ARM本身的DMC可以將DRAM分割成不同的區域,這些區域是沒有安全和非安全分類。將DMC與TZASC相連后再掛到總線上,通過對TZASC組件進行編程可以將DRAM劃分成安全區域和非安全區域。當主設備訪問DRAM時,除需要提供物理地址之外,還會發送PROT信號。TZASC組件首先會判定主設備需要訪問的DARM地址是屬于安全區域還是非安全區域,然后再結合接收到的PROT信號來判定該次訪問是否有效。如果PROT信號為非安全訪問操作,且訪問的DRAM地址屬于安全區域,則TZASC就不會響應這次訪問操作,這樣就能實現DRAM中安全區域和非安全區域的隔離。
2.3.4 外圍設備的隔離
其他外圍設備都會掛載到APB總線上,然后通過AXI-to-APB橋連接到AXI總線上,AXI-to-APB結合TZPC組件的TZPCDECROT的值及訪問請求的PROT信號來判定該訪問是否有效。當處理器需要訪問外圍設備時,會將地址和PROT信號發送到AXI總線上。
AXI-to-APB橋會對接收到的請求進行解析,獲取需要訪問的所需外圍設備,然后通過查詢TZPCDECROT的值來判斷外設的安全類型,再根據PROT信號就能判定該請求的安全類型。如果該請求是非安全請求,但需要訪問的外圍設備屬于安全設備,則AXI-to-APB會判定該訪問無效。
通過對TZPC中的TZPCDECROT寄存器進行編程能夠設置外設的安全類型,從而做到外設在硬件層面的隔離。
2.4 小結
本章介紹了TrustZone的原理以及在ARMv7和ARMv8架構下TrustZone技術實現的差異。TrustZone對系統實現了硬件隔離,將系統資源劃分成安全和非安全兩種類型,同時在系統總線上增加安全讀寫信號位,通過讀取安全讀寫信號位電平來確定當前處理器的工作狀態,從而判斷是否具有該資源的訪問權限。因此,TrustZone從硬件級別實現了對系統資源的保護。
- 零基礎學C++程序設計
- Spring Boot+Spring Cloud+Vue+Element項目實戰:手把手教你開發權限管理系統
- Koa開發:入門、進階與實戰
- 重學Java設計模式
- iOS應用逆向工程(第2版)
- Teaching with Google Classroom
- Raspberry Pi Robotic Projects(Third Edition)
- Programming Microsoft Dynamics? NAV 2015
- Java高并發編程詳解:深入理解并發核心庫
- Python計算機視覺與深度學習實戰
- Ubuntu Server Cookbook
- 虛擬現實:引領未來的人機交互革命
- 循序漸進Vue.js 3前端開發實戰
- Python GUI設計tkinter菜鳥編程(增強版)
- 軟件定義存儲:原理、實踐與生態