本文介绍了开发人员如何利用 NXP Semiconductors、STMicroelectronics 等公司提供的处理器中集成的安全机制,以更有效地方式防止系统在软件执行过程中受到威胁。
运行时软件如何遭到破坏
如本系列前面几部分所述,密码、安全密钥存储以及安全引导和固件更新为物联网安全提供了必要的构件。尽管这些功能是物联网设备整体安全的关键因素,但对于专门破坏互连系统中运行时软件的攻击,仍是一种不完全的解决方案。理想情况下,由于受信任环境是在通过安全引导创建的信任根基础上所建立,因此试图穿透这些机制所提供的防线将会失败。实际上,使用这些强大的安全功能所构建的系统可能会因在系统中注入一段腐化代码或恶意软件的攻击而被劫持,而且曾经发生的攻击都是采用这种方式。
黑客可以使用各种各样的方法来利用系统某一部分中的安全漏洞攻击其他部分。例如,缓冲区溢出攻击可利用软件应用允许大型输入数据流写入到预期缓冲区外。如果溢出数据包含代码,则处理器可以在之后执行这些代码,从而为黑客提供进一步攻击的入口。通过使用这些方法和其他方法,黑客会逐渐扩大渗透到系统的更广泛部分。
在任何系统软件堆栈层中,任何软件组件都可能存在漏洞。随着开发人员致力于创建功能更丰富的系统,对更多软件组件的需求增加了这些系统遭受更多漏洞攻击的几率。同时,软件中存在的各种漏洞会持续增加。例如,权威的通用漏洞披露 (CVE®) 列表显示,2020 年第一季度公开披露的网络安全漏洞同比增长 15%。
多层保护可保护关键软件
缓和威胁是黑帽黑客与白帽安全专家之间的持久战。虽然威胁将不断出现,但开发人员可以利用各种方法来隔离典型应用程序中要求的多个不同软件进程,来大幅加强设计的安全性。多年来,安全系统一直建立在分层保护方法的基础上。在这种经典方法中,同心保护环可提高系统中的隔离级别。在最外层运行的应用程序受到限制,无法访问内层的设备驱动程序和系统服务,而内层也会受到限制,无法访问最内层的软件内核(图 1)。

- 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 提供的机制可支持安全引导和安全代码、数据和存储器以及其他安全功能。TrustZone for Cortex-M 处理器旨在支持嵌入式系统的低延迟要求,具有性能增强,包括快速安全中断和基于硬件的快速安全状态转换。本文说明了 TrustZone for Cortex-M 处理器,并重点介绍了代表此类别的一对处理器:NXP 的 LPC55S69JBD100K 和 STMicroelectronics 的 STM32L552VET6。
处理器工作模式实现了扩展保护
作为 TrustZone 架构的核心,处理器可以在多种工作模式下运行,以支持软件进程和系统资源的隔离。处理器的“安全”和“非安全”模式提供了一种将受信任的进程与不受信任的进程隔离的方法。处理器的“处理程序”和“线程”模式提供了单独的保护机制,在隔离进程和资源方面提供了更高的精细度。
在 TrustZone 架构中,以处理程序模式运行的处理器会使软件始终以特权模式运行。因此,建议使用此模式来运行实时操作系统 (RTOS) 等软件,或访问引导映像、安全密钥以及其他对系统操作至关重要的资源。在线程模式下,软件以非特权模式运行,但是特权进程可以更改在此模式下运行的软件的特权级别。线程模式通常可用于运行应用程序代码。
在组合使用时,安全/非安全与处理程序/线程模式可提供与早期支持保护环的系统同类的分层保护功能。例如,使用 STMicroelectronics 的 STM32L552VET6,开发人员可以将具有完全特权的受信任代码与具有最小特权的不受信任代码隔离开(图 2)。



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_RNR),用于选择一个区域以进一步进行操作
- SAU 区域基地址寄存器 (SAU_RBAR),用于定义区域的起始地址
- SAU 区域限制地址寄存器 (SAU_RLAR),用于定义区域的范围
/*// <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)。

设置权限和访问控制
尽管 IDAU 和 SAU 直接强制安全和非安全访问限制,但它们与安全和非安全存储器保护单元 (MPU) 共同确定与目标资源关联的访问权限(图 6)。


将保护扩展到更多外设和存储器
这些处理器的 IDAU、SAU 和 MPU 功能提供了灵活的基础,以保护系统软件和应用程序的运行时执行,但是这些功能仅限于处理器本身。像 NXP LPC55S69JBD100K 和 STMicroelectronics STM32L552VET6 这样的处理器可通过各种方法,将安全和特权功能扩展到其他存储器系统和接口。
对于 STM32L552VET6,STMicroelectronics 用自己的全局 TrustZone 控制器 (GTZC) 对原生 TrustZone 机制进行了补充。这种全局 TrustZone 控制器旨在保护外设、嵌入式 SRAM 和外部存储器(图 7)。


STMicroelectronics 提供了 STM32L552E-EV、STM32L562E-DK 和 NUCLEO-L552ZE-Q 评估板作为快速原型开发平台,用于构建基于其 STM32L5 处理器的应用。该公司的 STM32CubeIDE 集成开发环境 (IDE) 提供了综合的软件编程环境,并且其 STM32CubeProgrammer 提供了图形用户界面 (GUI) 和命令行界面 (CLI) 版本,用于对内部和外部存储器进行编程。例如,使用此工具,开发人员可以定义闪存中的安全区域(图 9)。

总结
物联网安全依赖于密码学和安全存储等基本安全机制,以及在基于硬件安全机制的信任根上构建应用的功能。尽管这些都是确保安全的必需条件,但很少能够足以应对那些利用系统运行时环境中漏洞的持续威胁。通过利用越来越多的处理器中提供的分层保护机制,开发人员可以构建安全的物联网设备,更好地缓解这些威胁并减少或消除它们对物联网应用的影响。
作者:Stephen Evanczuk