1. 程式人生 > 實用技巧 >TrustZone與高通

TrustZone與高通

改編自:https://blog.csdn.net/guyongqiangx/article/details/78020257

介紹

導讀

Q:什麼是Trust Zone

A:Trust Zone:是一種保護敏感資料安全機制。

Q:為什麼要了解TrustZone?

A:高通平臺的安全機制採用了ARM的TrustZone有關IP;在進行驅動開發等有關工作時,如果不清楚這樣的機制而進行非法訪問,容易導致問題,見附錄1。

產生背景

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

CPU通過記憶體對映手段給每個程序營造一個單獨的地址空間來隔離多個程序的程式碼和資料,通過核心空間和使用者空間不同的特權級來隔離作業系統和使用者程序的程式碼和資料。但由於記憶體中的程式碼和資料都是明文,容易被同處於記憶體中的其它應用偷窺,因此出現了擴充套件的安全模組,應用將加密資料送往安全模組,由安全模組處理完後再返回結果給相應的應用。

很多消費電子裝置都使用擴充套件的安全模組來確保資料安全,目前常見的方式有:

  1. 外部掛接硬體安全模組:資料的處理交由外部的安全模組實現,這些模組能夠保護自己的資源和金鑰等資料的安全,如SIM卡、各種智慧卡或連線到外部的硬體加解密模組等,但其同主晶片的通訊線路暴露在外部,容易被監聽破解。另外,通訊的速率比較低。
  2. 內部整合硬體安全模組:將外部安全模組的功能整合到晶片內,因此一個晶片上至少有兩個核:一個普通核和一個安全核。優點是核與核之間的通訊在晶片內部實現,不再暴露在外面。缺點是核之間的通訊速度仍然較低,而且單獨的安全核效能有限,還會會佔用SoC面積,成本較高。

TrustZone

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

TrustZone在概念上,將SoC的硬體和軟體資源劃分為安全(Secure World)和非安全(Normal World)兩個世界:

  • 所有需要保密的操作在安全世界執行(如指紋識別、密碼處理、資料加解密、安全認證等)
  • 其餘操作在非安全世界執行(如使用者作業系統、各種應用程式等)

安全世界和非安全世界通過一個名為Monitor Mode的模式進行轉換,如圖1:

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介紹的應用示意圖:

圖中左邊藍色部分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):跨行業的國際標準組織,致力於開發、制定併發布安全晶片的技術標準,以促進多應用產業環境的管理 及其安全、可互操作的業務部署。目標是建立一個標準化的基礎架構, 加快安全應用程式及其關聯資源的部署,如資料和金鑰,同時保護安全應用程式及其關聯資源免受軟體方面的攻擊。

TrustZone原理和設計

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

匯流排設計

匯流排

設計上,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。

處理器設計

處理器模型

TrustZone中,每個物理處理器核被虛擬為一個安全核(Secure)和一個非安全核(Non-Secure),安全核執行安全世界的程式碼,非安全核執行除安全世界外的其它程式碼。由於安全世界和非安全世界的程式碼採用時間片機制輪流執行在同一個物理核上,相應的節省了一個物理處理器核。

多核處理器上,也有建議說讓將某一個或幾個核指定為安全專用核,只執行安全系統程式碼來構建安全世界,其餘核執行非安全程式碼,暫不清楚目前有哪些平臺採用這個實現。

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

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。

中斷模型

基於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的系統有三種狀態,安全世界、非安全世界和用於二者切換的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展現了安全世界和非安全世界之間的切換方式:

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

隔離機制

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

記憶體隔離機制

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

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

外設隔離機制

外設上,基於APB匯流排的裝置不支援AXI匯流排的NS控制訊號,所以AXI到APB匯流排需要AXI-to-APB bridge裝置連線,除此之外,還需要TZPC (TrustZone Protection Controller) 來向APB總線上的裝置提供類似AXI上的NS控制訊號。

由於TZPC可以在執行時動態設定,這就決定了外設的安全特性是動態變化的,例如鍵盤平時可以作為非安全的輸入裝置,在輸入密碼時可以配置為安全裝置,只允許安全世界訪問。

隔離機制示意圖

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

實際上TZPC還連線到片內的ROM/RAM裝置上,用於配置片上儲存的安全區域。

安全啟動

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

系統上電覆位後,先從安全世界開始執行。安全世界會對非安全世界的bootloader進行驗證,確保非安全世界執行的程式碼經過授權而沒有被篡改過。

然後非安全世界的bootloader會載入非安全世界的OS,完成整個系統的啟動。

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

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

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

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

各家TrustZone實現

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

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

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

整個系統的架構如圖8:

其它

  • ARMv8-A架構定義了四個異常等級,分別為EL0到EL3,其中數字越大代表特權(privilege)越大:

    • EL0: 無特權模式(unprivileged)
    • EL1: 作業系統核心模式(OS kernel mode)
    • EL2: 虛擬機器監視器模式(Hypervisor mode)
    • EL3: TrustZone monitor mode

  • 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的重要應用就是在資料中心和雲端的應用。

TrustZone開源專案

除了各傢俬有實現外,ARM也有不少開源專案,知名度較高的有:

參考

附錄1:高通平臺訪問外設資源導致宕機

reference:《SC60平臺cat /d/gpio宕機修改方法》

背景:

在 高通平臺下,有一些命令會訪問到所有的資源(例如"cat /d/gpi);

但是因為高通平臺下對於 安全的考慮,因此,會有一部分的資源位於Trust Zone中;

當非法訪問到TZ的資源時(主要是指非安全區域訪問安全區域而不經過 Monitor Zone時),CPU會丟擲一個a xpu error 異常,導致重啟復位。

解決方法:

1、定位是在哪裡進行的訪問:

core/buses/qup_accesscontrol/bear/config/QUPAC_xxxx_Access.xml
get gpio which RW_ACCESS_LIST is not AC_HLOS

2、定位到哪些資源被非法訪問:

drivers/pinctrl/qcom/pinctrl-msm.c

3、想辦法跳過、忽略對那些資源的非法訪問。

事後處理策略:

1、評估這個問題是否是一個通用問題

2、根據評估結果,判斷是否要釋出patch,還是單獨記錄。