物聯(lián)網(wǎng)(IoT)是嵌入式開(kāi)發(fā)者的熱門(mén)話題,IoT系統(tǒng)產(chǎn)品變得更加復(fù)雜,同時(shí)也需要更好的方案來(lái)保證系統(tǒng)的安全。本文介紹基于M33核NXP LPC55Sxx MCU擁有的TrustZone技術(shù)來(lái)實(shí)現(xiàn)IoT安全。
一、TrustZone技術(shù)介紹
LPC5500系列MCU以Arm最新的Cortex-M33為核心,與前幾代產(chǎn)品相比,改進(jìn)了產(chǎn)品架構(gòu)并提高了集成度;大幅減小了功耗,并提供高級(jí)安全功能,通過(guò)Arm TrustZone-M保護(hù)資產(chǎn)。
近幾年來(lái),物聯(lián)網(wǎng)(IoT)成為了嵌入式開(kāi)發(fā)者的熱門(mén)話題。IoT系統(tǒng)產(chǎn)品變得更加復(fù)雜,同時(shí)也需要更好的方案來(lái)保證系統(tǒng)的安全。
傳統(tǒng)的方案是通過(guò)把軟件分成特權(quán)和非特權(quán)兩部分解決。特權(quán)級(jí)軟件利用MPU防止非特權(quán)軟件的應(yīng)用,訪問(wèn)包含敏感信息在內(nèi)的關(guān)鍵系統(tǒng)資源。
這些方案對(duì)一些IoT系統(tǒng)非常適合,但是在一些情況下,只有兩層劃分是不夠的。特別是那些包含很多復(fù)雜特權(quán)級(jí)別的軟件組成的系統(tǒng),特權(quán)級(jí)代碼的一個(gè)缺陷,就可能導(dǎo)致黑客徹底的控制整個(gè)系統(tǒng)。
為了更好地提高M(jìn)CU的安全性能,Arm在ARMv8-M架構(gòu)中引入了TrustZone技術(shù)。ARMv8-M中的TrustZone技術(shù)是一種可選擇的安全擴(kuò)展,旨在為各種嵌入式系統(tǒng)應(yīng)用提供基本的安全保障。
TrustZone技術(shù)將系統(tǒng)分為安全區(qū)和非安全區(qū)兩部分,并通過(guò)特殊的指令實(shí)現(xiàn)兩種區(qū)域內(nèi)函數(shù)的相互訪問(wèn)。
TrustZone的概念不是最新的了,它被應(yīng)用在Arm Cortex-A系列處理器中已經(jīng)有一段時(shí)間了,現(xiàn)在被擴(kuò)展到了ARMv8-M 處理器中,它與Cortex-A處理器中的TrustZone并不是完全相同的,本篇中所描述的TrustZone技術(shù)都是基于Cortex-M處理器的。
1.1TrustZone的特性:
允許用戶(hù)將內(nèi)存劃分為安全和非安全區(qū)域;
允許在未經(jīng)過(guò)身份驗(yàn)證時(shí)阻止調(diào)試安全代碼/數(shù)據(jù);
NVIC、MPU、SYSTICK、內(nèi)核控制寄存器等也被備份到兩個(gè)區(qū)域中 ,安全代碼和非安全代碼可以獨(dú)立訪問(wèn)自己的資源;
安全區(qū)和非安全區(qū)都有MSP和PSP堆棧指針;
提出了Secure Gateway的概念,非安全代碼可以通過(guò)Secure Gateway訪問(wèn)特定的安全代碼,這也是非安全代碼訪問(wèn)安全代碼的唯一方式;
提供了一個(gè)Stack Limit Checking(堆棧限制檢查)功能,可以用于檢測(cè)堆棧溢出的情況。在Cortex-M33對(duì)應(yīng)的ARMv8-M架構(gòu)中,每個(gè)堆棧指針都有相應(yīng)的堆棧限制寄存器。
1.2Register banking
上節(jié)提到一些有內(nèi)核相關(guān)的寄存器也被備份到了安全/非安全區(qū)域中,下圖展示了具體哪些通用/特殊寄存器被備份到兩種內(nèi)存中。
1.3TrustZone 技術(shù)可以滿(mǎn)足的安全需求
Data protection:敏感數(shù)據(jù)可以存儲(chǔ)在安全內(nèi)存中,只可以被安全軟件訪問(wèn)。只有在安全檢查和授權(quán)之后,非安全軟件才可以訪問(wèn)安全APIs。
Firmware protection:固件可以預(yù)裝載在安全區(qū)域中,防止逆向操作和惡意攻擊。
Operation protection:關(guān)鍵操作可以像安全固件一樣,被預(yù)加載到安全內(nèi)存中,并且配置適當(dāng)?shù)耐庠O(shè)僅在安全狀態(tài)下訪問(wèn)。通過(guò)這種方式, 可以保護(hù)操作免受來(lái)自非安全端的入侵。
Secure boot:安全啟動(dòng)機(jī)制可以使用戶(hù)對(duì)自己的平臺(tái)充滿(mǎn)信心,因?yàn)樗冀K從安全內(nèi)存啟動(dòng)。
二、Secure/Non-Secure存儲(chǔ)器配置
在Cortex-M33中,如果選配了TrustZone技術(shù),則4G的內(nèi)存空間將被劃分為安全和非安全內(nèi)存區(qū)域。安全內(nèi)存空間又可以進(jìn)一步劃分為兩種類(lèi)型: Secure和Non-secure Callable(NSC)。
三種內(nèi)存區(qū)域的特性:
Secure:安全數(shù)據(jù)只可以被安全代碼訪問(wèn),安全代碼只有在CPU處于安全模式時(shí)才可以被執(zhí)行;
Non-secure:非安全數(shù)據(jù)可以被安全和非安全狀態(tài)訪問(wèn),但非安全代碼只能在CPU處于非安全狀態(tài)時(shí)被執(zhí)行;
Non-secure Callable(NSC):NSC區(qū)域作為非安全函數(shù)訪問(wèn)安全函數(shù)的跳板。非安全代碼需要先跳轉(zhuǎn)到NSC區(qū)域中,執(zhí)行SG指令,然后再跳轉(zhuǎn)到相應(yīng)的的安全函數(shù)處執(zhí)行,這也是NS代碼訪問(wèn)S函數(shù)的唯一方式。
引入NSC存儲(chǔ)區(qū)的原因,是為了防止其他二進(jìn)制數(shù)據(jù)(例如,具有與SG指令的操作碼相同的值的查找表)被用作安全狀態(tài)的入口函數(shù)。
2.1內(nèi)存區(qū)域的的安全屬性定義
內(nèi)存區(qū)域的安全屬性是由Secure Attribution Unit(SAU)和Implementation Defined Attribution Unit(IDAU) 共同決定的。
SAU的作用和IDAU是相似的,都是用于分離安全區(qū)和非安全區(qū)。兩者最大的區(qū)別是SAU位于CPU內(nèi)部,IDAU在CPU外部。
無(wú)論是IDAU和SAU都可以定義一塊內(nèi)存的安全屬性,此時(shí)CPU會(huì)選擇兩者中較高的安全屬性作為此塊內(nèi)存最終的安全屬性,最高的安全屬性是Secure,其次是Non-Secure Callable,最后是Non-secure。
2.2IDAU
IDAU除了可以向處理器指示特定存儲(chǔ)器地址是Secure、NSC還是Non-secure,提供存儲(chǔ)器地址所在的區(qū)域編號(hào)之外,它還可以標(biāo)記免受安全檢查的內(nèi)存區(qū)域,例如ROM表。
理論上,IDAU是可以設(shè)計(jì)為可編程的,但是IDAU接口上的信號(hào)位于時(shí)序的關(guān)鍵路徑上,這會(huì)使IDAU的設(shè)計(jì)變得非常復(fù)雜,不切實(shí)際,也會(huì)導(dǎo)致設(shè)計(jì)中的門(mén)數(shù)更高。
實(shí)際上,IDAU只提供了有限的可配置的簡(jiǎn)單存儲(chǔ)器映射。
LPC55Sxx 的IDAU提供的配置如下圖所示:
其中,0x00000000到0x1FFFFFFF是NS區(qū)域,在0x20000000到0xFFFFFFF范圍內(nèi),是根據(jù)存儲(chǔ)器地址的第28位來(lái)判斷該內(nèi)存地址的安全屬性,若Bit_28=0, 則為非安全地址,若Bit_28=1, 則為安全地址。
2.3SAU
SAU為每個(gè)內(nèi)存區(qū)域定義了一個(gè)Region Number(RN)。RN可以被TT指令用來(lái)決定目標(biāo)內(nèi)存的訪問(wèn)權(quán)限和安全屬性。RN的數(shù)量可以被SAU配置為0、4或者8。
SAU是由設(shè)計(jì)者配置的,設(shè)計(jì)者可以在IDAU配置的內(nèi)存屬性的基礎(chǔ)上,用SAU去重定義內(nèi)存中的一些區(qū)域的安全屬性,CPU會(huì)根據(jù)IDAU和SAU的配置,決定內(nèi)存的最終安全屬性。
LPC55Sxx復(fù)位后,默認(rèn)的SAU配置是: 所有存儲(chǔ)空間都是安全的。結(jié)合IDAU的默認(rèn)配置,LPC55Sxx的最終默認(rèn)配置如下圖所示,即所有內(nèi)存區(qū)域都是安全的。
三、Secure/Non-secure轉(zhuǎn)換
第二節(jié)中介紹了如何利用SAU和IDAU配置一塊內(nèi)存區(qū)域的安全屬性,用戶(hù)可以在安全區(qū)和非安全區(qū)定義相應(yīng)的函數(shù),TrustZone技術(shù)允許兩種狀態(tài)下的函數(shù)相互調(diào)用,在進(jìn)行相互調(diào)用時(shí)需要用到幾個(gè)特殊指令:SG、BXNS、BLXNS, 如下表所示。
執(zhí)行狀態(tài)切換時(shí)的具體操作如下圖所示:
SG指令:用于從非安全狀態(tài)切換到安全狀態(tài),是從非安全區(qū)跳轉(zhuǎn)到NSC區(qū)域之后執(zhí)行的第一條指令;
BXNS指令: 用于從安全狀態(tài)返回到非安全狀態(tài);
BLXNS指令: 用于在安全狀態(tài)下調(diào)用非安全函數(shù)。
這里介紹兩種特殊的函數(shù):Entry function和Non-secure function。
Entry function是指那些可以被非安全函數(shù)調(diào)用的安全函數(shù);
Non-secure function是指那些可以被安全函數(shù)調(diào)用的非安全函數(shù)。
用戶(hù)在實(shí)現(xiàn)兩種狀態(tài)下函數(shù)的相互調(diào)用時(shí),不需要額外關(guān)注該執(zhí)行哪條特殊指令(SG/BXNS/BLXNS),而只需要將那些被調(diào)用的函數(shù)定義為Entry function或 Non-secure function即可。下面簡(jiǎn)單介紹如何定義以及使用Entry function和Non-secure function。
3.1Entry function
Entry function需要用“__attribute__((cmse_nonsecure_entry)) ”屬性修飾,舉例如下:
此時(shí)func1()已經(jīng)被定義為了entry function,在非安全內(nèi)存中調(diào)用entry function的方法與調(diào)用普通的非安全函數(shù)的方法是相同的,如下所示:
這樣即可實(shí)現(xiàn)非安全函數(shù)調(diào)用安全函數(shù)的功能。
3.2Non-secure function call
Non-secure function函數(shù)定義如下所示:
在安全內(nèi)存中的調(diào)用non-secure function的方法如下:
這樣即可實(shí)現(xiàn)在安全函數(shù)中調(diào)用0x21000248u處的非安全函數(shù)。
四、總結(jié)
看到這里,各位看官是不是對(duì)LPC55Sxx中的TrustZone技術(shù)的使用方法有了初步的了解呢,下面小編再為大家總結(jié)一下使用TrustZone時(shí)軟件的工作流程:
在明白了這些之后,大家就可以開(kāi)始行動(dòng)起來(lái),利用手里的LPC55Sxx來(lái)設(shè)計(jì)自己的安全系統(tǒng)了。
TrustZone詳細(xì)培訓(xùn)視頻最后,讓我們來(lái)看看由本文作者做的,一個(gè)關(guān)于TrustZone的詳細(xì)培訓(xùn)視頻,您可以更深入地理解前面所講的內(nèi)容。
-
mcu
+關(guān)注
關(guān)注
146文章
17324瀏覽量
352659 -
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121195 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2914文章
44939瀏覽量
377085
原文標(biāo)題:【技術(shù)解析】設(shè)計(jì)安全系統(tǒng)?你也可以!
文章出處:【微信號(hào):Zlgmcu7890,微信公眾號(hào):周立功單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論