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