ARMv8-A 系統(tǒng)中的安全
一個安全或可信的操作系統(tǒng)保護(hù)著系統(tǒng)中敏感的信息,例如,可以保護(hù)用戶存儲的密碼,信用卡等認(rèn)證信息免受攻擊。
安全由以下原則定義:
保密性:保護(hù)設(shè)備上的敏感信息,防止未經(jīng)授權(quán)的訪問。有以下幾種方法可以做到,比如密碼和加密密鑰。
完整性:使用公鑰來保護(hù)敏感信息防止被修改。
可用性:確保對敏感信息的訪問一定是經(jīng)過授權(quán)的,利用固件更新來檢測未經(jīng)授權(quán)的訪問。
舉一個生活中的例子,可信系統(tǒng)存儲了移動支付的密碼,數(shù)字證書等。在開放的系統(tǒng)中,很難實現(xiàn)絕對安全,因為用戶可能會下載各種各樣的軟件到移動設(shè)備上,同時也會下載一些惡意代碼,這可能會篡改你的系統(tǒng)。
軟件和硬件攻擊可分為以下幾類:
軟件攻擊:惡意軟件攻擊通常不需要訪問實際的設(shè)備,可以利用操作系統(tǒng)或應(yīng)用程序的漏洞實現(xiàn)遠(yuǎn)程攻擊。
簡單的硬件攻擊:硬件攻擊大部分是非破壞性的攻擊,需要拿到實際的物理設(shè)備,并使用常見的工具,例如jtag和邏輯探針。
專業(yè)的硬件攻擊:這種攻擊需要復(fù)雜而昂貴的工具,如聚焦離子束(FIB)技術(shù)或功率分析技術(shù),而且更常用于對付智能卡設(shè)備。
TrustZone技術(shù)就是專門用來對抗軟件攻擊的。TrustZone也可以抵御一些簡單的硬件攻擊。
TrustZone的硬件架構(gòu)
TrustZone架構(gòu)為系統(tǒng)設(shè)計者提供了一種幫助保護(hù)系統(tǒng)的方法。即使是低級別的程序員也應(yīng)該理解TrustZone的架構(gòu)設(shè)計。
ARM 安全擴展模型允許系統(tǒng)開發(fā)人員對硬件設(shè)備和軟件資源進(jìn)行分區(qū),以便他們既可以存在于安全子系統(tǒng)的Secure world,也可以存在于其他子系統(tǒng)的Normal world。
ARM 手冊中使用 Secure World 和 Non-secure World來指示系統(tǒng)的安全狀態(tài)。Non-secure World并不意味著有安全漏洞,而是指正常運行的系統(tǒng),即Normal world。通常情況下,Secure World 和 Non-secure World存在著主從關(guān)系。Secure World 的代碼只有操作系統(tǒng)通過SMC(Secure Monitor Call )指令調(diào)用才可以執(zhí)行。
Non-secure World 的內(nèi)存和功能也可以被Secure World 訪問
Secure monitor 管理著Secure World ?和Non-secure World的切換,類似于操作系統(tǒng)中的上下文環(huán)境。確保離開Secure World 時 當(dāng)前環(huán)境被完整保存下來,當(dāng)處理器再次切換到Secure World 時可以被正確 恢復(fù)。
TrustZone是對ARM架構(gòu)的補充擴展,這意味著一個處理器可以同時運行Secure World ?和Non-secure World的代碼。如果Secure World 配置了中斷外設(shè)可用,那么Secure World 和Non-secure World 的代碼可以相互調(diào)用。
Secure monitor提供了Secure World 和Non-secure World的接口。出于程序的健壯性考慮, Secure monitor的代碼應(yīng)該在禁用中斷的上下文執(zhí)行。編寫一個可重入的 Secure monitor會很復(fù)雜,而且并不會帶來太多的好處。
另外,Secure World ?和Non-secure World 程序的執(zhí)行也可以像操作系統(tǒng)那樣執(zhí)行多任務(wù)并行。雖然Secure World ?的程序執(zhí)行時可訪問的資源是完全獨立于Non-secure World 的,但是兩個世界也可以互相讓步,以實現(xiàn)多任務(wù)并行的效果。
像固件或任何其他系統(tǒng)軟件一樣,Secure World ?的軟件必須盡量減少對系統(tǒng)其他部分的影響。例如,Secure World的 代碼執(zhí)行時應(yīng)避免消耗大量的時間。Non-secure World 中的中斷應(yīng)盡可能快的傳遞給Normal World,這有助于確保Normal World軟件良好的響應(yīng)性。
內(nèi)存系統(tǒng)由一個額外的位來劃分,這個位叫做NS位。它表示訪問的內(nèi)存是Secure World 還是Non-secure World 。這個位被添加到所有內(nèi)存系統(tǒng)事務(wù)中,包括高速緩存標(biāo)簽和對系統(tǒng)內(nèi)存和外設(shè)的訪問。NS位可以為Secure World和Non-secure World 提供不同的物理地址空間。
在Normal World 中運行的軟件只能對內(nèi)存進(jìn)行Non-secure 的訪問。因為在由Normal World產(chǎn)生 的內(nèi)存事務(wù)中,總是把NS位設(shè)置為1,而不考慮Normal World 中翻譯表中的設(shè)置。在Secure World 中運行的軟件只進(jìn)行Secure 的內(nèi)存訪問,但也可以使用翻譯表中的NS和NSTable標(biāo)志對特定的內(nèi)存進(jìn)行Non-secure 的訪問。
如果對標(biāo)記為安全的緩存數(shù)據(jù)進(jìn)行非安全訪問會導(dǎo)致緩存缺失。如果對標(biāo)記為安全的外部存儲器進(jìn)行非安全訪問,通常會向內(nèi)核返回一個錯誤響應(yīng)。
EL3有自己的翻譯表,由TTBR0_EL3(Translation Table Base Register )和TCR_EL3(Translation Control Register ) 管理。在安全狀態(tài)下,只允許stage 1的翻譯,沒有TTBR1_EL3寄存器。EL1翻譯表寄存器在安全狀態(tài)之間不會被存儲,因此TTBR0_EL1、TTBR1_EL1和TCR_EL1的值必須作為Secure monitor上下文切換操作的一部分為每個世界保存和恢復(fù)。
這就使得每個世界都有一套本地的轉(zhuǎn)換表。Secure World的映射會被隱藏起來,并受到Normal World 的保護(hù)。Secure World 翻譯表中包括NS和NSTable位,這決定了是否可以對Secure World 和 Non-secure World的物理地址空間。
Secure 和 Non-secure 的entries 可以在緩存和TLB中共存。在不同的世界之間切換時,緩存不會失效。Normal World只能進(jìn)行 Non-secure的訪問,所以只能命中標(biāo)記為 Non-secure 的緩存。而Secure World可以產(chǎn)生Secure 和 Non-secure的訪問,如果安全狀態(tài)在訪問時發(fā)生變化,可能還會有緩存管理。
TLB中的entries 記錄了是由那個世界產(chǎn)生的entries 。盡管Non-secure狀態(tài)永遠(yuǎn)不能對Secure 的數(shù)據(jù)進(jìn)行操作,但Secure World 可以將NS行分配到緩沖區(qū)。另外,緩存的啟用和禁用在每個異常級別都是不同的。緩存控制對于兩個世界來說都是獨立的,但對所有的異常級別來說并不是獨立的。所以,EL0不能直接啟用或禁用緩存,而EL2可以覆蓋Non-secure ?EL1的行為。
Secure World和Non-secure World 的交互
如果你在包含安全服務(wù)的系統(tǒng)中編寫代碼,了解Secure World和Non-secure World 的交互方式對你很有用。一個典型的操作系統(tǒng)都會包含一個輕量的內(nèi)核或者可信執(zhí)行環(huán)境(TEE)。例如,在Secure World運行加密服務(wù)。它可以與Normal World 中的操作系統(tǒng)進(jìn)行交互,Normal World 可以通過SMC調(diào)用訪問Secure World。通過這種方式,Normal World 既可以訪問Secure World,又不會擔(dān)心暴露加密的密鑰。
一般來講,開發(fā)人員不會與安全擴展組件,TEE,或者可信服務(wù)直接交互,而是通過Normal world ?提供的API(例如authenticate())訪問Secure World。
下圖以應(yīng)用程序調(diào)用API的形式展示了Normal world 和Secure World 的交互。API通過系統(tǒng)調(diào)用到TrustZone Driver,然后經(jīng)過 Secure monitor傳遞給TEE。
這種調(diào)用方式會在Secure World和Normal World間頻繁傳遞數(shù)據(jù)。
例如,在 Secure world 中有一個簽名檢查器。Normal world可以請求Secure World使用SMC調(diào)用來驗證下載更新的簽名。如果Secure World需要訪問Normal world所使用的內(nèi)存,Secure World可以使用其翻譯表描述符中的NS位,以確保它使用Non-secure方式訪問來讀取數(shù)據(jù)。
這一點很重要,因為與請求數(shù)據(jù)相關(guān)的內(nèi)容可能已經(jīng)在緩存中了,因為Secure World執(zhí)行的訪問都會標(biāo)記為Non-secure的地址。安全屬性可以被認(rèn)為是一個額外的地址位。如果內(nèi)核使用安全內(nèi)存訪問來嘗試讀取數(shù)據(jù),它就不會命中已經(jīng)在緩存中的Non-secure數(shù)據(jù)。
如果你是一個平時只會和Normal world打交道的程序員,你可以忽略Secure World中發(fā)生的事情,因為它的操作對你來說是隱藏的。一個副作用是,中斷延遲可能會略有增加。Secure World可以是完全阻塞的,所以如果一個中斷發(fā)生Secure World中時,這可能會阻塞Normal world的中斷。但與一般操作系統(tǒng)的整體延遲相比,可以忽略不計。這種問題給Normal world帶來的影響取決于Secure World操作系統(tǒng)的架構(gòu)設(shè)計。
Secure 和Normal worlds 的切換
在ARMv7的安全擴展中,軟件使用Monitor mode在Secure 和Non-secure state切換。該模式和Secure state 中其他特權(quán)模式是一樣的。在ARMv8-A處理器中,AArch32相當(dāng)于ARMv7-A。
對于ARMv8架構(gòu),當(dāng)EL3使用AArch32時,ARMv8架構(gòu)相當(dāng)于ARMv7,以確保完全兼容,安全狀態(tài)下的所有特權(quán)模式被視為處于EL3。
AArch32的安全模型如下圖所示。在這種情況下,EL3是AArch32,以提供一個安全的操作系統(tǒng)和監(jiān)視器。
下圖顯示了當(dāng)EL3執(zhí)行AArch64以提供安全監(jiān)視器時的安全模型。EL1用于安全操作系統(tǒng)。當(dāng)EL3使用AArch64時,EL3被用來執(zhí)行負(fù)責(zé)在Non-secure state和Secure state之間切換的代碼。
為了與AArch32保持一致,Secure state的EL1和EL0具有和Non-secure state的EL1和EL0不同的虛擬地址空間。這使得AArch32 32位架構(gòu)的運行在Secure state的代碼可以在Non-secure state運行的64位操作系統(tǒng)中使用。
當(dāng)Normal World 執(zhí)行停止而Secure World的執(zhí)行開始時,通過執(zhí)行 Secure Monitor(SMC)指令或通過硬件異常機制(如中斷或異步中止)在它們之間進(jìn)行上下文切換。ARM處理器有兩種中斷類型:FIQ和IRQ。
在Secure World中也是支持中斷的,其原理是將Secure World產(chǎn)生的中斷重定向到EL3,并且 和當(dāng)前的DAIF 字段無關(guān)。然而,這些控制只區(qū)分了主要的中斷類型。IRQ, FIQ, and asynchronous aborts。更詳細(xì)的控制需要將中斷分為 Secure 和Non-secure組。如果要做到這一點,需要GIC的支持,在GIC中有一些特性來支持劃分為不同的組。
一個典型的例子是FIQ被用作Secure interrupts,通過在中斷控制器內(nèi)將安全中斷源映射為FIQ。同時,相關(guān)的外設(shè)和中斷控制器寄存器必須被標(biāo)記為只能被安全訪問,以防止Normal World重新配置這些中斷。
使用安全擴展的實現(xiàn)通常有一個輕量級的可信內(nèi)核,在Secure World中托管安全服務(wù)(例如加密)。一個完整的操作系統(tǒng)在Normal World中運行,并能夠使用SMC指令訪問安全服務(wù)。通過這種方式,Normal World可以訪問服務(wù)功能,在普通世界中執(zhí)行的任意代碼不會有敏感數(shù)據(jù)暴露的風(fēng)險。
集群中的安全問題
集群系統(tǒng)中的每個內(nèi)核都具有相同的安全特性。集群中任何數(shù)量的核心都可以在任何時間點上在Secure World中執(zhí)行,并且核心能夠在世界之間獨立過渡。寄存器控制Normal World代碼是否可以修改Snoop控制單元(SCU)的設(shè)置。同樣,在整個集群中分配優(yōu)先級中斷的GIC必須被配置為安全狀態(tài)。
安全系統(tǒng)還控制調(diào)試規(guī)定的可用性。你可以為 Normal worlds 和Secure worlds配置獨立的硬件調(diào)試,如JTAG調(diào)試和跟蹤控制,這樣就不會有關(guān)于受信任系統(tǒng)的信息泄露了。你可以通過一個安全外設(shè)來控制硬件配置選項,或者你可以硬件連接它們,并使用以下信號來控制它們。
? Secure Privileged Invasive Debug Enable (SPIDEN): JTAG debug.
? Secure Privileged Non-Invasive Debug Enable (SPNIDEN): Trace and Performance Monitor.
總結(jié)
TrustZone 是ARM 架構(gòu)的一個安全擴展模型,可以用在任何ARM處理器中。
Normal world 通過SMC指令訪問Secure world。Secure monitor 管理著Normal World和Secure World 的切換。Secure monitor 的代碼在禁用中斷的上下文執(zhí)行。
內(nèi)存系統(tǒng)事務(wù)中的NS位表示訪問的是Secure World 的內(nèi)存還是Normal World的內(nèi)存。Normal World只能對內(nèi)存進(jìn)行非安全訪問,Secure World 既可以進(jìn)行安全訪問,也可以進(jìn)行非安全訪問,只需要更改NS位即可。
Secure World的翻譯表和Non-Secure World的翻譯表是獨立的,Secure World的翻譯表受到Normal World的保護(hù)。
ARMv8-A 可以兼容32位和64位TrustZone。當(dāng)ARMv8-A運行AArch32 TrustZone 時,相當(dāng)于ARMv7-A。二者區(qū)別主要在于EL3的不同,ARMv7-A中EL3 提供Secure ?Monitor 和Srcure OS,而ARMV8 中,EL3只提供Secure ?Monitor 。
本文參考
security_in_an_armv8_system_100935_0100_en