Armv8/Armv9的Trustzone技術(shù)
來(lái)源:湖北國(guó)菱計(jì)算機(jī)科技有限公司-湖北國(guó)聯(lián)計(jì)算機(jī)科技有限公司-荊州網(wǎng)站建設(shè)-荊州軟件開(kāi)發(fā)-政府網(wǎng)站建設(shè)公司
時(shí)間:2025-03-18
1、背景:
隨著時(shí)代的發(fā)展、科技的進(jìn)步,安全需求的趨勢(shì)也越來(lái)越明顯,ARM也一直在調(diào)整和更新其新架構(gòu),很多都是和安全相關(guān)的。 如下列出了一些和安全相關(guān)的架構(gòu)
Trustzone做為ARM安全架構(gòu)的一部分,從 2008 年 12月 ARM 公司第一次 release Trustzone 技術(shù)白皮書。() 2013 年 Apple 推出了第一款搭載指紋解鎖的 iPhone:iPhone 5s,用以保證指紋信息安全的 Secure Enclave 技術(shù)據(jù)分析深度定制了 ARM trustzone 架構(gòu),印象中這大概是 Trustzone 技術(shù)第一次走進(jìn)大眾視線。到如今 Trustzone 技術(shù)已經(jīng)成為移動(dòng)安全領(lǐng)域的重要基礎(chǔ)技術(shù),你也許不了解它的技術(shù)原理,但它一直默默為你守護(hù)你的指紋信息,賬戶密碼等各種敏感數(shù)據(jù)。 如下也列出了一張?jiān)赥rustzone架構(gòu)下的一張指紋的框圖,這也是這些年(2015-至今)比較流行的一張軟件框圖。
1.1、ARM Trustzone的安全擴(kuò)展簡(jiǎn)介
從上文我們已經(jīng)知道,ARM Trustzone不具體指一個(gè)硬件,也不是一個(gè)軟件,而是一個(gè)技術(shù)架構(gòu),在支持ARM Trustzone的SOC中,需按照ARM Trustzone技術(shù)對(duì)各個(gè)子模塊進(jìn)行設(shè)計(jì)。如下便展示了一個(gè)SOC的Trustzone架構(gòu)下的設(shè)計(jì)框圖
其中
(1)、AMBA-AXI總線的擴(kuò)展, 增加了標(biāo)志secure讀和寫地址線:AWPROT[1]和ARPROT[1]
(2)、processor的擴(kuò)展(或者說(shuō)master的擴(kuò)展),在ARM Core內(nèi)部增加了SCR.NS比特位,這樣ARM Core發(fā)起的操作就可以被標(biāo)記“是以secure身份發(fā)起的訪問(wèn),還是以non-secure身份發(fā)起的訪問(wèn)”
(3)、TZPC擴(kuò)展,在AXI-TO-APB端增加了TZPC,用于配置apb controller的權(quán)限(或者叫secure controller),例如將efuse(OTP Fuse)配置成安全屬性后,那么processor以non-secure發(fā)起的訪問(wèn)將會(huì)被拒絕,非法的訪問(wèn)將會(huì)返回給AXI總線一個(gè)錯(cuò)誤。
(4)、TZASC擴(kuò)展,在DDRC(DMC)之上增加一個(gè)memory filter,現(xiàn)在一般都是使用TZC400,或由SOC廠商自己設(shè)計(jì)一個(gè)這樣的IP,或叫MPU,或集成在DMC內(nèi)部,它的作用一般就是配置DDR的權(quán)限。 如果配置了DDR中某塊region為安全屬性,那么processor以non-secure發(fā)起的訪問(wèn)將會(huì)被拒絕。
(5)、MMU/Cache對(duì)安全擴(kuò)展的支持 在軟件架構(gòu)的設(shè)計(jì)中,就分為: Non-secure EL0&1 Transslation Regime 和 Secure EL0&1 Transslation Regime,即normal world和secure world側(cè)使用不同的Transslation Regime,其實(shí)就是使用不同的TTBRx_ELn寄存器,使用不同得頁(yè)表。 注意:在armv7上,TTBRx_EL0、TTBRx_EL1是banked by Security State,也就是說(shuō)在安全世界和非安全世界各有一組這樣的寄存器,所以在linux和tee中可以各自維護(hù)一張自己的內(nèi)存頁(yè)表. 在armv8/armv9上,TTBRx_EL0、TTBRx_EL1不再是banked了,但是world switch時(shí)會(huì)在ATF中switch cpu context, 所以從hypervisror或os的視角來(lái)看,依然還是兩套不同的TTBRx_ELn寄存器,linux和tee各有各的頁(yè)表。 而在TLB中,又為每一個(gè)entry增加了Non-secure屬性位,即標(biāo)記當(dāng)前翻譯出的物理地址是secure還是non-secure; cache的擴(kuò)展:在cache的entry中的TAG中,有一個(gè)NON-Secure Identifier標(biāo)記為,表示當(dāng)前緩存數(shù)據(jù)的物理地址是屬于non-secure還是secure。
(6)、gic對(duì)安全擴(kuò)展的支持,在gicv2、gicv3的版本中,都增加了對(duì)安全擴(kuò)展的支持. 以gicv3為例,將中斷劃分成了group0、secure group1和non-secure group1. 在軟件的配置下,group0和secure group1的中斷將不會(huì)target到REE(linux)中處理
1.2、ARM Trustzone的安全擴(kuò)展詳細(xì)解剖
1.3、 AMBA-AXI對(duì)Trustzone的支持
ARPROT[2:0]和AWPROT[2:0] 分別是讀通道和寫通道中的關(guān)于權(quán)限的信號(hào),例如他們中的BIT[1]則分別表示正是進(jìn)行secure身份的讀或secure身份的寫操作。
1.4Processor的SCR.NS比特位
SCR_EL3.NS 表示當(dāng)前processor的安全狀態(tài),NS=1表示是non-secure的,NS=0表示是Secure的
2.TZC400和TZPC簡(jiǎn)介
TZC400接在core和(DMC)DDR之間,相當(dāng)于一個(gè)memory filter。 TZC400一般可以配置8個(gè)region(算上特殊region0, 也可以說(shuō)9個(gè)),然后可以對(duì)每一個(gè)region配置權(quán)限。例如講一塊region配置成secure RW的,那么當(dāng)有non-secure的master來(lái)訪問(wèn)這塊內(nèi)存時(shí),將會(huì)被TZC擋住。
2.1 MMU對(duì)Trustzone的支持
首頁(yè),在軟件架構(gòu)的設(shè)計(jì)中,就分為: Non-secure EL0&1 Transslation Regime 和 Secure EL0&1 Transslation Regime,即normal world和secure world側(cè)使用不同的Transslation Regime;
其實(shí)就是使用不同的TTBRx_ELn寄存器,使用不同得頁(yè)表 其次,在MMU使用的頁(yè)表中,也有NS比特位。
Non-secure Transslation Regime 只能翻譯NS=1的頁(yè)表項(xiàng),secure Transslation Regime 可以翻譯NS=1和NS=0的頁(yè)表項(xiàng)。
即secure的頁(yè)表可以映射non-secure或secure的內(nèi)存,而non-secure的頁(yè)表只能去映射non-secure的內(nèi)存,否則在轉(zhuǎn)換時(shí)會(huì)發(fā)生錯(cuò)誤
在Page Descriptor中(頁(yè)表entry中),有NS比特位(BIT[5]),表示當(dāng)前的映射的內(nèi)存屬于安全內(nèi)存還是非安全內(nèi)存:
2.2 cache對(duì)Trustzone的支持
如下所示,以為cortex-A78為例,L1 Data Cache TAG中 ,有一個(gè)NS比特位(BIT[33]),表示當(dāng)前緩存的cacheline是secure的還是non-secure的
2.3 TLB對(duì)Trustzone的支持
如下所示,以為cortex-A78為例,L1 Data TLB entry中 ,有一個(gè)NS比特位(BIT[35]),表示當(dāng)前緩存的entry是secure的還是non-secure的
2.4 gicv的安全中斷
在gicv2/gicv3中,支持了安全中斷,配置有如下: (1)、Group分組(GICD_IGROUPRn) – gicv2 ?group0:安全中斷,由nFIQ驅(qū)動(dòng) ?group1:非安全中斷,由nIRQ驅(qū)動(dòng)
(2)、Group分組(GICD_IGROUPRn)– gicv3 ?group0:安全中斷 ?non-secure group1:非安全中斷 ?secure group1:安全中斷
3.ARM Trustzone技術(shù)對(duì)軟件帶來(lái)的變化
ARM Trustzone技術(shù)對(duì)軟件框架帶來(lái)了變化
3.1、EL3 is AArch64:
3.2、EL3 is AArch32:
AArch32和AArch64 secure monitor的理解:
如果secureos和monitor都是64位,secureos跑在el1, monitor跑在el3;- 如果secureos和monitor都是32位,secureos和monitor都跑在EL3(secureos在svc模式、monitor在svc模式),它倆共用頁(yè)表;- 如果monitor是64位,secureos是32位,那么secureos跑在svc模式(el1),monitor跑在el3,他倆不共用頁(yè)表
3.3、armv7:
思考:通過(guò)MMU/TLB/Cache對(duì)安全內(nèi)存攻擊的可能性
在安全架構(gòu)的設(shè)計(jì)時(shí),我們?cè)?/span>Core和DDR之間增加了一個(gè)TZC做為memory filter,數(shù)據(jù)流為:Core ---> TZC---->DDR, 這種架構(gòu)下,core以非安全身份發(fā)起的對(duì)安全內(nèi)存的讀寫,將會(huì)被TZC擋住。
但是這都是在理想的情況下,事實(shí)上Core發(fā)起對(duì)內(nèi)存的讀寫,未必經(jīng)過(guò)TZC未必到DDR,有可能到cache階段就完成了,即數(shù)據(jù)流變成了Core ---> MMU(TLB+Addtress Translation)---->Cache,那么這種情況下,沒(méi)有TZC的事了,你也許會(huì)說(shuō)MMU/Cache中都有NS比特,但是你真的理解這里NS比特的用法嗎? 如果core以非安全身份對(duì)安全內(nèi)存發(fā)起的讀寫時(shí),我強(qiáng)制將MMU頁(yè)表中的安全屬性標(biāo)記位強(qiáng)制改成NS=0,會(huì)如何呢?
事實(shí)上我們只要理清原理、理清數(shù)據(jù)流,就不會(huì)問(wèn)上面那么S13的問(wèn)題了。 下面來(lái)開(kāi)始剖析:
假設(shè)一個(gè)安全core 讀取了一個(gè)安全物理內(nèi)存0x2000_0000數(shù)據(jù)(虛擬地址可能是0x_xxxx_xxxx),那么將產(chǎn)生一下行為:
在讀寫之前,勢(shì)必做好了MMU map,如物理地址0x2000_0000 MAP成了0x_xxxx_xxxx地址, 此時(shí)Page Descriptor中的atrribute中的NS=0- TLB緩存該翻譯,即TLB的entry中包含: 0x2000_0000、0x_xxxx_xxxx、NS=0- 安全內(nèi)存0x2000_0000數(shù)據(jù)將會(huì)被緩存到cache中,entry中的TAG包含0x2000_0000、NS=0
同時(shí),我有一個(gè)非安全core 發(fā)起讀寫虛擬地址0x_yyyy_yyyy,我自行修改該頁(yè)表,讓0x_yyyy_yyyy強(qiáng)制映射到安全物理內(nèi)存0x2000_0000,此時(shí)有兩種配置: (1)、0x_yyyy_yyyy—0x2000_0000, NS=0 (2)、0x_yyyy_yyyy—0x2000_0000, NS=1 我們分別看下這兩種配置,是否能讀到安全內(nèi)存: 針對(duì)(1),非安全的core發(fā)起訪問(wèn),發(fā)現(xiàn)TLB中的條目是0x_yyyy_yyyy—0x2000_0000, NS=0,自然不會(huì)被命中,然后使用Address Translation轉(zhuǎn)換,MMU發(fā)現(xiàn)非安全的Core要來(lái)訪問(wèn)安全屬性NS=0 將會(huì)被直接拒絕掉。 針對(duì)(2),非安全的core發(fā)起訪問(wèn),由于NS=1,TLB可能會(huì)被命中,即能翻譯出0x2000_0000物理地址來(lái),即使沒(méi)有被命中,在經(jīng)過(guò)Address Translation轉(zhuǎn)換,由于NS=1,此時(shí)也是可以正確轉(zhuǎn)換出正確的0x2000_0000物理地址。 然后接著會(huì)去cache中查詢這個(gè)地址,但是此時(shí)cache的entry中的NS=0,所以cache不會(huì)被命中,接下來(lái)就要走TZC流程了,很顯然,你一個(gè)非安全的core想訪問(wèn)安全的內(nèi)存,TZC將會(huì)擋住你。
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/Aileenvov/article/details/136612575