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.
總結
- TrustZone 是ARM 架構的一個安全擴展模型,可以用在任何ARM處理器中。
- Normal world 通過SMC指令訪問Secure world。Secure monitor 管理著Normal World和Secure World 的切換。Secure monitor 的代碼在禁用中斷的上下文執行。
- 內存系統事務中的NS位表示訪問的是Secure World 的內存還是Normal World的內存。Normal World只能對內存進行非安全訪問,Secure World 既可以進行安全訪問,也可以進行非安全訪問,只需要更改NS位即可。
- Secure World的翻譯表和Non-Secure World的翻譯表是獨立的,Secure World的翻譯表受到Normal World的保護。
- ARMv8-A 可以兼容32位和64位TrustZone。當ARMv8-A運行AArch32 TrustZone 時,相當于ARMv7-A。二者區別主要在于EL3的不同,ARMv7-A中EL3 提供Secure Monitor 和Srcure OS,而ARMV8 中,EL3只提供Secure Monitor 。
本文參考
-
信息
+關注
關注
0文章
406瀏覽量
35535 -
操作系統
+關注
關注
37文章
6803瀏覽量
123285 -
系統
+關注
關注
1文章
1014瀏覽量
21332
發布評論請先 登錄
相關推薦
評論