這是四部分系列文章的第二部分,介紹了獨(dú)特的產(chǎn)品 MPU-Plus 和使用 Cortex-M 內(nèi)存保護(hù)單元 (MPU) 來提高微控制器單元 (MCU) 安全性的方法。第 1部分介紹了一些介紹性概念:MMU 與 MPU、對(duì)安全性、保護(hù)目標(biāo)、MPU-Plus 快照、Cortex-v7M 和 v8M 以及 MPU 操作的日益增長的需求。
圖 1:分區(qū)
圖 1 說明了我們?yōu)榘踩?shí)現(xiàn)的軟件結(jié)構(gòu)。在此圖中,橢圓表示隔離的分區(qū)。粗線以上的分區(qū)以u(píng)mode(非特權(quán)或用戶模式)運(yùn)行,粗線以下的分區(qū)以pmode(特權(quán)或保護(hù)模式)運(yùn)行。粗線表示非特權(quán)操作和特權(quán)操作之間的界限。這種隔離由 Cortex-M 處理器架構(gòu)強(qiáng)制執(zhí)行。它是安全可靠的,除非我們做錯(cuò)了什么。
粗線上方是兩個(gè)應(yīng)用程序分區(qū)和一個(gè)中間件分區(qū)。當(dāng)然,實(shí)際系統(tǒng)可能有更多的 umode 分區(qū)。這里的目標(biāo)是實(shí)現(xiàn)一個(gè) umode 分區(qū)與另一個(gè)分區(qū)的完全隔離。然后穿透一個(gè)分區(qū)不會(huì)使黑客能夠穿透其他分區(qū),因此可以控制違規(guī)行為。每個(gè) umode 分區(qū)是一組一個(gè)或多個(gè) utask。utask 構(gòu)成了與其他分區(qū)中的任務(wù)隔離的基礎(chǔ),但不是與自己分區(qū)中的任務(wù)隔離的基礎(chǔ)。umode 分區(qū)具有強(qiáng)隔離能力。因此,應(yīng)盡可能將易受攻擊的代碼(如驅(qū)動(dòng)程序、中間件和應(yīng)用程序代碼)放入 umode 分區(qū)。
粗線以下是安全啟動(dòng)、pcode、smx、SMX RTOS 內(nèi)核和安全分區(qū)。這些由 pcode 組成。當(dāng)然,實(shí)際系統(tǒng)可能有更多的 pmode 分區(qū)。目標(biāo)是也將 pmode 分區(qū)彼此隔離。但是,這種隔離不如 umode 隔離那么強(qiáng),后面會(huì)討論。
安全啟動(dòng)
當(dāng)系統(tǒng)啟動(dòng)或重新啟動(dòng)時(shí),處理器以 pmode 啟動(dòng),并且位于 Secure Boot 分區(qū)中。
圖 2:安全啟動(dòng)
如圖 2 所示,安全啟動(dòng)軟件進(jìn)行基本的硬件和軟件初始化,加載代碼,如有必要,創(chuàng)建啟動(dòng)操作所需的任務(wù),然后啟動(dòng)調(diào)度程序。在啟動(dòng)調(diào)度程序之前,沒有任何任務(wù)正在運(yùn)行。啟動(dòng)調(diào)度器后,系統(tǒng)以任務(wù)模式運(yùn)行,第一個(gè)以最高優(yōu)先級(jí)調(diào)度的任務(wù)正在運(yùn)行。其他分區(qū)進(jìn)行自己的初始化。出于結(jié)構(gòu)和安全原因,最好將安全引導(dǎo)分區(qū)中的代碼最小化。在圖 2 中,安全引導(dǎo)加載程序以黃色顯示。這些可以從許多來源獲得,并且超出了本文的范圍。綠色顯示的代碼是系統(tǒng)和應(yīng)用程序代碼。
smx
SMX RTOS由smx 內(nèi)核和中間件組成。SMX 被拆分,因此 smx 內(nèi)核在 pmode 下運(yùn)行,而 SMX 中間件在 umode 下運(yùn)行。MPU-Plus 與 SMX、eheap ? 和某些其他產(chǎn)品捆綁在一起時(shí),構(gòu)成SecureSMX ?。
smx分區(qū)包含smx內(nèi)核和SVC Handler、PendSV Handler等相關(guān)軟件。它以 pmode 運(yùn)行,以便將其與可能已損壞的 umode 分區(qū)強(qiáng)烈隔離。MPU-Plus 擴(kuò)展了 smx 以添加安全功能。有關(guān)這些的更多信息,請(qǐng)參閱:
smx 用戶指南, Ralph Moore,Micro Digital, Inc.
smx 參考手冊(cè), Ralph Moore, Micro Digital, Inc.
我們發(fā)現(xiàn),除了添加 MPU-Plus 之外,還需要對(duì) smx 本身進(jìn)行大量修改,盡管 smx 已作為嵌入式內(nèi)核使用了 30 年!中間件產(chǎn)品也需要進(jìn)行重大修改。安全似乎正在給嵌入式系統(tǒng)軟件帶來范式轉(zhuǎn)變。
安全
最后是安全分區(qū)和保險(xiǎn)庫。Vault 是我們存儲(chǔ)珠寶(加密密鑰、密碼、驗(yàn)證碼、證書等)和現(xiàn)金(私人數(shù)據(jù))的地方。如果 pmode 被破壞,避難所就會(huì)彈開,王國就會(huì)消失。因此,保護(hù) Vault 至關(guān)重要,只有包含加密、身份驗(yàn)證和其他安全任務(wù)的安全分區(qū)才能訪問 Vault。
加密和身份驗(yàn)證軟件已從 SMX 中間件產(chǎn)品中移出到安全分區(qū)中。因此,只有安全軟件才能訪問 Vault。
代碼
pcode 分區(qū)包含中斷服務(wù)例程 (ISR)、鏈接服務(wù)例程 (LSR) 和其他必須處于 pmode 的代碼。這是系統(tǒng)、中間件和應(yīng)用程序代碼的混合體。在實(shí)際系統(tǒng)中,這可能會(huì)分為系統(tǒng)分區(qū)和應(yīng)用程序分區(qū)。它可能包含一些 ptask 以及 ISR 和 LSR。同樣, smx 錯(cuò)誤
Manager、smx_EM() 和錯(cuò)誤恢復(fù)代碼不是任務(wù)。因此,此分區(qū)中的大部分代碼都在當(dāng)前任務(wù)的上下文中運(yùn)行。
處理中斷會(huì)帶來特殊的安全問題,這將在第 3 部分中討論。
任務(wù)
utasks 可以提供高級(jí)別的隔離。這主要是因?yàn)樗麄儫o法訪問 MPU。MPU 加載了允許任務(wù)訪問的區(qū)域,包括訪問權(quán)限(例如只讀、從不執(zhí)行等),但任務(wù)無法更改它們。如果背景區(qū)域打開,它在 umode 中無效。然而,一切都不是桃子和奶油——還有堆問題和函數(shù)調(diào)用問題,這些將在后面討論。
任務(wù)
與 utasks 相比,ptasks 提供的隔離性較弱。這是因?yàn)橐坏?ptask 被破壞,惡意軟件只需一個(gè)步驟即可關(guān)閉 MPU 或打開其背景區(qū)域 (BR)。然后 MPU 區(qū)域沒有效果。MPU 在 pmode 中毫無防備,而在 umode 中則堅(jiān)不可摧。
但是,ptasks 可以通過捕獲許多黑客技術(shù)(例如堆?;蚓彌_區(qū)溢出、嘗試從堆?;蚓彌_區(qū)執(zhí)行等)并在黑客獲得實(shí)際控制權(quán)之前觸發(fā) MMF 來幫助挫敗攻擊者。然后,MMF 處理程序可以刪除滲透的任務(wù)并重新創(chuàng)建它,希望系統(tǒng)操作中只有一個(gè)小問題。它還可以報(bào)告事件,這有助于發(fā)現(xiàn)和減少代碼漏洞。
ptasks 對(duì)于捕獲編程錯(cuò)誤也很有用,并且可以成為通向 utasks 的有用步驟。
基本操作
MPU 控制
內(nèi)存保護(hù)陣列 (MPA) 是一組要在任務(wù)切換上加載到 MPU 中的區(qū)域;每個(gè)任務(wù)都有一個(gè) MPA。任務(wù)的索引用于在內(nèi)存保護(hù)表中查找其 MPA,mpt[indexsmx_TaskCreate() 將當(dāng)前(父)任務(wù)的 MPA 復(fù)制到正在創(chuàng)建的任務(wù)。如果 ct 是 ptask,它可以通過以下方式更改任務(wù)的 MPA:
smx_TaskSet(任務(wù),SMX_ST_MPA,tp);
其中 tp 指向任務(wù)的 MPA 模板。
前述如圖3所示。在該圖中,MPA0、1和2共享模板mpa_tmplta。因此,三個(gè)對(duì)應(yīng)的任務(wù)共享相同的區(qū)域。因此,它們很可能在同一個(gè)分區(qū)中。請(qǐng)注意,MPA3 使用模板 mpa_tmpltb。因此,相應(yīng)的任務(wù)很可能在一個(gè)單獨(dú)的區(qū)域中。第五個(gè)任務(wù)尚未創(chuàng)建,其 MPA 也未加載。
圖 3:模板、MPA 和 TCB
MPA 中的插槽與 MPU 中的動(dòng)態(tài)插槽一樣多。大多數(shù)插槽都充滿了鏈接器命令文件中定義的靜態(tài)區(qū)域(一個(gè)乏味的過程)。但是,某些插槽具有指向在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建的區(qū)域數(shù)組的指針。這些將在第 4 部分中詳細(xì)討論。具有最高優(yōu)先級(jí)的頂部 MPU 正在使用的插槽是為任務(wù)堆棧區(qū)域保留的。任務(wù)棧是在創(chuàng)建任務(wù)時(shí)從主堆動(dòng)態(tài)創(chuàng)建的,或者在調(diào)度任務(wù)時(shí)從棧池中獲取。在任務(wù)運(yùn)行時(shí),對(duì) MPU 的任何更新也會(huì)對(duì)其 MPA 進(jìn)行,因此在任務(wù)切換期間無需保存 MPU 內(nèi)容。
創(chuàng)建靜態(tài)區(qū)域是一個(gè)費(fèi)力的過程。例如,對(duì)于代碼區(qū)域,有必要識(shí)別特定分區(qū)或特定任務(wù)所需的所有功能,包括子例程。Pragma 被插入到代碼中,以將所有這些放入一個(gè)唯一的代碼部分,例如:
#pragma default_function_attributes = @“.ut1a_text”
無效 tm05_ut1a(無效)
{
smx_SemSignal(sbr1);
}
#pragma default_function_attributes =
然后在鏈接器命令文件中定義一個(gè)塊來保存此部分和相關(guān)部分,例如:
定義塊 ut1a_code,大小 = 1024,對(duì)齊 = 1024 {ro section .ut1a_text,ro section .ut1a_rodata};
區(qū)域在鏈接器命令文件中定義,并在其中放置塊,例如:
定義區(qū)域 ROM = mem:[從 0x00200000 到 0x002FFFFF];
放入 ROM {block t2a_code, ro section .tmplt, block ut1a_code, block ut2a_code, block ut2b_code};
回到代碼中,定義了 MPA 中的一個(gè)槽:
#pragma section = “ut1a_code”
MPA mpa_tmplt_ut1a =
{
。..
RGN(3 | RA(“ut1a_code”) | V, 代碼 | RSI(“ut1a_code”) | EN, “ut1a_code”),
。..
};
所有這些都是針對(duì)一個(gè)模板中的一個(gè) MPU 區(qū)域完成的——顯然是一個(gè)費(fèi)力的過程。上面顯示的模板宏(例如 RGN())可以減少工作并有助于減少錯(cuò)誤。因?yàn)橛行┱Z句在代碼中,有些在鏈接器命令文件中,所以該過程容易出錯(cuò)。不僅如此,很容易為代碼區(qū)域遺漏一個(gè)晦澀的子程序或?yàn)閿?shù)據(jù)區(qū)域遺漏變量,從而在調(diào)試期間導(dǎo)致煩人的 MMF(在調(diào)試的早期階段關(guān)閉 MMF 的一個(gè)很好的理由)。
系統(tǒng)調(diào)用
ptasks 可以直接調(diào)用所有的 smx 和 system 函數(shù),但是 utasks 不能直接調(diào)用它們,因?yàn)樗鼈儽仨氃?pmode 中執(zhí)行。而是使用 SVC N 指令。對(duì)于 umode 代碼,將包含 smx 和系統(tǒng)原型函數(shù)的 xapi.h 頭文件替換為 xapiu.h 頭文件。后者將 smx_ 調(diào)用映射到 smxu_ 調(diào)用,這些調(diào)用是調(diào)用 SVC N 的 shell 函數(shù),其中 N 是系統(tǒng)調(diào)用 ID。但是,限制通話,對(duì)于 umode 是禁止的,會(huì)產(chǎn)生 Privilege Violation 錯(cuò)誤。受限調(diào)用只能通過 pcode 進(jìn)行。例如,utasks 不需要 smx_HeapInit(),如果從惡意軟件調(diào)用,可能會(huì)導(dǎo)致系統(tǒng)損壞,因此沒有 smxu_HeapInit()。定義了一組合理的受限調(diào)用。然而,該集合可以根據(jù)需要針對(duì)特定應(yīng)用進(jìn)行擴(kuò)展或收縮。
圖 4:系統(tǒng)調(diào)用
圖 4 說明了 utasks 和 ptasks 的系統(tǒng)調(diào)用機(jī)制。SVC Handler 使用 N 作為索引,通過 SSR 跳轉(zhuǎn)表到 smx 系統(tǒng)服務(wù)例程(SSR)。SSR 在 pmode 中執(zhí)行,然后將結(jié)果返回給 SVC Handler。SVC 處理程序?qū)⒋私Y(jié)果返回給 smxu shell 函數(shù),后者將其返回給 utask。所有這些細(xì)節(jié)對(duì)調(diào)用者都是隱藏的,看起來就像是進(jìn)行了正常的函數(shù)調(diào)用。umode 中不允許的系統(tǒng)調(diào)用會(huì)導(dǎo)致分支到特權(quán)沖突錯(cuò)誤管理器 (PVEM),而后者又會(huì)調(diào)用 smx 錯(cuò)誤管理器 (EM)。
請(qǐng)注意,來自 ptask 的 smx 調(diào)用直接轉(zhuǎn)到 SSR,并且沒有不允許的服務(wù)調(diào)用。
本系列的下一部分將討論分區(qū)問題,包括堆使用、函數(shù)調(diào)用 API、中斷、父子任務(wù)和任務(wù)本地存儲(chǔ)。
審核編輯:郭婷
-
處理器
+關(guān)注
關(guān)注
68文章
19246瀏覽量
229600 -
mcu
+關(guān)注
關(guān)注
146文章
17115瀏覽量
350918 -
MPU
+關(guān)注
關(guān)注
0文章
356瀏覽量
48774
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論