TrustZone
恩智浦基于Cortex M33內核的MCU,LPC55S6x/LPC55S1x, RT600/RT500等產品提供了對TrustZone的支持,并在SOC上提供了安全AHB控制器等功能,旨在幫助客戶完成良好的安全隔離,并建立可信執行環境。
在產品設計之初,我們就要有一個基本的“隔離”的概念。
需要考慮的問題大致有以下兩個方面:
產品中的哪些功能和模塊應該放在安全區?(這部分代碼往往是核心且精簡,且經過安全審查的,安全區的內容不允許非安全區的代碼觸碰);
哪些功能應該放在非安全區?(這樣放在非安全區中的代碼,即使出現安全漏洞(例如棧溢出漏洞等等)后被攻擊,MCU的安全區中的資源和外設也無法被攻擊者利用)。
令人頭疼的HardFault
對于MCU工程師,TrustZone是一個比較新的技術,在開發調試過程中,由于TrustZone配置問題,時常遇到各種意料之外的HardFault,我們也經常調侃,這個TrustZone也太安全了,連我們自己都進不去。
其實這種問題往往是由于在開發階段,我們實際的行為和我們對TrustZone的劃分不一致。
平常我們認為正常的行為與操作,對于TrustZone來說,已經越界違規了,這就會使TruztZone觸發HardFault,并阻止違規行為。
在這種情況下,我們就需要找到導致HardFault的原因,并調整對于TrustZone的配置。
注:TrustZone相關的故障會觸發SecureFault異常。在芯片上電后的默認情況下,SecureFault異常并沒有被使能,因此,此異常會被“升級”為HardFault。在通常情況下,建議使用默認的設置,因為HardFault擁有更高的中斷優先級,可以使故障在第一時間被響應。
獲取違規操作的蛛絲馬跡
Cortex M33內核本身在SAU中提供了兩個寄存器:SFSR(Secure FaultStatus Register,安全故障狀態寄存器)和SFAR(Secure Fault Address Register,安全故障地址寄存器)。
SFSR寄存器用于指示出現錯誤的類型,例如非安全區試圖訪問安全區,從安全區到非安全區的非法跳轉等。
SFAR寄存器用于指示出現錯誤的內存地址。
看起來這兩個寄存器就足以幫助我們查到問題的根源了。但是,有時候,我們從這兩個寄存器拿到了錯誤的原因和地址,仔細檢查后發現無論是安全區還是非安全區的程序,都沒有顯式的訪問這個地址。
這是由于MCU系統愈發復雜,總線上除了M33內核之外,還有許許多多的其他的外設,例如DMA,USB等等。肇事者不一定是M33內核,還有可能是其他的外設,例如DMA。
下面是一種常見的事故:被劃分為非安全的DMA在工作中訪問了安全區的地址或外設,違反了TrustZone的配置,造成了HardFault。
恩智浦的MCU在SOC層面提供了一個安全AHB控制器,能夠幫我們偵查肇事現場,找出肇事者的蛛絲馬跡。
其實原理很簡單,安全AHB控制器提供了三個寄存器,SEC_VIO_INFO_VALID,SEC_VIO_MISC_INFO和SEC_VIO_ADDR。
SEC_VIO_INFO_VALID用來指示肇事現場,這個寄存器中存儲了肇事現場的AHB 的端口號(port number),端口號與外設的對應關系參見用戶手冊的”Memory map overview”章節。
每一個AHB端口都相應有一個SEC_VIO_MISC_INFO寄存器,用來指示肇事的信息,例如違規操作是讀操作引起的還是寫操作引起的等等,最重要的是會指出肇事者的身份:
每個AHB端口還有一個SEC_VIO_ADDR,用來指示肇事現場的地址。
有了上述信息,我們就捉到了真正的肇事者。在開發階段,我們就可以利用這些信息去調整我們的TrustZone的配置。
更進一步
當然,上述功能不只能在開發階段幫我們排查HardFault。我們也可以利用這個機制在產品出廠之后為我們提供防御措施。
產品出廠后,當我們檢測到由TrustZone產生的HardFault的原因之后,可以將其記錄,以便于后續分析。如果設備有聯網能力,可以將其傳輸至服務器。利用這些信息我們可以發現產品的哪些模塊受到了攻擊,方便我們后續針對性地進行OTA升級。云端和設備本地也可在此時檢測鏡像以及存儲介質的完整性,以檢查程序和存儲介質是否被惡意篡改。
小結
綜上所述,利用SAU和安全AHB控制器調查HardFault的方法并不復雜,NXP的MCUXpresso SDK也提供了一個完整的demo。
以LPC55S69為例,demo的路徑如下:SDKboardslpcxpresso55s69trustzone_examplessecure_faults。
這個demo中,人為制造了幾種TrustZone觸發HardFault的案例,在產生HardFault后,使用上文描述的方法,處理相關寄存器并打印事故信息。
通常來說,在開發階段,我們可以參考demo中HardFault的處理代碼,按需移植到自己的工程中。
來源:恩智浦MCU加油站
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17123瀏覽量
350992 -
內核
+關注
關注
3文章
1372瀏覽量
40278 -
soc
+關注
關注
38文章
4161瀏覽量
218165 -
trustzone
+關注
關注
0文章
20瀏覽量
12535
發布評論請先 登錄
相關推薦
評論