現(xiàn)在,網(wǎng)絡(luò)釣魚、弱密碼、不充分的身份驗(yàn)證和薄弱的權(quán)限執(zhí)行等唾手可得的成果正在消失,黑客被迫尋找新的方法來滲透企業(yè)網(wǎng)絡(luò)和設(shè)備。目前連接到企業(yè)網(wǎng)絡(luò)的大量完全易受攻擊的設(shè)備為此提供了大量機(jī)會(huì)。到目前為止,設(shè)備安全已經(jīng)得到了很多討論,但很少行動(dòng)。這種情況即將改變。
在過去幾年中,我們一直致力于為基于MCU的設(shè)備,尤其是Cortex-v7M和v8M開發(fā)安全RTOS。這種RTOS具有許多創(chuàng)新功能來遏制和限制安全漏洞。本文的目的是介紹這些特性,并說明利用這些特性可以實(shí)現(xiàn)高度安全的設(shè)備。
SecureSMX基于SMX實(shí)時(shí)多任務(wù)內(nèi)核,在過去30年中,該內(nèi)核為數(shù)百個(gè)嵌入式系統(tǒng)提供了可靠的操作。它提供靈活和廣泛的解決方案,使原始設(shè)備制造商能夠在合理的時(shí)間和成本限制內(nèi),將有效的安全保護(hù)納入其嵌入式和物聯(lián)網(wǎng)設(shè)備。這種安全性的基礎(chǔ)是隔離分區(qū)這對于這樣的系統(tǒng)是不容易實(shí)現(xiàn)的。分區(qū)有許多優(yōu)點(diǎn):
允許硬件強(qiáng)制分離特權(quán)和非特權(quán)代碼,并控制對系統(tǒng)服務(wù)、數(shù)據(jù)、內(nèi)存區(qū)域和I/O寄存器的訪問。
使其他保護(hù)成為可能,如運(yùn)行時(shí)限制和限制對對象的訪問。如果沒有硬件強(qiáng)制分區(qū),這種限制很容易被繞過。
允許將稀缺的程序員人才集中在加強(qiáng)最關(guān)鍵的分區(qū)上。
防止零時(shí)差。這些通常可以賣到很高的價(jià)格,并且是國家安全機(jī)構(gòu)的高度機(jī)密[參考文獻(xiàn)1]。然而,黑客也可以使用未打補(bǔ)丁的已知漏洞,因?yàn)闊o論哪種方式,他都將在一個(gè)隔離的分區(qū)中結(jié)束,在不觸動(dòng)絆線的情況下,他可以做的事情受到很大的限制。如果一個(gè)非關(guān)鍵分區(qū)被穿透,系統(tǒng)將繼續(xù)執(zhí)行其基本功能。這給了安全團(tuán)隊(duì)時(shí)間來解決問題,而不是總是玩追趕游戲。
硬件實(shí)施模塊化代碼的良好編程實(shí)踐,具有定義良好的接口。這不僅會(huì)產(chǎn)生更高質(zhì)量的代碼,還會(huì)縮短集成和調(diào)試時(shí)間。
僅分區(qū)恢復(fù)。當(dāng)黑客觸發(fā)了眾多檢查中的任何一項(xiàng)時(shí),就會(huì)出現(xiàn)立即內(nèi)存管理故障(MMF)異常。這可以用來關(guān)閉分區(qū),然后重新初始化它。這比重啟整個(gè)系統(tǒng)更可取,因?yàn)樗粫?huì)停止正常操作。
僅分區(qū)更新。如果沒有其他東西移動(dòng),分區(qū)可以單獨(dú)更新。這消除了將關(guān)鍵任務(wù)代碼暴露給內(nèi)部攻擊。更新僅限于易受攻擊的分區(qū)。遺留和可信代碼通常已經(jīng)過全面測試,很少需要更新。內(nèi)部攻擊是一個(gè)比普遍認(rèn)為的更大的問題[參考文獻(xiàn)2]。
沒有完美的安全措施。但是,增加系統(tǒng)的安全性可以減輕損害和潛在的責(zé)任。
目標(biāo)
這個(gè)安全RTOS的目的是促進(jìn)現(xiàn)有系統(tǒng)的安全改進(jìn),并作為新系統(tǒng)的安全基礎(chǔ)。開發(fā)者可以根據(jù)需要使用或多或少的特性。易受攻擊的代碼,如開源[參考文獻(xiàn)3]或網(wǎng)絡(luò)堆棧和新開發(fā)的包,可以通過一系列明確定義的步驟與系統(tǒng)的其余部分隔離。隔離的強(qiáng)度可以根據(jù)需要而定,如果需要,可以施加限制。同時(shí),系統(tǒng)的其余部分可以繼續(xù)運(yùn)行,基本不受影響。因此,對于開始被黑客攻擊的現(xiàn)有系統(tǒng),有一個(gè)解決方案。
操作
SecureSMX利用Cortex-v7M和v8M架構(gòu)的所有硬件安全功能,但不需要TrustZone。重要的是將操作硬件分離成處理程序模式(hmode),特權(quán)任務(wù)模式(pmode),以及非特權(quán)任務(wù)模式(烏莫德)。內(nèi)存保護(hù)單元(MPU)用于限制每個(gè)任務(wù)可以訪問的內(nèi)存。SVC指令用于允許umode任務(wù)訪問系統(tǒng)服務(wù)。背景區(qū)域(BR)僅在hmode中使用。
當(dāng)前典型的嵌入式系統(tǒng)完全運(yùn)行在hmode中。第一步是將代碼分成運(yùn)行在pmode (ptasks)中的任務(wù)和運(yùn)行在hmode中的系統(tǒng)服務(wù)(例如RTOS)、異常處理程序和ISR。ptasks在MPU使能、BR禁用的情況下運(yùn)行。每個(gè)ptask可以有一個(gè)唯一的存儲(chǔ)器保護(hù)陣列(MPA ),當(dāng)ptask開始運(yùn)行時(shí),該陣列被載入MPU。或者,ptask可以使用默認(rèn)MPA。在這一點(diǎn)上,根據(jù)每個(gè)任務(wù)擁有自己的MPA的程度以及MPA區(qū)域定義的緊密程度,任務(wù)獲得了一定程度的相互隔離。為了實(shí)現(xiàn)更好的隔離,可以將任務(wù)轉(zhuǎn)移到umode中。那么系統(tǒng)的所有其余部分都將受到硬件實(shí)施的保護(hù)pmode勢壘。
分區(qū)應(yīng)用程序
什么是分區(qū)?
分區(qū)是由它們包含的一個(gè)或多個(gè)任務(wù)定義的。它們沒有控制塊。通常,一個(gè)分區(qū)對應(yīng)于系統(tǒng)的一個(gè)邏輯部分,通常稱為組件,如文件系統(tǒng)。像這樣的分區(qū)通常有一個(gè)頂層任務(wù)和一兩個(gè)子任務(wù)來幫助它。然而,為了適應(yīng)特定的系統(tǒng),一個(gè)分區(qū)可以由多個(gè)頂層任務(wù)組成,并且可以包括多個(gè)模塊。例如,在一個(gè)給定的系統(tǒng)中,所有的中間件或所有的utasks可能被合并到一個(gè)單獨(dú)的分區(qū)中。分區(qū)靈活性允許在投入的精力和實(shí)現(xiàn)的安全性之間達(dá)到最佳的平衡。
v7M分區(qū)
眾所周知,Cortex-v7M MCU的分區(qū)很難實(shí)現(xiàn),因?yàn)関7M MPU要求每個(gè)區(qū)域的大小是2的冪,并且大小一致。顯然,這可能導(dǎo)致嚴(yán)重的內(nèi)存浪費(fèi),并導(dǎo)致v7M MPU在很大程度上被嵌入式軟件社區(qū)拒絕【參考文獻(xiàn)4】。這對于安全MCU設(shè)計(jì)來說是一個(gè)不幸的挫折。然而,我們已經(jīng)找到了許多方法來克服這個(gè)問題,這些都被納入我們的新RTOS。以下段落詳細(xì)描述了這些方法,以便提供一個(gè)令人信服的畫面。
定義部分
系統(tǒng)中的每個(gè)任務(wù)都需要一個(gè)區(qū)域用于它所使用的每個(gè)活動(dòng)MPU插槽。通常所有MPU插槽都是活動(dòng)的,因此每個(gè)任務(wù)需要8個(gè)區(qū)域。盡管一些區(qū)域可以在任務(wù)之間共享,但是對于典型的系統(tǒng),通常需要定義大量的區(qū)域。在代碼中,區(qū)域的定義從使用pragmas[腳注i]開始,以定義部分(例如。.sys_bss和。 sys_data),它們包含在該區(qū)域中(例如sys_data)。一個(gè)區(qū)域的各個(gè)部分可能分布在幾個(gè)模塊中,但是鏈接器將一個(gè)區(qū)域的所有部分組合成一個(gè)模塊區(qū)域塊。
鏈接器命令文件
我們開發(fā)了一個(gè)簡單的方法來創(chuàng)建v7M鏈接器命令文件。在其頂部,系統(tǒng)所有區(qū)域的大小都是以十六進(jìn)制定義的。要成為2的冪,區(qū)域大小必須只有一個(gè)非零數(shù)字,并且該數(shù)字必須是1、2、4或8。因此很容易避免區(qū)域尺寸誤差。在區(qū)域大小以下,每個(gè)區(qū)域塊定義為其大小= region_size*5/8、6/8、7/8或8/8,其對齊方式= region_size,以及其包含的部分。這種方法的一個(gè)很好的特性是,在開發(fā)過程中,當(dāng)鏈接器報(bào)告一個(gè)區(qū)域被超出時(shí),很容易將其大小增加1/8,或者如果已經(jīng)是8/8,則增加到2 * 5/8的下一次冪。
模板、內(nèi)存保護(hù)陣列和任務(wù)
MPA模板
每個(gè)任務(wù)都有一個(gè)內(nèi)存保護(hù)數(shù)組,MPA,或者默認(rèn)MPA,當(dāng)任務(wù)被分派時(shí),它被加載到MPU中。任務(wù)的MPA是從其MPA模板在任務(wù)創(chuàng)建之后。一個(gè)任務(wù)可能有自己的MPA模板,或者與其他任務(wù)共享一個(gè)模板。MPA模板是使用特殊的宏定義的,它允許每行定義一個(gè)區(qū)域,由RBAR、RASR和region_name組成。(region_name僅在調(diào)試期間使用。)子區(qū)域禁用are自動(dòng)地從區(qū)域塊大小生成(例如,如果區(qū)域塊大小= region_size*5/8,則設(shè)置SRD 5、6和7)。這為用戶避免了很多復(fù)雜性,同時(shí)最小化了區(qū)域大小。
縮小地區(qū)之間的差距
鏈接器按照指定的順序?qū)^(qū)域塊分配給內(nèi)存。這可能會(huì)導(dǎo)致塊之間出現(xiàn)很大的間隙,從而浪費(fèi)大量內(nèi)存。為了解決這個(gè)問題,MPUPacker以找到區(qū)域塊的最佳排序。然后,在鏈接器命令文件中更改順序以匹配,鏈接器再次運(yùn)行。為了幫助將代碼和數(shù)據(jù)分配給區(qū)域,MPUMapper可以運(yùn)行來修改地圖文件,以顯示每個(gè)符號(hào)所在的區(qū)域。這在開發(fā)過程中非常有助于修復(fù)MMFs并檢查系統(tǒng)是否分區(qū)良好。
一般來說,我們發(fā)現(xiàn)內(nèi)存浪費(fèi)可以控制在20%以下,通常是10%。如果需要,還可以使用其他方法來減少內(nèi)存浪費(fèi)。但是,如果有足夠的內(nèi)存,將未使用的內(nèi)存分布在分區(qū)中是有利的,因?yàn)檫@有助于僅分區(qū)更新。
v8M分區(qū)
Cortex-v8M解決了區(qū)域問題,只要求區(qū)域是32字節(jié)的倍數(shù),并在32字節(jié)邊界對齊。因此,盡管基本方法是相同的,但是上述許多措施對于v8M來說是不必要的。然而,v8M引入了一個(gè)新問題:如果分區(qū)重疊,就會(huì)出現(xiàn)MMF。這給任務(wù)堆棧、pmsgs和動(dòng)態(tài)區(qū)域帶來了致命的弱點(diǎn)。可以通過從不同于主堆的堆中分配它們來解決這個(gè)問題,但是需要注意避免被這個(gè)不必要的架構(gòu)缺陷所困擾。
來自umode的系統(tǒng)服務(wù)
來自umode的系統(tǒng)服務(wù)
ptasks可以直接進(jìn)行系統(tǒng)調(diào)用,因?yàn)樗鼈冇邢到y(tǒng)代碼和sys_data他們海洋保護(hù)區(qū)內(nèi)的區(qū)域。這些區(qū)域被替換為ucom _代碼和ucom_data對于utasks,它不能直接進(jìn)行系統(tǒng)服務(wù)調(diào)用。相反,utasks必須使用SVC異常由觸發(fā)SVC n指令,其中n表示256個(gè)服務(wù)調(diào)用中的一個(gè)。utask代碼中包含一個(gè)特殊的頭文件,用于將服務(wù)調(diào)用映射到具有相似名稱的shell函數(shù)。一個(gè)枚舉定義了n的值,一個(gè)跳轉(zhuǎn)表,以同樣的順序,被SVC處理器SVCH()用來跳轉(zhuǎn)到所需的服務(wù)調(diào)用。在ucom_code中,每個(gè)系統(tǒng)服務(wù)都有一個(gè)shell函數(shù),它使用enum定義的n值調(diào)用SVC n。該系統(tǒng)使添加或刪除服務(wù)呼叫變得容易。
當(dāng)SVC n執(zhí)行時(shí),它導(dǎo)致創(chuàng)建一個(gè)異常幀,切換到hmode,切換到主堆棧,并啟動(dòng)SVCH()。SVCH()從異常幀重新加載r0-r3,從任務(wù)棧復(fù)制參數(shù)5及以上到主棧,通過跳轉(zhuǎn)表(在sys_code中)調(diào)用系統(tǒng)服務(wù)。當(dāng)系統(tǒng)服務(wù)完成時(shí),SVCH()進(jìn)行一些調(diào)整,然后異常返回到調(diào)用點(diǎn)。返回值(如果有)在r0中。除了生成錯(cuò)誤異常,這是utask訪問hmode中代碼的唯一方式。
來自umode的系統(tǒng)調(diào)用開銷相當(dāng)小,并且不會(huì)顯著影響系統(tǒng)性能,因?yàn)橄到y(tǒng)調(diào)用并不頻繁。明顯有害的系統(tǒng)調(diào)用無法通過SVC n獲得。在某些情況下,當(dāng)從umode調(diào)用時(shí),系統(tǒng)調(diào)用的有害部分會(huì)被禁止。此外,一些服務(wù)(如中斷啟用和禁用)在umode中不起作用。中斷禁用和啟用必須替換為中斷屏蔽和取消屏蔽,并提供一種方法來限制哪些IRQ可以從utask屏蔽或取消屏蔽。
一個(gè)umode分區(qū)通常只使用少量的系統(tǒng)服務(wù)調(diào)用。因此,提供了一種允許為分區(qū)定義自定義枚舉、自定義跳轉(zhuǎn)表和自定義外殼函數(shù)的方法。這通過最小化對ucom_code的訪問來提高隔離。一般來說,標(biāo)準(zhǔn)的枚舉、跳轉(zhuǎn)表和shell函數(shù)應(yīng)該減少到umode分區(qū)實(shí)際需要的程度,從而節(jié)省內(nèi)存并提高安全性。
雖然沒有必要,但是ptasks也可以訪問SVCH()來獲得系統(tǒng)服務(wù),而不是直接調(diào)用。這為pmode到umode的轉(zhuǎn)換過程提供了一個(gè)步驟。
普塔斯克vs尤塔斯克
支持ptasks主要是為了方便將分區(qū)從pmode移動(dòng)到umode。然而,在提高系統(tǒng)可靠性方面,它們和utasks一樣有效。將任務(wù)轉(zhuǎn)換為ptasks后,通過分配MPAs,潛在的bug如未初始化指針、堆棧溢出等。很可能會(huì)出現(xiàn)。
安全性方面,utasks比ptasks好。這是因?yàn)槿绻鹥task被穿透,只需要一條指令就可以關(guān)閉MPU。這在umode中是不可能的,因此umode提供了更強(qiáng)的安全性。此外,pmode屏障使得從umode訪問pmode和hmode幾乎是不可能的。
門戶網(wǎng)站
為了實(shí)現(xiàn)完全的分區(qū)隔離,有必要引入門戶網(wǎng)站。這是因?yàn)楹瘮?shù)API要求用戶可以訪問函數(shù)本身,這違反了隔離原則。
門戶提供了一個(gè)間接的API來將一個(gè)分區(qū)中的服務(wù)與其在其他分區(qū)中的調(diào)用者隔離開來。呼叫照常進(jìn)行,但是它們使用smx消息指導(dǎo)服務(wù)器任務(wù)執(zhí)行服務(wù)并通過門戶返回結(jié)果。
smx消息由鏈接到包含實(shí)際消息的數(shù)據(jù)塊的消息控制塊(MCB)組成。消息可以發(fā)送到消息交換任務(wù)可以等待的地方。它們可以從消息等待的消息交換中接收。消息可以有優(yōu)先級(jí),并且可以按優(yōu)先級(jí)順序在交換中排隊(duì)。因此,較高優(yōu)先級(jí)的消息可以繞過較低優(yōu)先級(jí)的消息。交換中的消息隊(duì)列可以作為服務(wù)器的工作隊(duì)列。
受保護(hù)的消息(pmsg)
對于門戶,區(qū)域信息被添加到消息中,創(chuàng)建所謂的受保護(hù)的郵件, 血清促性腺激素。當(dāng)接收到一個(gè)pmsg時(shí),它的區(qū)域被加載到MPU的一個(gè)空槽中,接收任務(wù)的MPA。這允許任務(wù)訪問數(shù)據(jù)塊,但不能訪問sys_data中的MCB。對于門戶,接收任務(wù)稱為計(jì)算機(jī)網(wǎng)絡(luò)服務(wù)器發(fā)送任務(wù)稱為客戶。通常,一臺(tái)服務(wù)器可能有許多客戶端。客戶機(jī)可以給pmsg一個(gè)優(yōu)先級(jí),當(dāng)它接受pmsg時(shí),這個(gè)優(yōu)先級(jí)將被傳遞給服務(wù)器。
創(chuàng)建門戶時(shí),會(huì)給出一個(gè)允許訪問門戶的客戶端列表。創(chuàng)建過程初始化服務(wù)器控制結(jié)構(gòu),并將門戶交換句柄和門戶名稱加載到每個(gè)客戶機(jī)結(jié)構(gòu)中。只有這些客戶端可以訪問門戶,因?yàn)橹挥兴麄冎老蚰睦锇l(fā)送pmsgs。
提供了兩種類型的門戶:
免費(fèi)信息門戶
免費(fèi)信息門戶
對于這個(gè)門戶,當(dāng)消息被發(fā)送時(shí),交換成為它的所有者,然后當(dāng)消息被接收時(shí),服務(wù)器成為它的所有者。發(fā)送后,MPU和客戶端MPA中的pmsg區(qū)被清零。此后,客戶端既不能訪問也不能更改消息。當(dāng)服務(wù)器完成時(shí),它將pmsg發(fā)送到應(yīng)答交換,客戶端可以從應(yīng)答交換中檢索它。一旦發(fā)送,服務(wù)器就不能再訪問pmsg。免費(fèi)的消息門戶旨在傳輸少量的數(shù)據(jù)和命令。
隧道洞口
隧道洞口
隧道入口旨在快速發(fā)送大量多塊數(shù)據(jù)。在這種情況下,客戶端保留對pmsg區(qū)域的所有權(quán)和訪問權(quán)。數(shù)據(jù)塊變成了隧道在客戶端和服務(wù)器分區(qū)之間,因此允許發(fā)送和接收多個(gè)數(shù)據(jù)塊。信號(hào)量用于協(xié)調(diào)操作。傳輸完成后,入口關(guān)閉,pmsg釋放。
操作
對于這兩種類型的門戶,頭文件將服務(wù)器函數(shù)API映射到名稱略有不同的shell函數(shù)。這個(gè)頭文件包含在每個(gè)進(jìn)行服務(wù)器函數(shù)調(diào)用的客戶機(jī)文件中。每個(gè)shell函數(shù)創(chuàng)建一個(gè)帶有函數(shù)ID、參數(shù)和數(shù)據(jù)的pmsg,并將pmsg發(fā)送到門戶交換。服務(wù)器接收pmsg,并使用switch語句將ID轉(zhuǎn)換為函數(shù)調(diào)用,進(jìn)行調(diào)用,然后將函數(shù)返回發(fā)送給shell函數(shù),后者將函數(shù)返回給應(yīng)用程序。所有這些對應(yīng)用程序來說都是透明的,只是運(yùn)行速度較慢。
由于切換到服務(wù)器任務(wù),門戶操作可能與直接調(diào)用有很大不同。如果pmsg的優(yōu)先級(jí)比客戶機(jī)高,服務(wù)將搶占并立即運(yùn)行。這最像是直接的服務(wù)呼叫。如果pmsg具有相同的優(yōu)先級(jí),服務(wù)將不會(huì)運(yùn)行,直到客戶端被掛起。如果pmsg具有較低的優(yōu)先級(jí),服務(wù)將在未來的某個(gè)時(shí)間運(yùn)行。當(dāng)服務(wù)是一些低優(yōu)先級(jí)的功能時(shí),例如事件日志記錄,后者是有用的。
免費(fèi)消息門戶提供100%隔離;隧道入口只提供了一點(diǎn)點(diǎn)。
表演
性能良好,因?yàn)閜msg操作不需要拷貝pmsg數(shù)據(jù)塊(與基于MMU的系統(tǒng)不同)。事實(shí)上,數(shù)據(jù)塊可以用作客戶端中的工作緩沖區(qū),以便進(jìn)一步減少數(shù)據(jù)復(fù)制。通過增加pmsg數(shù)據(jù)塊的大小,性能得到了極大的提高。
以下是在相同的處理器(STM32F746,Cortex-M7)上,使用MPU和portalss與不使用MPU和portal的情況下,將我們的文件系統(tǒng)(FS)寫入SD卡的性能測量值(KB/sec)。它還顯示了非復(fù)制模式的輕微增益,在這種模式下,客戶端使用門戶緩沖區(qū)作為工作緩沖區(qū)。
FS+SD 7969 / 4855
FS+SD+portal no copy 6788 / 4544 85% / 94%
FS+SD+portal copy 6685 / 4419 84% / 91%
MPU和門戶的使用使讀取性能降低了16%,寫入性能降低了9%,而在客戶端直接使用門戶緩沖區(qū)(無拷貝)時(shí)性能略有提高。
eheap
現(xiàn)代嵌入式系統(tǒng)比過去更頻繁地使用堆。但是,如果分區(qū)共享一個(gè)堆,就無法實(shí)現(xiàn)隔離,因此需要多個(gè)堆。
eheap堆倉結(jié)構(gòu)
eheap是我們包含在SecureSMX中的完善的堆管理器。它是專門為嵌入式系統(tǒng)設(shè)計(jì)的;它支持多個(gè)堆,并且使用垃圾箱,比如dlmalloc,來加速分配。與dlmalloc不同,每個(gè)堆的倉的數(shù)量和大小是可定制的,以滿足應(yīng)用程序的要求。例如,如果一個(gè)分區(qū)經(jīng)常需要256的塊大小,那么可以創(chuàng)建一個(gè)只包含這個(gè)大小的bin。此外,eheap可以分配2的冪的對齊塊,并且可以分配v7M區(qū)域。這些對于動(dòng)態(tài)區(qū)域特別有用,這是安全RTOS的一個(gè)特征。eheap的多任務(wù)版本為每個(gè)堆提供了一個(gè)互斥體,以避免該堆的訪問沖突。
大多數(shù)任務(wù)堆棧、受保護(hù)的消息(pmsgs)、受保護(hù)的塊(pblks)和許多系統(tǒng)結(jié)構(gòu)都是從v7M系統(tǒng)的主堆中分配的。對于v8M系統(tǒng),由于其非區(qū)域重疊要求,這些對象中的一些可能需要從另一個(gè)堆中分配。在需要的地方,可以為需要它們的分區(qū)創(chuàng)建自定義堆,比如用C++編寫的那些。eheap可以為小型C++對象合并小型塊池以加速操作。通常,分區(qū)堆比主堆簡單得多,也小得多。此外,eheap支持自動(dòng)掃描和修復(fù)每個(gè)堆及其箱中的斷開鏈接。
調(diào)度程序回調(diào)
大多數(shù)RTOSs提供退出和進(jìn)入回調(diào)。前者可用于在任務(wù)掛起時(shí)保存擴(kuò)展?fàn)顟B(tài),后者可用于在任務(wù)恢復(fù)時(shí)恢復(fù)擴(kuò)展?fàn)顟B(tài)。smx還提供啟動(dòng)和刪除回調(diào)。當(dāng)一個(gè)任務(wù)第一次開始運(yùn)行時(shí),前者可以用來進(jìn)行任務(wù)初始化和獲取任務(wù)需要的資源。當(dāng)任務(wù)被刪除時(shí),后者可以用來釋放資源和進(jìn)行任務(wù)清理。因?yàn)樵趕witch語句中,DELETE通常是START case下面的一個(gè)case,所以很容易確保沒有遺漏任何內(nèi)容。因此,分區(qū)可以無泄漏地循環(huán)打開和關(guān)閉,以便支持僅分區(qū)恢復(fù)。
運(yùn)行時(shí)間限制
不幸的是,即使完全分區(qū)隔離也不足以抵御黑客。即使黑客無法從分區(qū)中逃出來,他也可以從分區(qū)內(nèi)部進(jìn)行大量破壞。一種簡單的攻擊是將分區(qū)中的任務(wù)放入一個(gè)無限循環(huán)中。那么所有同等或更低優(yōu)先級(jí)的任務(wù)都被阻止運(yùn)行。最終,這可能會(huì)導(dǎo)致任何系統(tǒng)崩潰。為了防止這種情況,有必要使用任務(wù)運(yùn)行時(shí)間限制。
不幸的是,在實(shí)時(shí)系統(tǒng)中,運(yùn)行時(shí)限制可能是一種詛咒,也可能是一種祝福——例如,我們不希望關(guān)鍵任務(wù)在緊急情況下被束縛,比如當(dāng)起重機(jī)即將傾覆時(shí)。但是開發(fā)人員很難估計(jì)需要多少運(yùn)行時(shí)間來避免這樣的災(zāi)難。所以重要的任務(wù)可以不受運(yùn)行時(shí)間限制地運(yùn)行。這一點(diǎn),再加上他們的高優(yōu)先級(jí),確保他們可以運(yùn)行所需的時(shí)間來完成工作,即使在極端的情況下。
不太可信的任務(wù)用計(jì)數(shù)器分配運(yùn)行時(shí)限制。在一幀開始時(shí),所有計(jì)數(shù)器都被清零。結(jié)果是節(jié)拍分辨率太粗糙了,所以改用CPU時(shí)鐘。每次任務(wù)運(yùn)行時(shí),它使用的時(shí)鐘數(shù)被確定并添加到它的計(jì)數(shù)器中。如果這超過了任務(wù)的運(yùn)行時(shí)限制,任務(wù)將在門信號(hào)量再也跑不動(dòng)了。在每一次滴答,當(dāng)前任務(wù)的計(jì)數(shù)器被更新,如果它超過了它的運(yùn)行時(shí)間限制,任務(wù)在門信號(hào)量上被掛起。
運(yùn)行時(shí)間限制
很難在任務(wù)優(yōu)先級(jí)之間取得良好的平衡,這使得任務(wù)能夠在截止日期前完成。添加一個(gè)固定的運(yùn)行時(shí)框架只會(huì)增加這個(gè)難度。相反,當(dāng)空閑任務(wù)有足夠的次數(shù)來完成它的工作時(shí),我們就結(jié)束運(yùn)行時(shí)幀。由于空閑任務(wù)的優(yōu)先級(jí)最低,這確保了所有任務(wù)都充分運(yùn)行。然后門信號(hào)量被發(fā)信號(hào)通知,所有等待的任務(wù)被恢復(fù),它們的計(jì)數(shù)器被清零。此外,相同優(yōu)先級(jí)的任務(wù)以暫停時(shí)的順序恢復(fù)。這避免了任務(wù)運(yùn)行中的大間隙,這可能會(huì)導(dǎo)致問題。
子任務(wù)共享其頂級(jí)父任務(wù)的[腳注ii]運(yùn)行時(shí)限制和計(jì)數(shù)器。如果超過限制,子任務(wù)將立即掛起。只有當(dāng)父對象和它的其他子對象試圖在此之后運(yùn)行時(shí),它們才會(huì)被掛起。給任務(wù)族分配運(yùn)行時(shí)限制比試圖給每個(gè)任務(wù)分配運(yùn)行時(shí)限制要容易得多,因?yàn)樗茄苌摹?/p>
代幣
在第二次世界大戰(zhàn)期間,家家戶戶都收到紅色的代幣買肉,藍(lán)色的代幣買魚,銀色的代幣買手推車。這樣,我們的政府控制了消費(fèi)。類似地,我們需要管理一個(gè)分區(qū)可以使用多少資源,以及該分區(qū)如何使用該資源。我們的RTOS為此使用代幣。
A 處理是存儲(chǔ)的地址的內(nèi)存位置目標(biāo),例如任務(wù),即它是一個(gè)特殊指針。A代幣是句柄的地址。句柄是在鏈接時(shí)創(chuàng)建的,因此它們的地址在運(yùn)行時(shí)是已知的。有兩種類型的令牌:HI令牌允許創(chuàng)建、刪除、修改和訪問對象,而LO令牌只允許訪問對象(例如信號(hào)量測試和信號(hào))。程序員為每個(gè)任務(wù)編譯一個(gè)令牌列表,并在任務(wù)創(chuàng)建后分配給該任務(wù)。如果未分配令牌列表,則該任務(wù)不需要令牌來訪問或修改對象。后者對于諸如恢復(fù)任務(wù)之類的任務(wù)來說是必要的,并且它使可信任務(wù)變得更簡單。
控制信號(hào)量訪問的令牌
黑客可以從分區(qū)內(nèi)部做的一件陰險(xiǎn)的事情是一遍又一遍地創(chuàng)建同一個(gè)對象,直到對象控制塊池耗盡。那么任何其他任務(wù)都不能創(chuàng)建該類型的對象。這被阻止如下:首先,黑客使用的任務(wù)必須有一個(gè)對象的HI令牌。第二,一旦創(chuàng)建,該對象在被刪除之前不能被重新創(chuàng)建。
另一種可能的攻擊是猜測一個(gè)句柄,并利用這個(gè)句柄制造麻煩。例如,可以向另一個(gè)分區(qū)中的信號(hào)量發(fā)送信號(hào),從而導(dǎo)致該分區(qū)中的任務(wù)在不應(yīng)該運(yùn)行的時(shí)候運(yùn)行。這通過要求該對象的令牌來阻止。
除了令牌之外,所有句柄參數(shù)在使用之前都被驗(yàn)證為有效句柄。對每個(gè)句柄進(jìn)行范圍檢查,并檢查其cbtype字段。這可以防止黑客在系統(tǒng)服務(wù)調(diào)用中使用無效對象。
ISR問題
Cortex-M中一個(gè)嚴(yán)重的架構(gòu)缺陷是ISR運(yùn)行在hmode中。大多數(shù)RTOSs都允許從ISR調(diào)用內(nèi)核服務(wù),這就更復(fù)雜了。這些共同為黑客創(chuàng)造了一個(gè)巨大的目標(biāo)。這個(gè)目標(biāo)特別有誘惑力,因?yàn)槿肭炙鼤?huì)讓他進(jìn)入hmode,在那里他可以關(guān)閉MPU并訪問任何他喜歡的東西。
smx一直支持不同的設(shè)計(jì)理念,其中ISR被最小化,大多數(shù)中斷處理被推遲到鏈接服務(wù)例程(LSR)。這些任務(wù)按調(diào)用的順序運(yùn)行,并在所有任務(wù)之前運(yùn)行。LSR不受優(yōu)先級(jí)反轉(zhuǎn)問題的影響,因此比任務(wù)更適合延遲中斷處理。LSR的開銷也少了許多。當(dāng)處理時(shí)間不重要時(shí),LSR可以簡單地向一個(gè)信號(hào)量發(fā)送信號(hào),讓一個(gè)延遲的中斷處理任務(wù)等待。最小化ISR大小既減少了目標(biāo)大小,又允許ISR程序員更專注于使代碼難以破解。
有三種類型的LSR:tlsr、pLSRs和uLSRs。tLSRs是信任LSRs。它們在hmode中運(yùn)行,開銷非常低。它們應(yīng)該盡可能的短,比如僅僅發(fā)一個(gè)信號(hào)量。pLSRs和uLSRs被稱為安全LSR。每個(gè)都有自己的棧和自己的MPA,行為就像一個(gè)微任務(wù)。當(dāng)從LSR隊(duì)列調(diào)度時(shí),LSR的MPA被加載到MPU中,并且它的棧成為操作棧。因此,安全LSR可以在它們所服務(wù)的分區(qū)中運(yùn)行,這使得除了一小部分之外的所有中斷處理都進(jìn)入了它所屬的分區(qū)。這對uLSRs來說是一大收獲。
開發(fā)人員通常編寫長的ISR來調(diào)用內(nèi)核。安全LSR允許將盡可能多的代碼轉(zhuǎn)移到LSR,然后將LSR轉(zhuǎn)移到相關(guān)的分區(qū)。因此,如果黑客侵入了ISR代碼,而不是在hmode中,他會(huì)發(fā)現(xiàn)自己在一個(gè)隔離的umode分區(qū)中,并受到其限制。
要注意的一個(gè)有趣的事情是,一個(gè)安全LSR可能使用與分區(qū)中的任務(wù)相同的MPA,或者它可能更像一個(gè)子任務(wù),并且具有一些共享區(qū)域和一些唯一區(qū)域(例如IO)。安全LSR具有非常小的控制塊,并且通常需要非常小的堆棧。此外,它們的運(yùn)行優(yōu)先級(jí)介于ISR和任務(wù)之間。因此,它們提供了一種有趣的IO處理方式,比通常的ISR方法更安全。
smxAware
smxAware為IAR C-SPY調(diào)試器提供了內(nèi)核意識(shí)。當(dāng)與SecureSMX一起使用時(shí),增加了MPU和MPA顯示。這使得在跟蹤MMF時(shí)更容易看到區(qū)域大小和屬性。此外,門戶操作顯示在事件時(shí)序圖中,MPU區(qū)域顯示在存儲(chǔ)器映射概覽圖中。
事件監(jiān)督
大量內(nèi)核事件被監(jiān)控,如服務(wù)調(diào)用、ISR運(yùn)行、LSR運(yùn)行、任務(wù)操作、錯(cuò)誤等。每個(gè)事件的相關(guān)信息存儲(chǔ)在事件緩沖區(qū)EVB中。此外,可以定義和記錄用戶事件。可以對日志進(jìn)行過濾,這樣EVB就不會(huì)太快填滿。EVB可以定期上傳到安全監(jiān)控網(wǎng)站,在那里特殊的軟件尋找異常行為,這可能表明攻擊正在進(jìn)行中。如果是這樣,安全控制可以采取適當(dāng)?shù)拇胧珀P(guān)閉分區(qū)。
監(jiān)控一個(gè)大型系統(tǒng)的所有元素的操作可能是阻止高度復(fù)雜的攻擊的唯一方法,這些攻擊規(guī)避安全機(jī)制并慢慢滲透到計(jì)算機(jī)網(wǎng)絡(luò)中。
目標(biāo)
在優(yōu)化系統(tǒng)中,盡可能多的代碼已從pmode轉(zhuǎn)移到彼此高度隔離的umode分區(qū),門戶用于分區(qū)間通信,所有不受信任的任務(wù)都受到運(yùn)行時(shí)和令牌的限制,延遲中斷處理在安全LSR中完成,關(guān)鍵任務(wù)代碼和數(shù)據(jù)受到pmode屏障的雙重保護(hù)。
雖然這一目標(biāo)在新設(shè)計(jì)中是可以實(shí)現(xiàn)的,但在現(xiàn)有設(shè)計(jì)中不太可能實(shí)現(xiàn)。將所有不可信的代碼轉(zhuǎn)移到一個(gè)umode分區(qū)中并對其進(jìn)行一些限制可能是一個(gè)合適的解決方案。SecureSMX專門設(shè)計(jì)用于提供實(shí)施部分解決方案的靈活性。它還被設(shè)計(jì)為允許增量改進(jìn),其中安全團(tuán)隊(duì)一次解決一個(gè)問題,從而實(shí)現(xiàn)漸進(jìn)的安全改進(jìn),而不需要傾家蕩產(chǎn)。
認(rèn)識(shí)到仍然可以使用其他安全措施是很重要的,例如信任根、安全引導(dǎo)、安全更新、加密和代碼改進(jìn)。相反,它提供了一個(gè)堅(jiān)實(shí)的安全基礎(chǔ),并提供了許多處理安全問題的新選項(xiàng)。
將應(yīng)用移植到SecureSMX
為了方便將現(xiàn)有應(yīng)用程序移植到我們的安全RTOS,它包含了FRPort和TXPort。這些提供了移植功能,將應(yīng)用程序中使用的90%以上的FreeRTOS和ThreadX服務(wù)調(diào)用移植到等效的smx服務(wù)調(diào)用。更多的港口正在規(guī)劃中。試圖在其他RTOS上運(yùn)行SecureSMX是行不通的,因?yàn)樗cSMX的豐富內(nèi)核特性緊密相關(guān),而這些特性是其他RTOS所沒有的。將應(yīng)用程序轉(zhuǎn)移到it部門應(yīng)該會(huì)帶來更好的操作,并允許訪問上面討論的所有安全特性。
未來
到目前為止,許多設(shè)備都被黑客攻擊過,但黑客們主要關(guān)注的是網(wǎng)絡(luò)釣魚等唾手可得的東西。進(jìn)入計(jì)算機(jī)網(wǎng)絡(luò)。然而,隨著公司采用更好的安全軟件和更好的安全實(shí)踐,這個(gè)唾手可得的果實(shí)開始消失。如前所述,黑客的下一個(gè)主要目標(biāo)很可能是已經(jīng)連接到計(jì)算機(jī)網(wǎng)絡(luò)的數(shù)千臺(tái)未受保護(hù)的設(shè)備。這些很容易破解。
設(shè)備供應(yīng)商的高層管理人員需要決定是現(xiàn)在就開始采取謹(jǐn)慎的措施,還是以后雇傭一支軍隊(duì)來應(yīng)對對他們設(shè)備的攻擊。將來,法院可能會(huì)裁定不充分的安全措施構(gòu)成疏忽,因此設(shè)備制造商將面臨損害賠償[參考文獻(xiàn)5]。這可能會(huì)讓許多公司破產(chǎn)。即使這不會(huì)發(fā)生,可證明的安全性也可能成為許多類型設(shè)備的主要賣點(diǎn)。
縱觀整個(gè)軟件行業(yè),在大多數(shù)嵌入式系統(tǒng)中,可能只有大約10%的軟件執(zhí)行關(guān)鍵工作。這個(gè)準(zhǔn)則是公司業(yè)務(wù)的精髓。它可能是經(jīng)過嚴(yán)格編寫、徹底測試和現(xiàn)場驗(yàn)證的,因此不太可能改變。其余90%的代碼混合了第三方、開源和新開發(fā)的代碼,并且很可能存在許多漏洞。如果沒有分區(qū),這段代碼中任何地方的黑客攻擊都會(huì)暴露整個(gè)系統(tǒng),從而為勒索攻擊和竊取關(guān)鍵數(shù)據(jù)提供便利。讓一家公司如此脆弱是沒有道理的。
此外,應(yīng)該預(yù)見到內(nèi)部攻擊將變得更加普遍。當(dāng)提供大量資金時(shí),員工忠誠度可能是可以協(xié)商的。關(guān)鍵任務(wù)代碼是公司皇冠上的寶石。它應(yīng)該被鎖起來,除了少數(shù)高度信任的員工外,其他人都不能訪問。因?yàn)殛P(guān)鍵任務(wù)代碼可能不需要更新,所以它不需要包含在僅分區(qū)更新中。如果關(guān)鍵任務(wù)代碼不包含在更新中,它就不能被篡改,這給避免災(zāi)難性攻擊帶來了一些希望。
結(jié)論
我們的新RTOS旨在提供一套靈活的工具和結(jié)構(gòu),以提高現(xiàn)有基于MCU的系統(tǒng)以及新系統(tǒng)的安全性。它允許對受信任的遺留代碼進(jìn)行最少的修改。其固有的靈活性允許首先修復(fù)最重要的問題,從而逐步提高系統(tǒng)安全性。
如果使用SecureSMX作為新系統(tǒng)的基礎(chǔ),很可能只需很少或不需要增加時(shí)間或開發(fā)成本就可以實(shí)現(xiàn)強(qiáng)大的安全性。這是因?yàn)樗峁┝嗽O(shè)計(jì)實(shí)踐的硬件實(shí)施,證明可以減少集成和調(diào)試時(shí)間。在安全保護(hù)方面,下游的回報(bào)是巨大的。對于上面介紹的所有功能,與SMX相比,SecureSMX的代碼量增加了大約20 KB。考慮到典型MCU上的大型片內(nèi)閃存,以及典型應(yīng)用代碼的大小,這可以忽略不計(jì)。一個(gè)更大的問題是節(jié)省寶貴的片內(nèi)SRAM,我們提供了工具和技術(shù)來最大限度地減少v7M架構(gòu)對齊造成的浪費(fèi),如“縮小區(qū)域間的差距”一節(jié)所述。
審核編輯:黃飛
評論
查看更多