天天看點

一篇了解TrustZone

這篇文章源于老闆想了解TrustZone,要求我寫一篇文章簡單介紹TrustZone的原理。既然是給上司看的,隻介紹原理哪裡夠,是以也添加了公司自己現有TEE環境的設計、實作和發展,也順帶加入了一些題外話。也是因為要給上司看,是以文章也不能涉及太多技術細節,包括TrustZone子產品的詳細設計以及示例代碼等,是以隻從總體上講解了什麼是TrustZone,TrustZone是如何實作安全隔離的、TrustZone相關的一些資源等。

如果你之前對TrustZone亦無所知,好吧,本文或許值得你一看;如果你已經了解了TrustZone,想知道更多的實作細節,抱歉,本文并不适合你,或許閱讀ARM官方網站和文檔以及各開源項目源碼是更好的選擇。

本文先交代TrustZone的安全背景,然後從較高層次展開介紹TrustZone的工作機制和原理(包括AXI總線架構、CPU、記憶體和中斷模型,以及安全隔離機制),列舉了幾個常見ARM平台上的實作以及目前博通ARM平台上的狀況,最後附帶一些TrustZone相關的開源項目以及其他資源連結,全文約7500字。(由于涉及安全的原因,本文已經删掉介紹公司自己平台相關的部分)。

本文内容主要來源于網絡,綜合了網上的多篇文章,也加入了一些自己的了解,重新組織了文章結構使其便于了解。

主要參考的文章包括:

  • TrustZone領域先行者
  • TrustZone技術簡介
  • trust zone之我見
  • 簡談高通Trustzone的實作

本文還參考了貼吧、知乎等部分文章,由于涉及較多,無法一一列舉,再次對原作者的付出一并表示感謝!

除上面列舉的資源外,本文主要資料參考了ARM官方對TrustZone的介紹,主要有:

  • 網站 https://developer.arm.com/technologies/trustzone
  • 文檔 Building a Secure System using TrustZone Technology

事實上,前面多篇文章的細節也來源于官方文檔。

本人不保留本文的所有權,歡迎轉載本文,讓更多的人來了解TrustZone。由于不想再次以類似 《TrustZone原理介紹》 一類作為标題,但又不知道以什麼作為标題貼切,是以随手用了現在标題黨的套路,抱歉。

1. TrustZone介紹

1.1 安全背景

在介紹TrustZone前有必要簡單回顧下目前的一些安全手段。

CPU通過記憶體映射手段給每個程序營造一個單獨的位址空間來隔離多個程序的代碼和資料,通過核心空間和使用者空間不同的特權級來隔離作業系統和使用者程序的代碼和資料。但由于記憶體中的代碼和資料都是明文,容易被同處于記憶體中的其它應用偷窺,是以出現了擴充的安全子產品,應用将加密資料送往安全子產品,由安全子產品處理完後再傳回結果給相應的應用。

很多消費電子裝置都使用擴充的安全子產品來確定資料安全,目前常見的方式有:

  1. 外部挂接硬體安全子產品

    資料的處理交由外部的安全子產品實作,這些子產品能夠保護自己的資源和密鑰等資料的安全,如SIM卡、各種智能卡或連接配接到外部的硬體加解密子產品等,但其同主晶片的通信線路暴露在外部,容易被監聽破解。另外,通信的速率比較低。

  2. 内部內建硬體安全子產品

    将外部安全子產品的功能內建到晶片内,是以一個晶片上至少有兩個核:一個普通核和一個安全核。優點是核與核之間的通信在晶片内部實作,不再暴露在外面。缺點是核之間的通信速度仍然較低,而且單獨的安全核性能有限,還會會占用SoC面積,成本較高。

1.2 TrustZone是個什麼鬼?

TrustZone是ARM針對消費電子裝置設計的一種硬體架構,其目的是為消費電子産品建構一個安全架構來抵禦各種可能的攻擊。

TrustZone在概念上将SoC的硬體和軟體資源劃分為安全(Secure World)和非安全(Normal World)兩個世界,所有需要保密的操作在安全世界執行(如指紋識别、密碼處理、資料加解密、安全認證等),其餘操作在非安全世界執行(如使用者作業系統、各種應用程式等),安全世界和非安全世界通過一個名為Monitor Mode的模式進行轉換,如圖1:

一篇了解TrustZone

圖1. ARM的安全世界和非安全世界

處理器架構上,TrustZone将每個實體核虛拟為兩個核,一個非安全核(Non-secure Core, NS Core),運作非安全世界的代碼;和另一個安全核(Secure Core),運作安全世界的代碼。

兩個虛拟的核以基于時間片的方式運作,根據需要實時占用實體核,并通過Monitor Mode在安全世界和非安全世界之間切換,類似同一CPU下的多應用程式環境,不同的是多應用程式環境下作業系統實作的是程序間切換,而Trustzone下的Monitor Mode實作了同一CPU上兩個作業系統間的切換。

AMBA3 AXI(AMBA3

Advanced eXtensible Interface)系統總線作為TrustZone的基礎架構設施,提供了安全世界和非安全世界的隔離機制,確定非安全核隻能通路非安全世界的系統資源,而安全核能通路所有資源,是以安全世界的資源不會被非安全世界(或普通世界)所通路。

設計上,TrustZone并不是采用一刀切的方式讓每個晶片廠家都使用同樣的實作。總體上以AMBA3 AXI總線為基礎,針對不同的應用場景設計了各種安全元件,晶片廠商根據具體的安全需求,選擇不同的安全元件來建構他們的TrustZone實作。

其中主要的元件有:

  • 必選元件
    • AMBA3 AXI總線,安全機制的基礎設施
    • 虛拟化的ARM Core,虛拟安全和非安全核
    • TZPC (TrustZone Protection Controller),根據需要控制外設的安全特性
    • TZASC (TrustZone Address Space Controller),對記憶體進行安全和非安全區域劃分和保護
  • 可選元件
    • TZMA (TrustZone Memory Adapter),片上ROM或RAM安全區域和非安全區域的劃分和保護
    • AXI-to-APB bridge,橋接APB總線,配合TZPC使APB總線外設支援TrustZone安全特性

除了以上列出的元件外,還有諸如 Level 2 Cache Controller, DMA Controller, Generic Interrupt Controller等。

邏輯上,安全世界中,安全系統的OS提供統一的服務,針對不同的安全需求加載不同的安全應用TA(Trusted Application)。 例如:針對某具體DRM的TA,針對DTCP-IP的TA,針對HDCP 2.0驗證的TA等。

圖2是一個ARM官網對TrustZone介紹的應用示意圖:

一篇了解TrustZone

圖2. 基于TrustZone的應用示意圖

圖中左邊藍色部分Rich OS Application Environment(REE)表示使用者操作環境,可以運作各種應用,例如電視或手機的使用者作業系統,圖中右邊綠色部分Trusted Execution Envrionment(TEE)表示系統的安全環境,運作Trusted OS,在此基礎上執行可信任應用,包括身份驗證、授權管理、DRM認證等,這部分隐藏在使用者界面背後,獨立于使用者操作環境,為使用者操作環境提供安全服務。

可信執行環境(TEE, Trusted Execution Environment)是Global Platform(GP)提出的概念。對應于TEE還有一個REE(Rich Execution Environment)概念,分别對應于安全世界(Secure World)和非安全世界(Non-secure World, Normal World)。
GlobalPlatform(GP)是跨行業的國際标準組織,緻力于開發、制定并釋出安全晶片的技術标準,以促進多應用産業環境的管理 及其安全、可互操作的業務部署。目标是建立一個标準化的基礎架構, 加快安全應用程式及其關聯資源的部署,如資料和密鑰,同時保護安全應用程式及其關聯資源免受軟體方面的攻擊。

2. TrustZone原理和設計

以下主要從TrustZone的總線設計,CPU設計(包括處理器模型、記憶體模型和中斷模型)和安全隔離機制來介紹TrustZone的設計和工作原理。

2.1 總線設計

  • 總線

設計上,TrustZone 在系統總線上針對每一個信道的讀寫增加了一個額外的控制信号位,這個控制位叫做Non-Secure或者NS位,是AMBA3 AXI總線針對TrustZone作出的最重要、最核心的擴充設計。

這個控制信号針對讀和寫分别叫做ARPORT[1]和AWPORT[1]:

  • ARPROT[1]: 用于讀操作(Read transaction), 低表示Secure, 高表示Non-Secure
  • AWPROT[1]: 用于寫操作(Write transaction), 低表示Secure,高表示Non-Secure

總線上的所有主裝置(master)在發起新的操作(transaction)時會設定這些信号,總線或從裝置(slave)上解析子產品會對主裝置發起的信号進行辨識,來確定主裝置發起的操作在安全上沒有違規。

例如:硬體設計上,所有非安全世界的主裝置(Non-Secure masters)在操作時必須将信号的NS位置高,而NS位置高又使得其無法通路總線上安全世界的從裝置(Secure Slaves),簡單來說就是對非安全世界主裝置發出的位址信号進行解碼時在安全世界中找不到對應的從裝置,進而導緻操作失敗。

NS控制信号在AMBA3 AXI總線規範中定義。可以将其看作為原有位址的擴充位,如果原有32為尋址,增加NS可以看成是33位尋址,其中一半的32位實體尋址位于安全世界,另一半32位實體尋址位于非安全世界。

當然,非安全世界的主裝置嘗試通路安全世界的從裝置會引發通路錯誤,可能是SLVERR(slave error)或者DECERR(decode error),具體的錯誤依賴于其通路外設的設計或系統總線的配置。

  • 外設

在TrustZone出現前,ARM的外設基于AMBA2 APB (Advanced Peripheral Bus)總線協定,但是APB總線上不存在類似AXI總線上的NS控制位。為了相容已經存在的APB總線設計,AMBA3規範中包含了AXI-to-APB bridge元件,這樣就確定基于AMBA2 APB的外設同AMBA3 AXI的系統相容。AXI-to-APB bridge負責管理APB總線裝置的安全事宜,其會拒絕不合理的安全請求,保證這些請求不會被轉發到相應的外設。

例如:新一代的晶片可以通過增加AXI-to-APB bridge元件來沿用上一代晶片的設計來使其外圍裝置可以支援TrustZone。

2.2 處理器設計

2.2.1 處理器模型

TrustZone中,每個實體處理器核被虛拟為一個安全核(Secure)和一個非安全核(Non-Secure),安全核運作安全世界的代碼,非安全核運作除安全世界外的其它代碼。由于安全世界和非安全世界的代碼采用時間片機制輪流運作在同一個實體核上,相應的節省了一個實體處理器核。

多核處理器上,也有建議說讓将某一個或幾個核指定為安全專用核,隻運作安全系統代碼來建構安全世界,其餘核運作非安全代碼,暫不清楚目前有哪些平台采用這個實作。

圖3中,系統有4個實體核,每個又分為兩個虛拟核(安全核和非安全核)的情況:

一篇了解TrustZone

圖3. 多核處理器上的安全核和非安全核

2.2.2 L1記憶體模型

  • MMU

MMU是一種硬體電路,它包含兩類部件,一類是分段部件,一類是分頁部件,對應于記憶體管理的分段機制和分頁機制。分段機制把一個邏輯位址轉換為線性位址;接着,分頁機制把一個線性位址轉換為實體位址。

當CPU通路一個虛拟位址時,這個虛位址被送到MMU翻譯,硬體首先把它和TLB中的所有條目同時(并行地)進行比較,如果它的虛頁号在TLB中,并且通路沒有違反保護位,它的頁面會直接從TLB中取出而不去通路頁表,進而提高位址轉換的效率。

安全世界和非安全世界都有自己的虛拟MMU,各自管理實體位址的映射。實際上隻是兩個世界都有一份TTBR0、TTBR1、TTBCR寄存器,是以就會對應兩個MMU表。

盡管MMU有兩套,但TBL緩存硬體上隻有一套,是以TBL對于兩個世界來說是共享的,其通過NS位來标志其每一項具體屬于哪一個世界。這樣在兩個世界間進行切換時不再需要重新重新整理TLB,提高執行效率。

對于TLB共享并不是硬性規定的,部分晶片在兩個世界間切換時可能通過硬體部分或全部重新整理TLB。
  • Cache

同TLB類似,硬體上兩個世界共享一套Cache,具體的Cache資料屬于哪一個世界也由其NS位指定,在世界間切換也不需要重新整理Cache。

2.2.3 中斷模型

基于TrustZone的處理器有三套異常向量表:

  • 一套用于非安全世界,
  • 一套用于安全世界,
  • 還有一套用于Monitor模式。

與之前非TrustZone的處理器不同的是,這三套中斷向量表的基位址在運作時可以通過CP15的寄存器VBAR(Vector Base Address Register)進行修改。

複位時,安全世界的中斷向量表由處理器的輸入信号VINITHI決定,沒有設定時為0x00000000,有設定時為0xFFFF0000;非安全世界和Monitor模式的中斷向量表預設沒有設定,需要通過軟體設定後才能使用。

預設情況下,IRQ和FIQ異常發生後系統直接進入Monitor模式,由于IRQ是絕大多數環境下最常見的中斷源,是以ARM建議配置IRQ作為非安全世界的中斷源,FIQ作為安全世界的中斷源。這樣配置有兩個優點:

  • 當處理器運作在非安全世界時,IRQ直接進入非安全世界的處理函數;如果處理器運作在安全世界,當IRQ發生時,會先進入到Monitor模式,然後跳到非安全世界的IRQ處理函數執行
  • 僅将FIQ配置為安全世界的中斷源,而IRQ保持不變,現有代碼僅需做少量修改就可以滿足

将IRQ設定為非安全世界的中斷源時系統IRQ的切換見圖4:

一篇了解TrustZone

圖4. IRQ作為非安全世界的中斷源

2.2.4 系統模式切換

基于TrustZone的系統有三種狀态,安全世界、非安全世界和用于二者切換的Monitor Mode。

協處理器CP15的寄存器SCR(Secure Configuration Register)有一個NS位用于訓示目前處理器位于哪一個世界,該寄存器在非安全世界是不能通路的。當CPU處于Monitor Mode時,無論NS位是0還是1,處理器都是在安全世界運作代碼。是以Monitor Mode下總是安全世界,但如果此時NS為1,通路CP15的其它寄存器擷取到的是其在非安全世界的值。

非安全世界到Monitor模式的切換

處理器從非安全世界進入Monitor Mode的操作由系統嚴格控制,而且所有這些操作在Monitor Mode看來都屬于異常。

從非安全世界到Monitor Mode的操作可通過以下方式觸發:

  • 軟體執行SMC (Secure Monitor Call)指令
  • 硬體異常機制的一個子集(換而言之,并非所有硬體異常都可以觸發進入Monitor Mode),包括:
    • IRQ
    • FIQ
    • external Data Abort
    • external Prefetch Abort
Monitor Mode

Monitor Mode内執行的代碼依賴于具體的實作,其功能類似于程序切換,不同的是這裡是不同模式間CPU狀态切換。

軟體在Monitor Mode下先儲存目前世界的狀态,然後恢複下一個世界的狀态。操作完成後以從異常傳回的方式開始運作下一個世界的代碼。

為什麼安全模式和非安全模式不能直接切換?

非安全世界無權通路CP15的SCR寄存器,是以無法通過設定NS來直接切換到安全世界,隻能先轉換到Monitor Mode,再到安全世界。

如果軟體運作在安全世界(非Monitor Mode)下,通過将CP15的NS位置1,安全世界可以直接跳轉到非安全世界,由于此時CPU的流水線和寄存器還遺留了安全世界的資料和設定,非安全模式下的應用可以擷取到這些資料,會有極大的安全風險。是以,隻建議在Monitor Mode下通過設定NS位來切換到非安全模式。

綜上,安全世界和非安全世界不存在直接的切換,所有切換操作都通過Monitor Mode來執行。

圖5展現了安全世界和非安全世界之間的切換方式:

一篇了解TrustZone

圖5. 安全世界和非安全世界之間的切換

2.3 隔離機制

除了CPU執行時實行安全世界和非安全世界的隔離外,AMBA3 AXI總線提供了外設隔離的基礎。

2.3.1 記憶體隔離機制

這裡的記憶體指外部的DDR和片上的ROM以及SRAM,其隔離和保護通過總線元件TZASC和TZMA的設定來實作。

  • TZASC (TrustZone Address Space Controller)
    • TZASC可以把外部DDR分成多個區域,每個區域可以單獨配置為安全或非安全區域,非安全世界的代碼和應用隻能通路非安全區域。TZASC隻能用于記憶體裝置,不适合用于配置塊裝置,如Nand Flash。
  • TZMA (TrustZone Memory Adapter)
    • TZMA可以把片上ROM和SRAM隔離出安全和非安全區域。TZMA最大可以将片上存儲的低2MB配置為安全區域,其餘部配置設定置為非安全區域。大小劃分上,片上安全區域可以在晶片出廠前設定為固定大小,或運作時通過TZPC動态配置。TZMA使用上有些限制,其不适用于外部記憶體劃分,而且也隻能配置一個安全區域。

2.3.2 外設隔離機制

外設上,基于APB總線的裝置不支援AXI總線的NS控制信号,是以AXI到APB總線需要AXI-to-APB bridge裝置連接配接,除此之外,還需要TZPC (TrustZone Protection Controller) 來向APB總線上的裝置提供類似AXI上的NS控制信号。

由于TZPC可以在運作時動态設定,這就決定了外設的安全特性是動态變化的,例如鍵盤平時可以作為非安全的輸入裝置,在輸入密碼時可以配置為安全裝置,隻允許安全世界通路。

2.3.3 隔離機制示意圖

整個系統記憶體和外設隔離機制示意圖見圖6.

一篇了解TrustZone

圖6. 系統記憶體和外設隔離機制示意圖

此圖來源于網上,實際上TZPC還連接配接到片内的ROM/RAM裝置上,用于配置片上存儲的安全區域。

2.4 安全啟動

AMBA3 AXI總線機制隔離出安全世界和非安全世界,但這是系統啟動之後的事情。如何確定系統本身是安全的呢?這就涉及到系統啟動的過程。

系統上電複位後,先從安全世界開始執行。安全世界會對非安全世界的bootloader進行驗證,確定非安全世界執行的代碼經過授權而沒有被篡改過。然後非安全世界的bootloader會加載非安全世界的OS,完成整個系統的啟動。

在非安全系統的bootloader加載OS時,仍然需要安全世界對OS的代碼進行驗證,確定沒有被篡改。

圖7是典型的TrustZone晶片的啟動流程:

一篇了解TrustZone

圖7. 典型的TruestZone晶片啟動流程

整個啟動流程跟目前博通平台的安全啟動原理基本一緻,上電後安全晶片先啟動,然後校驗主晶片的bootloader,接下來bootloader送出系統的OS和檔案系統給BSP進行校驗,通過後加載主系統,確定主系統是安全的。

從上電複位開始的整個啟動過程中,下一級的安全基于上一級的驗證,最終依賴于晶片内置的OTP和安全硬體,逐級的驗證構成了整個系統的信任鍊。信任鍊中的某一個環節被破壞,都會導緻整個系統不安全。

3. 各家TrustZone實作

基于安全考慮,各家TrustZone都實行閉源,關于其實作細節的介紹都較少。

網上能找到少許關于高通方案上TrustZone的介紹:

  • 安全世界 QSEE (Qualcomm Secure Execution Environment)
  • 非安全世界 HLOS (High Level OS)

整個系統的架構如圖8:

一篇了解TrustZone

圖8. 高通QSEE系統架構圖

4. 其它

  • ARMv8-A架構定義了四個異常等級,分别為EL0到EL3,其中數字越大代表特權(privilege)越大:
    • EL0: 無特權模式(unprivileged)
    • EL1: 作業系統核心模式(OS kernel mode)
    • EL2: 虛拟機螢幕模式(Hypervisor mode)
    • EL3: TrustZone monitor mode
      一篇了解TrustZone
  • TrustZone設計的相關方
    • ARM公司,定義TrustZone并實作硬體設計,TEE,TZAPI等
    • 晶片廠家,在具體晶片上實作TrustZone設計,包括三星、高通、MTK、TI、ST、華為等
    • 應用提供方,如DRM廠家和安全應用開發商,實作DRM、Playready、DTCP-IP和一些其它安全應用開發和認證
  • Trust OS

    TEE環境下也要有一個作業系統,各家都有自己的Trustzone的作業系統,如Trustonic、高通的QSEE、國内的豆莢,還有開源的OPTEE等。在作業系統之上自然要有應用程式,在Trustzone裡面我們一般叫TrustApp,當然TEE裡面每個TrustApp都在一個沙盒裡,互相之間是隔離的。比如說支付,就可以做成一個App(需要注意的是,和Normal World裡面的App是兩個概念),這個App簡單來說就負責用私鑰把網上發來的Challenge簽個名,而這個簽名的動作是需要在Secure World裡面做的,避免惡意程式竊取到私鑰來僞造簽名。

    例如支付寶,其實支付寶也是隻支援幾個Trust OS的。同時,支付寶還定義了一系列标準,用來完成他的行為。

    現在的Trust OS大都會遵循GlobalPlatform的規範,這個組織緻力于制定統一的Trust OS的API的接口規範,這樣一個TrustApp隻要用GP API,就可以友善移植到各個不同的TEE作業系統上了。

  • Intel 平台的 SGX

    針對可信計算,類似ARM的TrustZone,Intel也針對x86平台提出了自己的安全架構SGX:

    Intel® Software Guard Extensions (Intel® SGX)

    https://software.intel.com/zh-cn/sgx-sdk

    SGX全稱Intel Software Guard Extensions,顧名思義,其是對因特爾體系(IA)的一個擴充,用于增強軟體的安全性。這種方式并不是識别和隔離平台上的所有惡意軟體,而是将合法軟體的安全操作封裝在一個enclave中,保護其不受惡意軟體的攻擊,特權或者非特權的軟體都無法通路enclave,也就是說,一旦軟體和資料位于enclave中,即便作業系統或者和VMM(Hypervisor)也無法影響enclave裡面的代碼和資料。Enclave的安全邊界隻包含CPU和它自身。SGX建立的enclave也可以了解為一個可信執行環境TEE(Trusted Execution Environment)。不過其與ARM TrustZone(TZ)還是有一點小差別的,TZ中通過CPU劃分為兩個隔離環境(安全世界和正常世界),兩者之間通過SMC指令通信;而SGX中一個CPU可以運作多個安全enclaves,并發執行亦可。

    簡單來講, Intel SGX最關鍵的優勢在于将程式以外的software stack如OS和BIOS都排除在了TCB(Trusted Computing Base)以外。換句話說,就是在容器enclave裡的code隻信任自己和intel的CPU。

    網上有人是這樣對比TrustZone和SGX的:

    Trustzone預設相信SecureOS,安全世界。SGX僅相信CPU core,通過SGX指令建構enclave容器。簡單比喻,TEE是個公用大保險櫃,什麼東西都裝進去,有漏洞的app可能也進去了,而且保險櫃鑰匙在管理者手上,必須相信管理者。SGX每個app有自己的保險櫃,鑰匙在自己手上

    SGX要進入工業界應用尚需時間,一個重要的問題是現在在intel發行的伺服器晶片上還沒有SGX,而SGX的重要應用就是在資料中心和雲端的應用。

5. TrustZone開源項目

除了各家私有實作外,ARM也有不少開源項目,知名度較高的有:

  • Arm Trusted Firmware
    • 基于ARMv8-A應用處理器,ARM官方提供了一個開源參考實作BL31。
    • https://github.com/ARM-software/arm-trusted-firmware
  • Openvirtualization
    • 帶有一些商業屬性的開源項目,部分TEE實作隻有商業版支援
    • http://www.openvirtualization.org/
  • Op-Tee
    • Linaro 推出的開源TEE
    • https://github.com/OP-TEE

6. 參考

  • Architecture
    • https://developer.arm.com/products/architecture
  • TrustZone: https://developer.arm.com/technologies/trustzone
  • Building a Secure System using TrustZone Technology
  • ARM Trusted Firmware
    • https://github.com/ARM-software/arm-trusted-firmware
  • Development of TEE and Secure Monitor Code
    • http://www.arm.com/products/security-on-arm/trustzone/tee-and-smc

題外話

本文最初叫做《了解TrustZone,讀了這篇就夠了》,發完一看文後的推薦,我去,叫做《xxx,看這篇就夠了》的标題的文章多了去了,幾十篇吧~~好吧,我決定改了,換一個标題黨……請留意,文末送Android福利!

聯系和福利

  • 本文原創釋出于微信公衆号“洛奇看世界”,一個大齡2b碼農的世界。
    一篇了解TrustZone
  • 關注微信公衆号“洛奇看世界”
    • 回複關鍵詞“Android電子書”,擷取超過150本Android相關的電子書和文檔。電子書包含了Android開發相關的方方面面,從此你再也不需要到處找Android開發的電子書了。

繼續閱讀