編者按:盡管物聯網設備得到了大量普及,但保護這些設備的安全依然持續引人關注;在某種程度上,若要在工業物聯網 (IIoT) 和任務關鍵型應用中采用聯網設備,相關的安全挑戰可能會成為阻礙。這是因為如果攻擊成功,則可能導致企業和個人數據泄露。確保物聯網應用安全可能是一項非常艱巨的任務,但在現實中,物聯網設備的安全可以建立在一些相對簡單的原則之上,并使用硬件安全設備加以支撐。只要遵循完善的安全實踐,這些問題都能得到解決。本系列文章由多個部分組成,文中將提供一些實用的指導,來幫助開發人員確保從一開始就遵循相關的最佳實踐。第 1 部分探討底層安全設計的加密算法。第 2 部分探討私鑰、密鑰管理和安全存儲在安全物聯網設計中所起的作用。第 3 部分檢查安全處理器的內建機制,以緩和物聯網設備所面臨的其他類型威脅。第 4 部分(本文)明確并展示如何在高級處理器中應用安全機制,幫助確保進行必要的隔離,以緩和對物聯網設備運行時環境進行的攻擊。第 5 部分介紹如何在將物聯網設備連接到物聯網云資源時,通過采用更高級別安全措施,讓這些設備實現持續的物聯網安全。 基于硬件的加密技術與安全存儲提供了實現安全物聯網設計所需的基礎。安全引導和安全固件空中下載 (FOTA) 更新使用這一基礎來建立軟件執行的信任根。盡管如此,物聯網 (IoT) 設備仍需要得到持續的保護,以防止在運行時環境中執行的軟件應用程序和系統代碼在訪問安全資源時,軟件有意或無意地破壞這些資源。 本文介紹了開發人員如何利用 NXP Semiconductors、STMicroelectronics 等公司提供的處理器中集成的安全機制,以更有效地方式防止系統在軟件執行過程中受到威脅。 運行時軟件如何遭到破壞 如本系列前面幾部分所述,密碼、安全密鑰存儲以及安全引導和固件更新為物聯網安全提供了必要的構件。盡管這些功能是物聯網設備整體安全的關鍵因素,但對于專門破壞互連系統中運行時軟件的攻擊,仍是一種不完全的解決方案。理想情況下,由于受信任環境是在通過安全引導創建的信任根基礎上所建立,因此試圖穿透這些機制所提供的防線將會失敗。實際上,使用這些強大的安全功能所構建的系統可能會因在系統中注入一段腐化代碼或惡意軟件的攻擊而被劫持,而且曾經發生的攻擊都是采用這種方式。 黑客可以使用各種各樣的方法來利用系統某一部分中的安全漏洞攻擊其他部分。例如,緩沖區溢出攻擊可利用軟件應用允許大型輸入數據流寫入到預期緩沖區外。如果溢出數據包含代碼,則處理器可以在之后執行這些代碼,從而為黑客提供進一步攻擊的入口。通過使用這些方法和其他方法,黑客會逐漸擴大滲透到系統的更廣泛部分。 在任何系統軟件堆棧層中,任何軟件組件都可能存在漏洞。隨著開發人員致力于創建功能更豐富的系統,對更多軟件組件的需求增加了這些系統遭受更多漏洞攻擊的幾率。同時,軟件中存在的各種漏洞會持續增加。例如,權威的通用漏洞披露 (CVE®) 列表顯示,2020 年第一季度公開披露的網絡安全漏洞同比增長 15%。 多層保護可保護關鍵軟件 緩和威脅是黑帽黑客與白帽安全專家之間的持久戰。雖然威脅將不斷出現,但開發人員可以利用各種方法來隔離典型應用程序中要求的多個不同軟件進程,來大幅加強設計的安全性。多年來,安全系統一直建立在分層保護方法的基礎上。在這種經典方法中,同心保護環可提高系統中的隔離級別。在最外層運行的應用程序受到限制,無法訪問內層的設備驅動程序和系統服務,而內層也會受到限制,無法訪問最內層的軟件內核(圖 1)。 圖 1:安全軟件系統以保護環的形式保護應用程序、驅動程序和操作系統內核,逐漸提供了更大的保護力度。(圖片來源:維基百科) 從 80286 開始的 Intel x86 設備現在可從 Rochester Electronics 獲取,它們支持四個保護層,并且指定使用選擇器寄存器,包括一個兩位請求特權級 (RPL) 字段。通過各種用于在運行時隔離用戶進程的機制,Arm® TrustZone 等現代處理器架構大幅擴展了安全功能。開發人員可以在許多嵌入式系統處理器中找到這種分層保護功能,其中包括: · Microchip Technology 的 SAM L11 微控制器系列(基于 Arm Cortex®-M23) · Nordic Semiconductor 的 nRF9160 無線片上系統 (SoC)(基于 Arm Cortex-M33) · Nuvoton Technology 的 M2351 微控制器(基于 Arm Cortex-M23) · NXP Semiconductors 的 LPC55 微控制器(基于 Arm Cortex-M33) · Silicon Labs 的 EFR32BG21 無線 SoC 系列(基于 Arm Cortex-M33) · STMicroelectronics 的 STM32L5 微控制器系列(基于 Arm Cortex-M33) Arm TrustZone for Cortex-M 為 NXP 的 LPC55S69JBD100K 和 STMicroelectronics 的 STM32L552VET6 等 Arm Cortex-M 嵌入式系統處理器帶來了增強的安全功能。TrustZone for Cortex-A 為 NXP 的 i.MX 8M Mini MIMX8MM6DVTLZAA 和 STMicroelectronics 的 STM32MP157AAC3T 等基于 Arm Cortex-A 的應用處理器提供了類似的功能。 對于每個 Arm 系列,TrustZone 提供的機制可支持安全引導和安全代碼、數據和存儲器以及其他安全功能。TrustZone for Cortex-M 處理器旨在支持嵌入式系統的低延遲要求,具有性能增強,包括快速安全中斷和基于硬件的快速安全狀態轉換。本文說明了 TrustZone for Cortex-M 處理器,并重點介紹了代表此類別的一對處理器:NXP 的 LPC55S69JBD100K 和 STMicroelectronics 的 STM32L552VET6。 處理器工作模式實現了擴展保護 作為 TrustZone 架構的核心,處理器可以在多種工作模式下運行,以支持軟件進程和系統資源的隔離。處理器的“安全”和“非安全”模式提供了一種將受信任的進程與不受信任的進程隔離的方法。處理器的“處理程序”和“線程”模式提供了單獨的保護機制,在隔離進程和資源方面提供了更高的精細度。 在 TrustZone 架構中,以處理程序模式運行的處理器會使軟件始終以特權模式運行。因此,建議使用此模式來運行實時操作系統 (RTOS) 等軟件,或訪問引導映像、安全密鑰以及其他對系統操作至關重要的資源。在線程模式下,軟件以非特權模式運行,但是特權進程可以更改在此模式下運行的軟件的特權級別。線程模式通常可用于運行應用程序代碼。 在組合使用時,安全/非安全與處理程序/線程模式可提供與早期支持保護環的系統同類的分層保護功能。例如,使用 STMicroelectronics 的 STM32L552VET6,開發人員可以將具有完全特權的受信任代碼與具有最小特權的不受信任代碼隔離開(圖 2)。 圖 2:STMicroelectronics 的 STM32L552VET6 等 TrustZone 處理器提供了各種處理器模式的組合,能夠讓開發人員隔離引導映像等受信任系統軟件與第三方射頻 (RF) 通訊棧等不受信任應用程序代碼。(圖片來源:Digi-Key,原始資料來源于 STMicroelectronics) 這些處理器中集成的隔離機制限制了每個處理器訪問程序數據存儲器不同區域的能力。例如,當 NXP LPC55S6x 內核處于安全狀態時,盡管仍可訪問非安全數據存儲器,但卻無法訪問非安全程序存儲器。另一方面,當 LPC55S6x 內核以非安全狀態運行時,則只能訪問非安全程序存儲器和數據存儲器(圖 3)。 圖 3:NXP 的 LPC55S6x 器件等處理器可確保內核在安全狀態(S 狀態)下運行以讀取安全程序存儲器(綠色),或在非安全狀態(NS 狀態)下運行以讀取非安全程序存儲器(紅色)。(圖片來源:NXP Semiconductors) 當在安全狀態下運行以執行受信任軟件時,這些處理器無法從非安全程序存儲器中獲取指令。相反,當在非安全狀態下運行以執行不受信任的軟件(例如應用程序代碼)時,這些處理器將無法訪問位于安全區域中的代碼或數據。盡管如此,應用程序代碼通常需要能夠執行安全庫中的受信任代碼。通過定義非安全可調用 (NSC) 存儲器區域以提供受允許的安全庫入口點,TrustZone 處理器能夠讓開發人員達到此要求(圖 4)。 圖 4:非安全可調用區域提供了從非安全到安全存儲器區域的安全入口點,允許非安全應用程序執行安全庫中的函數。(圖片來源:STMicroelectronics) 存儲器別名可增強安全性 NXP 的 LPC55S69JBD100K 和 STMicroelectronics 的 STM32L552VET6 等 TrustZone 處理器通過將物理程序存儲器別名化為安全和非安全存儲器空間,來管理執行。例如,STMicroelectronics 的 STM32L552VET6 兩次將閃存和 SRAM 中的代碼別名化,一次別名化為非安全地址范圍(0x0800_0000 至 0x0BFF_FFFF),再次別名化為安全地址范圍(0x0C00_0000 至 0x0FFF_FFFF)。同樣,NXP 的 LPC55S69JBD100K 將物理程序存儲器別名化為從 0x0000_0000 開始的非安全空間,以及從 0x1000_0000 開始的安全空間。這些處理器中的每一個都對其他存儲器類型和外設使用類似的方法,將它們兩次別名化為安全和非安全區域。 當處理器需要訪問某個存儲器位置時,能否訪問該位置由兩個硬件單元生成的安全屬性確定: · 實現定義屬性單元 (IDAU) 是處理器核心外部的固定硬件單元,提供由制造商定義的存儲器映射的固定安全狀態。 · 安全屬性單元 (SAU) 是集成在處理器核心中的可編程單元,可用于定義多達八個存儲器區域的安全狀態。 在系統初始化期間,在安全模式下運行的配置例程通過設置幾個 SAU 寄存器來定義每個區域的安全狀態;這些寄存器包括: · SAU 區域編號寄存器 (SAU_RNR),用于選擇一個區域以進一步進行操作 · SAU 區域基地址寄存器 (SAU_RBAR),用于定義區域的起始地址 · SAU 區域限制地址寄存器 (SAU_RLAR),用于定義區域的范圍 在 STM32L5 系列的 STM32Cube MCU 軟件包中,STMicroelectronics 提供了多個模板文件,這些文件演示了如何使用包含 SAU 配置在內的處理器功能。如清單 1 所示,開發人員可以使用宏 (SAU_INIT_REGION(n)) 為每個配置參數定義這些區域。該宏能夠設置 SAU 結構中的寄存器值,而這些值會在配置設置寫入器件時使用。 副本 /* // // < i > Setup SAU Region 0 memory attributes */ #define SAU_INIT_REGION0 1 /* // */ #define SAU_INIT_START0 0x0C03E000 /* start address of SAU region 0 */ /* // */ #define SAU_INIT_END0 0x0C03FFFF /* end address of SAU region 0 */ /* // // <0=>Non-Secure // <1=>Secure, Non-Secure Callable */ #define SAU_INIT_NSC0 1 /* // */ /* // // < i > Setup SAU Region 1 memory attributes */ #define SAU_INIT_REGION1 1 /* // */ #define SAU_INIT_START1 0x08040000 /* start address of SAU region 1 */ /* // */ #define SAU_INIT_END1 0x0807FFFF /* end address of SAU region 1 */ /* // // <0=>Non-Secure // <1=>Secure, Non-Secure Callable */ #define SAU_INIT_NSC1 0 /* // */ . . . ** \brief Setup a SAU Region \details Writes the region information contained in SAU_Region to the registers SAU_RNR, SAU_RBAR, and SAU_RLAR */ __STATIC_INLINE void TZ_SAU_Setup (void) { #if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) #if defined (SAU_INIT_REGION0) && (SAU_INIT_REGION0 == 1U) SAU_INIT_REGION(0); #endif . . . #define SAU_INIT_REGION(n) \ SAU->RNR = (n & SAU_RNR_REGION_Msk); \ SAU->RBAR = (SAU_INIT_START##n & SAU_RBAR_BADDR_Msk); \ SAU->RLAR = (SAU_INIT_END##n & SAU_RLAR_LADDR_Msk) | \ ((SAU_INIT_NSC##n << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk) | 1U 清單 1:此代碼段包含在 STMicroelectronics 的 STM32L5 系列 STM32Cube MCU 軟件包內的模板中,向開發人員展示如何定義存儲器區域及其相關的安全狀態。(代碼來源:STMicroelectronics) IDAU 和 SAU 共同確定存儲器位置是否可訪問,并返回兩者中最高的安全級別。由于處理器使用與其安全/非安全工作狀態相對應的存儲器別名,IDAU 與 SAU 的組合生成的安全屬性可確保僅訪問具有匹配安全級別的區域(圖 5)。 圖 5:在 NXP LPC55S69JBD100K 中,IDAU 和 SAU 組合起來為每個存儲器別名生成一個安全屬性,從而有效地刪除不允許在各自區域外運行的代碼。(圖片來源:NXP Semiconductors) 例如,當 NXP 的 LPC55S69JBD100K 在安全模式下運行時,由 IDAU 和 SAU 生成的安全屬性將阻止訪問物理存儲器塊的安全別名中包含的非安全應用程序,從而有效地從安全別名中消除該非安全代碼。相反,當處理器在非安全模式下運行時,IDAU 和 SAU 安全屬性將有效地從產生的非安全別名中清除安全應用程序。 設置權限和訪問控制 盡管 IDAU 和 SAU 直接強制安全和非安全訪問限制,但它們與安全和非安全存儲器保護單元 (MPU) 共同確定與目標資源關聯的訪問權限(圖 6)。 圖 6:在圖中所示的 NXP LPC55S69JBD100K 等 TrustZone 處理器中,由 SAU 和 IDAU 生成的安全屬性與安全和非安全 MPU 管理的設置組合在一起,來提供權限級別和安全級別。(圖片來源:NXP Semiconductors) MPU 內置在這些處理器中,可提供對存儲器資源的精細訪問控制。例如,在 STMicroelectronics 的 STM32L552VET6 中,MPU 支持多種訪問權限。在處理器以特權處理程序模式或非特權線程模式運行時,這些訪問權限會有所不同(表 1)。 表 1:STMicroelectronics 的 STM32L552VET6 允許開發人員使用其 MPU 來定義在特權模式和非特權模式下具有不同操作方式的不同訪問級別。(表格來源:STMicroelectronics) 在這些屬性中,Execute Never (XN) 屬性能夠讓開發人員確保處理器永遠不會嘗試從關聯的存儲器區域執行代碼,從而提供了另一個級別的運行時保護。例如,在直接從閃存運行代碼的系統中,開發人員可以為未使用的 SRAM 區域設置 XN 屬性,以消除系統遭到劫持的任何可能性,即使惡意代碼在這些區域成功注入攻擊。 將保護擴展到更多外設和存儲器 這些處理器的 IDAU、SAU 和 MPU 功能提供了靈活的基礎,以保護系統軟件和應用程序的運行時執行,但是這些功能僅限于處理器本身。像 NXP LPC55S69JBD100K 和 STMicroelectronics STM32L552VET6 這樣的處理器可通過各種方法,將安全和特權功能擴展到其他存儲器系統和接口。 對于 STM32L552VET6,STMicroelectronics 用自己的全局 TrustZone 控制器 (GTZC) 對原生 TrustZone 機制進行了補充。這種全局 TrustZone 控制器旨在保護外設、嵌入式 SRAM 和外部存儲器(圖 7)。 圖 7:STMicroelectronics 的 STM32L552VET6 處理器集成了全局 TrustZone 控制器 (GTZC),可將安全保護擴展至原生 TrustZone 框架中未包含的外設和存儲器。(圖片來源:STMicroelectronics) 在 NXP LPC55S69JBD100K 中,特權屬性 (HPRIV) 和安全屬性 (HNONSEC) 跨越內部高級高性能總線 (AHB) 矩陣,傳遞到存儲器保護校驗器 (MPC)、外設保護校驗器 (PPC) 和其他總線主控器的主安全包裝器 (MSW)(圖 8)。 圖 8:在 NXP LPC55S69JBD100K 中,特權和安全級別會傳遞至其他硬件單元,而硬件單元可將這些屬性應用于涉及存儲器、外設和其他總線主控器的操作。(圖片來源:NXP Semiconductors) 雖然了解軟件隔離和系統保護的底層機制很重要,但開發人員可以利用開發支持在自己的設計中快速應用這些功能。 STMicroelectronics 提供了 STM32L552E-EV、STM32L562E-DK 和 NUCLEO-L552ZE-Q 評估板作為快速原型開發平臺,用于構建基于其 STM32L5 處理器的應用。該公司的 STM32CubeIDE 集成開發環境 (IDE) 提供了綜合的軟件編程環境,并且其 STM32CubeProgrammer 提供了圖形用戶界面 (GUI) 和命令行界面 (CLI) 版本,用于對內部和外部存儲器進行編程。例如,使用此工具,開發人員可以定義閃存中的安全區域(圖 9)。 圖 9:STMicroelectronics 的 STM32CubeProgrammer 提供了一種簡單的方法來定義閃存中的安全區域。(圖片來源:STMicroelectronics) 為了快速開發基于 NXP 的 LPC55S69 處理器的系統,開發人員可以在 NXP 的 LPC55S69-EVK 評估板上構建設計。對于系統配置和軟件編程,NXP MCUXpresso IDE 提供了一個綜合性平臺,可用于創建基于 NXP LPC55S69 處理器的應用。 結語 物聯網安全依賴于密碼學和安全存儲等基本安全機制,以及在基于硬件安全機制的信任根上構建應用的功能。盡管這些都是確保安全的必需條件,但很少能夠足以應對那些利用系統運行時環境中漏洞的持續威脅。通過利用越來越多的處理器中提供的分層保護機制,開發人員可以構建安全的物聯網設備,更好地緩解這些威脅并減少或消除它們對物聯網應用的影響。 來源:Digi-Key 作者:Stephen Evanczuk |