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