【ARM架構】armv8 系統安全概述

嵌入式與Linux那些事發表於2023-02-23

ARMv8-A 系統中的安全

一個安全或可信的作業系統保護著系統中敏感的資訊,例如,可以保護使用者儲存的密碼,信用卡等認證資訊免受攻擊。

安全由以下原則定義:

  • 保密性:保護裝置上的敏感資訊,防止未經授權的訪問。有以下幾種方法可以做到,比如密碼和加密金鑰。

  • 完整性:使用公鑰來保護敏感資訊防止被修改。

  • 可用性:確保對敏感資訊的訪問一定是經過授權的,利用韌體更新來檢測未經授權的訪問。

舉一個生活中的例子,可信系統儲存了移動支付的密碼,數字證書等。在開放的系統中,很難實現絕對安全,因為使用者可能會下載各種各樣的軟體到移動裝置上,同時也會下載一些惡意程式碼,這可能會篡改你的系統。

軟體和硬體攻擊可分為以下幾類:

  • 軟體攻擊:惡意軟體攻擊通常不需要訪問實際的裝置,可以利用作業系統或應用程式的漏洞實現遠端攻擊。

  • 簡單的硬體攻擊:硬體攻擊大部分是非破壞性的攻擊,需要拿到實際的物理裝置,並使用常見的工具,例如jtag和邏輯探針。

  • 專業的硬體攻擊:這種攻擊需要複雜而昂貴的工具,如聚焦離子束(FIB)技術或功率分析技術,而且更常用於對付智慧卡裝置。

TrustZone技術就是專門用來對抗軟體攻擊的。TrustZone也可以抵禦一些簡單的硬體攻擊。

TrustZone的硬體架構

TrustZone架構為系統設計者提供了一種幫助保護系統的方法。即使是低階別的程式設計師也應該理解TrustZone的架構設計。

ARM 安全擴充套件模型允許系統開發人員對硬體裝置和軟體資源進行分割槽,以便他們既可以存在於安全子系統的Secure world,也可以存在於其他子系統的Normal world。

ARM 手冊中使用 Secure World 和 Non-secure World來指示系統的安全狀態。Non-secure World並不意味著有安全漏洞,而是指正常執行的系統,即Normal world。通常情況下,Secure World 和 Non-secure World存在著主從關係。Secure World 的程式碼只有作業系統透過SMC(Secure Monitor Call )指令呼叫才可以執行。

Non-secure World 的記憶體和功能也可以被Secure World 訪問

Secure monitor 管理著Secure World 和Non-secure World的切換,類似於作業系統中的上下文環境。確保離開Secure World 時 當前環境被完整儲存下來,當處理器再次切換到Secure World 時可以被正確 恢復。

TrustZone是對ARM架構的補充擴充套件,這意味著一個處理器可以同時執行Secure World 和Non-secure World的程式碼。如果Secure World 配置了中斷外設可用,那麼Secure World 和Non-secure World 的程式碼可以相互呼叫。

Secure monitor提供了Secure World 和Non-secure World的介面。出於程式的健壯性考慮, Secure monitor的程式碼應該在禁用中斷的上下文執行。編寫一個可重入的 Secure monitor會很複雜,而且並不會帶來太多的好處。

另外,Secure World 和Non-secure World 程式的執行也可以像作業系統那樣執行多工並行。雖然Secure World 的程式執行時可訪問的資源是完全獨立於Non-secure World 的,但是兩個世界也可以互相讓步,以實現多工並行的效果。

像韌體或任何其他系統軟體一樣,Secure World 的軟體必須儘量減少對系統其他部分的影響。例如,Secure World的 程式碼執行時應避免消耗大量的時間。Non-secure World 中的中斷應儘可能快的傳遞給Normal World,這有助於確保Normal World軟體良好的響應性。

記憶體系統由一個額外的位來劃分,這個位叫做NS位。它表示訪問的記憶體是Secure World 還是Non-secure World 。這個位被新增到所有記憶體系統事務中,包括快取記憶體標籤和對系統記憶體和外設的訪問。NS位可以為Secure World和Non-secure World 提供不同的實體地址空間。

在Normal World 中執行的軟體只能對記憶體進行Non-secure 的訪問。因為在由Normal World產生 的記憶體事務中,總是把NS位設定為1,而不考慮Normal World 中翻譯表中的設定。在Secure World 中執行的軟體只進行Secure 的記憶體訪問,但也可以使用翻譯表中的NS和NSTable標誌對特定的記憶體進行Non-secure 的訪問。

如果對標記為安全的快取資料進行非安全訪問會導致快取缺失。如果對標記為安全的外部儲存器進行非安全訪問,通常會向核心返回一個錯誤響應。

EL3有自己的翻譯表,由TTBR0_EL3(Translation Table Base Register )和TCR_EL3(Translation Control Register ) 管理。在安全狀態下,只允許stage 1的翻譯,沒有TTBR1_EL3暫存器。EL1翻譯表暫存器在安全狀態之間不會被儲存,因此TTBR0_EL1、TTBR1_EL1和TCR_EL1的值必須作為Secure monitor上下文切換操作的一部分為每個世界儲存和恢復。

這就使得每個世界都有一套本地的轉換表。Secure World的對映會被隱藏起來,並受到Normal World 的保護。Secure World 翻譯表中包括NS和NSTable位,這決定了是否可以對Secure World 和 Non-secure World的實體地址空間。

Secure 和 Non-secure 的entries 可以在快取和TLB中共存。在不同的世界之間切換時,快取不會失效。Normal World只能進行 Non-secure的訪問,所以只能命中標記為 Non-secure 的快取。而Secure World可以產生Secure 和 Non-secure的訪問,如果安全狀態在訪問時發生變化,可能還會有快取管理。

TLB中的entries 記錄了是由那個世界產生的entries 。儘管Non-secure狀態永遠不能對Secure 的資料進行操作,但Secure World 可以將NS行分配到緩衝區。另外,快取的啟用和禁用在每個異常級別都是不同的。快取控制對於兩個世界來說都是獨立的,但對所有的異常級別來說並不是獨立的。所以,EL0不能直接啟用或禁用快取,而EL2可以覆蓋Non-secure EL1的行為。

Secure World和Non-secure World 的互動

如果你在包含安全服務的系統中編寫程式碼,瞭解Secure World和Non-secure World 的互動方式對你很有用。一個典型的作業系統都會包含一個輕量的核心或者可信執行環境(TEE)。例如,在Secure World執行加密服務。它可以與Normal World 中的作業系統進行互動,Normal World 可以透過SMC呼叫訪問Secure World。透過這種方式,Normal World 既可以訪問Secure World,又不會擔心暴露加密的金鑰。

一般來講,開發人員不會與安全擴充套件元件,TEE,或者可信服務直接互動,而是透過Normal world 提供的API(例如authenticate())訪問Secure World。

下圖以應用程式呼叫API的形式展示了Normal world 和Secure World 的互動。API透過系統呼叫到TrustZone Driver,然後經過 Secure monitor傳遞給TEE。

這種呼叫方式會在Secure World和Normal World間頻繁傳遞資料。

例如,在 Secure world 中有一個簽名檢查器。Normal world可以請求Secure World使用SMC呼叫來驗證下載更新的簽名。如果Secure World需要訪問Normal world所使用的記憶體,Secure World可以使用其翻譯表描述符中的NS位,以確保它使用Non-secure方式訪問來讀取資料。

這一點很重要,因為與請求資料相關的內容可能已經在快取中了,因為Secure World執行的訪問都會標記為Non-secure的地址。安全屬性可以被認為是一個額外的地址位。如果核心使用安全記憶體訪問來嘗試讀取資料,它就不會命中已經在快取中的Non-secure資料。

如果你是一個平時只會和Normal world打交道的程式設計師,你可以忽略Secure World中發生的事情,因為它的操作對你來說是隱藏的。一個副作用是,中斷延遲可能會略有增加。Secure World可以是完全阻塞的,所以如果一箇中斷髮生Secure World中時,這可能會阻塞Normal world的中斷。但與一般作業系統的整體延遲相比,可以忽略不計。這種問題給Normal world帶來的影響取決於Secure World作業系統的架構設計。

Secure 和Normal worlds 的切換

在ARMv7的安全擴充套件中,軟體使用Monitor mode在Secure 和Non-secure state切換。該模式和Secure state 中其他特權模式是一樣的。在ARMv8-A處理器中,AArch32相當於ARMv7-A。

對於ARMv8架構,當EL3使用AArch32時,ARMv8架構相當於ARMv7,以確保完全相容,安全狀態下的所有特權模式被視為處於EL3。

AArch32的安全模型如下圖所示。在這種情況下,EL3是AArch32,以提供一個安全的作業系統和監視器。

下圖顯示了當EL3執行AArch64以提供安全監視器時的安全模型。EL1用於安全作業系統。當EL3使用AArch64時,EL3被用來執行負責在Non-secure state和Secure state之間切換的程式碼。

為了與AArch32保持一致,Secure state的EL1和EL0具有和Non-secure state的EL1和EL0不同的虛擬地址空間。這使得AArch32 32位架構的執行在Secure state的程式碼可以在Non-secure state執行的64位作業系統中使用。

當Normal World 執行停止而Secure World的執行開始時,透過執行 Secure Monitor(SMC)指令或透過硬體異常機制(如中斷或非同步中止)在它們之間進行上下文切換。ARM處理器有兩種中斷型別:FIQ和IRQ。

在Secure World中也是支援中斷的,其原理是將Secure World產生的中斷重定向到EL3,並且 和當前的DAIF 欄位無關。然而,這些控制只區分了主要的中斷型別。IRQ, FIQ, and asynchronous aborts。更詳細的控制需要將中斷分為 Secure 和Non-secure組。如果要做到這一點,需要GIC的支援,在GIC中有一些特性來支援劃分為不同的組。

一個典型的例子是FIQ被用作Secure interrupts,透過在中斷控制器內將安全中斷源對映為FIQ。同時,相關的外設和中斷控制器暫存器必須被標記為只能被安全訪問,以防止Normal World重新配置這些中斷。

使用安全擴充套件的實現通常有一個輕量級的可信核心,在Secure World中託管安全服務(例如加密)。一個完整的作業系統在Normal World中執行,並能夠使用SMC指令訪問安全服務。透過這種方式,Normal World可以訪問服務功能,在普通世界中執行的任意程式碼不會有敏感資料暴露的風險。

叢集中的安全問題

叢集系統中的每個核心都具有相同的安全特性。叢集中任何數量的核心都可以在任何時間點上在Secure World中執行,並且核心能夠在世界之間獨立過渡。暫存器控制Normal World程式碼是否可以修改Snoop控制單元(SCU)的設定。同樣,在整個叢集中分配優先順序中斷的GIC必須被配置為安全狀態。

安全系統還控制除錯規定的可用性。你可以為 Normal worlds 和Secure worlds配置獨立的硬體除錯,如JTAG除錯和跟蹤控制,這樣就不會有關於受信任系統的資訊洩露了。你可以透過一個安全外設來控制硬體配置選項,或者你可以硬體連線它們,並使用以下訊號來控制它們。

• Secure Privileged Invasive Debug Enable (SPIDEN): JTAG debug.
• Secure Privileged Non-Invasive Debug Enable (SPNIDEN): Trace and Performance Monitor.

總結

  1. TrustZone 是ARM 架構的一個安全擴充套件模型,可以用在任何ARM處理器中。

  2. Normal world 透過SMC指令訪問Secure world。Secure monitor 管理著Normal World和Secure World 的切換。Secure monitor 的程式碼在禁用中斷的上下文執行。

  3. 記憶體系統事務中的NS位表示訪問的是Secure World 的記憶體還是Normal World的記憶體。Normal World只能對記憶體進行非安全訪問,Secure World 既可以進行安全訪問,也可以進行非安全訪問,只需要更改NS位即可。

  4. Secure World的翻譯表和Non-Secure World的翻譯表是獨立的,Secure World的翻譯表受到Normal World的保護。

  5. ARMv8-A 可以相容32位和64位TrustZone。當ARMv8-A執行AArch32 TrustZone 時,相當於ARMv7-A。二者區別主要在於EL3的不同,ARMv7-A中EL3 提供Secure Monitor 和Srcure OS,而ARMV8 中,EL3只提供Secure Monitor 。

本文參考

security_in_an_armv8_system_100935_0100_en

相關文章