IoT 安全基礎知識 — 第 4 篇:減輕執行階段的威脅
資料提供者:DigiKey 北美編輯群
2020-06-25
編者說明:儘管 IoT 裝置數量激增,保護這些裝置的安全問題仍持續受到關注,尤其在工業物聯網 (IIoT) 與關鍵任務應用中,企業和個人資料可能在遭駭時受到竄改,因此安全問題就成為是否決定採用這類連線裝置的障礙點。IoT 應用的保護工作可讓人感到卻步,但實際上,在硬體安全裝置的幫助下,只需幾個相對簡單且直覺的原則,就能建置 IoT 裝置安全。只要遵循完善的安全實務,這些問題即可迎刃而解。此系列文章包含數篇內容,為開發人員提供實用的指南,協助其確保從一開始就遵循最佳做法。第 1 篇探討建構起安全設計的加密演算法。第 2 篇探討私鑰、金鑰管理和安全儲存在安全的 IoT 設計中所扮演的角色。第 3 篇檢驗安全處理器的內建機制,這些機制可用於減輕對 IoT 裝置的其他類型威脅。第 4 篇 (本文) 識別並說明如何在進階處理器中應用安全機制,以幫助確保已具備所需的隔離,可減輕對 IoT 裝置執行階段環境所進行的攻擊。第 5 篇說明 IoT 安全功能如何繼續使用更高等級的安全措施,將 IoT 裝置連線到 IoT 雲端資源。
硬體式加密功能以及安全儲存提供實作安全 IoT 設計所需的基礎。安全啟動以及安全的韌體空中 (FOTA) 更新以此基礎建立軟體執行的信任根。但是,物聯網 (IoT) 裝置需要得到持續的保護,以防止在執行階段環境中執行的軟體應用程式與系統程式碼在存取安全資源時,軟體會有意或無意地損害這些資源。
本文說明開發人員可以如何利用 NXP Semiconductors、STMicroelectronics 等公司內建於一些處理器產品的安全機制,以更有效地保護系統免受軟體執行過程中的威脅。
執行階段的軟體如何遭到破壞
如同本系列前幾篇文章所討論,密碼、安全金鑰儲存以及安全啟動和韌體更新,為 IoT 安全提供了必要的建置模塊。雖然這些功能對 IoT 裝置整體安全性有重大貢獻,但是對於專門設計於破壞連線系統內執行階段軟體的攻擊,還是不夠全面的解決方案。在理想狀況下,透過安全啟動建立的信任根可提供可信任的環境基礎,因此試圖穿越這些機制防線所進行的攻擊,通常都不會成功。但事實上,以這些強大安全功能所建造的系統可能會受到攻擊,被注入一段惡意程式碼或惡意軟體,這類情形也持續發生。
駭客可以使用多種方法入侵系統某個部份的弱點,並用來攻擊其他部份。例如,緩衝區溢流攻擊可利用軟體應用程式,允許大量輸入資料流寫入到目標緩衝區之外。若溢流的資料當中包含程式碼,處理器可以在之後執行此程式碼,為駭客提供進一步攻擊的入侵點。駭客藉由這些或其他攻擊手法,便可逐步擴大滲透至系統的更多部份。
弱點可能存在於任何系統軟體堆疊層中的任何軟體元件。開發人員努力讓系統功能更豐富之時,更多的軟體元件需求,會系統可能有更多弱點。同時,軟體中的弱點也越來越多樣化。例如,權威的公共漏洞和暴露 (CVE®) 清單指出,在 2020 年第一季時,已公開的網路安全弱點逐年增長 15%。
多層保護可保護關鍵軟體
威脅減輕是黑帽駭客以及白帽安全專家之間持續的攻防戰。雖然威脅將層出不窮,但開發人員還是可以採用各種方法來隔離典型應用程式要求的多種不同軟體處理程序,來大幅強化設計的安全性。多年以來,安全的系統都是以層級式保護法為基礎打造而成。在這種典型的做法當中,同心的保護環可在系統中提供越來越高的隔離層級。在最外層執行的應用程式會受到限制,無法存取較內層的裝置驅動程式及系統服務,而內層又受到限制,不能存取最內層的軟體核心 (圖 1)。
圖 1:安全的軟體系統以保護環的形式來保護應用程式、驅動程式以及作業系統核心,並逐層提升防護等級。(圖片來源:Wikipedia)
以 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)
在安全狀態下運作以執行受信任軟體時,這些處理器無法從非安全程式記憶體取得指令。相反地,在以非安全狀態運作以執行不受信任的軟體 (如應用程式的程式碼) 時,這些處理器無法存取位於安全區域中的程式碼或資料。但是,應用程式的程式碼通常會要求能夠執行安全函式庫中受信任的程式碼。TrustZone 處理器讓開發人員能夠透過定義非安全可呼叫 (NSC) 記憶體區域的方式,提供允許的安全函式庫進入點,以此滿足這項要求 (圖 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 結構中的暫存器值,而這些值會在配置設定寫入元件時使用。
複製
/*
// <e>Initialize SAU Region 0
// <i> Setup SAU Region 0 memory attributes
*/
#define SAU_INIT_REGION0 1
/*
// <o>Start Address <0-0xFFFFFFE0>
*/
#define SAU_INIT_START0 0x0C03E000 /* start address of SAU region 0 */
/*
// <o>End Address <0x1F-0xFFFFFFFF>
*/
#define SAU_INIT_END0 0x0C03FFFF /* end address of SAU region 0 */
/*
// <o>Region is
// <0=>Non-Secure
// <1=>Secure, Non-Secure Callable
*/
#define SAU_INIT_NSC0 1
/*
// </e>
*/
/*
// <e>Initialize SAU Region 1
// <i> Setup SAU Region 1 memory attributes
*/
#define SAU_INIT_REGION1 1
/*
// <o>Start Address <0-0xFFFFFFE0>
*/
#define SAU_INIT_START1 0x08040000 /* start address of SAU region 1 */
/*
// <o>End Address <0x1F-0xFFFFFFFF>
*/
#define SAU_INIT_END1 0x0807FFFF /* end address of SAU region 1 */
/*
// <o>Region is
// <0=>Non-Secure
// <1=>Secure, Non-Secure Callable
*/
#define SAU_INIT_NSC1 0
/*
// </e>
*/
.
.
.
**
\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:在 TrustZone 處理器當中 (如此處提到的 NXP LPC55S69JBD100K),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 等處理器會透過多種做法,將安全及特權功能帶入其他記憶體系統和介面當中。
STMicroelectronics 針對 STM32L552VET6 產品,以自有的全域 TrustZone 控制器 (GTZC) 來補強原生的 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 處理器打造相關應用。
結論
IoT 安全仰賴加密和安全儲存的基礎安全機制,以及相關功能,以在搭配硬體安全機制的信任根上打造相關應用。雖然這些特性全都是確保安全的必要條件,但仍不足以對抗專門入侵系統執行階段環境弱點的持續威脅。越來越多的處理器具備層級式保護機制,因此開發人員可以打造出安全的 IoT 裝置,以便更好地減輕這些威脅,並減少或消除對 IoT 應用所造成的影響。

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。