运用市面上第一款基于 Arm® Cortex®-M33 的 MCU – 第 2 部分:生命周期安全管理
投稿人:DigiKey 北美编辑
2019-07-09
编者按:本系列文章分为两部分,第 1 部分探讨了如何优化 NXP Semiconductors 的 LPC55S6x 通用微控制器 (MCU) 以实现高性能和低功耗。本文是第 2 部分,则说明如何优化该微控制器以实现生命周期安全管理。
对于基于微控制器的系统的开发人员而言,物联网 (IoT)、工业自动化或个人电子设备之类快速增长的应用有着广泛的设计要求,往往迫使开发人员在系统功能、性能或功耗方面做出妥协。面对越来越多的安全威胁,此类设计需要加强安全性,这就带来了进一步的挑战,开发人员可以使用的有效微控制器解决方案愈发减少。开发人员所需的微控制器不仅要能支持低功耗和高性能等常见要求,还要能支持设计生命周期所有阶段(包括配置、通信、安全引导、安全固件更新等)日益提高的安全性需求。
第 1 部分介绍了 NXP 的 LPC55S6x 微控制器系列,并说明了其特性如何满足高性能与低功耗的要求。本文是第 2 部分,讨论 LPC55S6x 微控制器集成的扩展安全特性如何从配置、通信到安全引导、安全固件更新等各方面支持生命周期安全性。
如第 1 部分所述,NXP 单核 LPC55S66 和双核 LPC55S69 微控制器将 Arm® Cortex®-M33 通用处理器内核与旨在满足更多专业应用需求的硬件功能结合在一起。在这些功能中,用于对称和非对称加密的基于硬件的加速器提供了安全通信所需的基础机制。过去认为加密加速器足以实现数据保护等基本安全特性。但如今,用户期望获得更全面的安全特性,这使得生命周期安全性需求更为复杂,从制造中的配置延伸到现场调试,以及安全引导和安全固件更新。
为了实现这种扩展保护,需要一套远高于硬件级别的全面安全协议和策略。即便如此,任何安全协议的有效性都与是否存在合适的硬件机制息息相关,因为只有硬件才能既能加速执行,又能消除或减少任何互连设备中不可避免会出现的威胁面。
LPC55S6x 架构具有一系列能力,可提供这种基于硬件的生命周期安全性支持,首先是支持 Arm TrustZone® 技术,另外还提供实现切实有效的安全水平所需的多层保护。
TrustZone 支持
TrustZone 能够将代码执行和数据隔离到特定的安全域和非安全域,从而为安全性打下基础。在程序执行期间,主 Cortex-M33 内核在若干不同执行状态(与不同的代码执行模式关联)之间切换。所述 CPU 状态和代码执行模式包括:
- 安全特权,用于执行内核级代码或设备处理程序
- 安全非特权,用于执行安全的用户代码
- 非安全特权,用于执行典型的系统调用
- 非安全非特权,用于执行典型的用户应用程序
特权执行与非特权执行的区别对整体操作系统的稳健性至关重要。但就本文的目的而言,我们可以将这些执行模式统合起来,只关注安全和非安全操作之间的区别。在 TrustZone 架构中,从安全 CPU 状态切换到非安全 CPU 状态会触发硬件支持的限制,让内核访问程序存储器或数据。
在安全状态下,内核可以访问安全和非安全存储区中的数据,但不能访问非安全存储区中存储的代码(图 1 左)。在非安全状态下,内核只能访问非安全存储区中的代码和数据(图 1 右)。
图 1:通过支持 Arm TrustZone,NXP 的 LPC55S6x 微控制器确保工作在安全 (S) 状态(左)的内核只能获取 S 状态程序存储器的指令,而工作在非安全 (NS) 状态(右)下的内核则无法访问 S 状态存储器中存储的代码或数据。(图片来源:NXP Semiconductors)
LPC55S6x MCU 架构在最低级别的总线访问上执行这种控制,从而减小常见的威胁面,例如攻击者使用缓冲区溢出让非安全的非特权代码获得对“受保护”区域的后门访问权。这里,NXP 将 Arm TrustZone 安全属性单元 (SAU) 与其自己的实现定义属性单元 (IDAU) 结合使用,旨在完全隔离安全内核代码与应用程序代码。SAU 提供安全状态(安全或非安全)并判断指令是否来自允许的存储器区域。IDAU 与设备属性单元 (DAU) 接口以提供更高的粒度,同 SAU 一道确定特定地址的安全属性。这样,总线请求便能以适当的安全性和特权级别进行传送(图 2)。
图 2:NXP 的 LPC55S6x 微控制器总线事务级别的访问保护,使用 Arm TrustZone SAU 及其自己的 IDAU 来确保系统总线请求在适当的安全性和特权级别运行。(图片来源:NXP Semiconductors)
安全存储和外设
TrustZone 保护机制在运行时隔离应用程序代码和数据,对使用的数据进行寻址(经典数据安全原则之一),其中也包括静态数据和传输中的数据。这些原则通常与企业级数据问题相关,但也适用于嵌入式系统中的代码和数据。这里,若一个典型嵌入式系统使用微控制器的集成闪存存储固件映像、代码和数据,这可能成为明显的攻击途径。LPC55S6x 器件通过名为 PRINCE 的加密/解密算法来消解这种威胁。[阅读说明:PRINCE 不是首字母缩略词。]
由于其速度快且资源要求极低,PRINCE 算法非常适合嵌入式系统中的安全实现。在 LPC55S6x 器件中,PRINCE 算法通过硬件实现,实时运行,可以在读取或写入数据时即时解密或加密数据。与其他很多加密算法不同,PRINCE 算法不需要使用 RAM 来保存原始数据或中间结果,这就又消除了一个安全漏洞。因此,开发人员可以更安全地将应用程序代码、固件映像甚至安全密钥存储在微控制器的内部闪存中。
虽然加密引擎和安全闪存会锁定数据交换和存储,但安全嵌入式系统与传感器和变送器的交互需要同样程度的安全性。除了安全 DMA 功能外,LPC55S6x MCU 架构还提供了多种机制来进一步保护内核或其他总线主控器与其集成外设、存储器或 GPIO 之间的交换(图 3)。
图 3:NXP 的 LPC55S6x 微控制器将多层总线矩阵与 MSW、MPC、PPC 结合在一起,以隔离和保护该器件的不同总线主控器与其外设和存储器之间的事务处理。(图片来源:NXP Semiconductors)
在此保护方案中,存储器保护校验器 (MPC) 会限制安全性较低的应用程序对存储器的访问。外设保护校验器 (PPC) 为外设提供同类访问控制,允许开发人员为不同外设设置不同的访问规则。由于 SAU/IDU 机制仅适用于主 Cortex-M33 内核,主安全包装器 (MSW) 则用来为其他总线主控器提供类似的访问保护。由于多层 AHB 矩阵在总线主控器与外设或存储器之间创造了一条专用路径,因此内部总线连接与该器件中可能发生的其他总线事务处理是隔离的,安全得以保证。
LPC55S6x MCU 架构通过其安全 GPIO 系统进一步隔离了对外部器件的安全和非安全访问。该系统将类似的隔离,即 TrustZone 机制在安全和非安全 CPU 状态与代码执行模式之间创建的隔离,扩展到 GPIO 引脚。因此,只有在安全状态下运行的主 Cortex-M33 内核才能访问安全 GPIO 引脚,这使开发人员能够保护来自关键外部器件的信号。
安全密钥管理
本文到目前为止描述的各种保护机制为安全嵌入式系统奠定了基础。但是,要将该系统安全地连接到网络、智能手机或其他主机,开发人员必须能够在初始调试和持续的事务处理期间对连接目标进行身份验证,并且能够维护安全加密的通信通道。反过来,作为认证协议和加密机制核心的非对称和对称加密算法的安全性,最终取决于这些协议和机制中使用的私钥安全性。
LPC55S6x 微控制器利用集成的物理不可克隆功能 (PUF),为安全存储现有密钥并生成新密钥提供了一种高度安全的机制。这种方法依靠 PUF 硬件的能力来创建唯一的 PUF 根密钥,使用它来对其他用户密钥进行加密。PUF 根密钥的唯一性源于其使用内部器件功能以及 SRAM 启动数据,而 SRAM 启动数据源自上电时 SRAM 单元的随机 0 和 1 内容。在 PUF 登记阶段,器件使用这两个随机数据源来创建数字指纹和相关的 1192 字节激活码(图 4)。
图 4:NXP LPC55S6x 微控制器的集成 PUF 使用启动时 SRAM 的随机状态和其他内部功能生成数字指纹和激活码,以用于随后的密钥生成和存储操作。(图片来源:NXP Semiconductors)
在工厂配置器件期间或以后的实际使用中,此激活码存储在器件受保护闪存区域中的客户现场可编程区域 (CFPA) 中。每次微控制器上电和使用 PUF Start 命令激活 PUF 时,PUF 就会将现有激活码与 SRAM 启动数据组合,以重建数字指纹。
在此 PUF Start 过程之后,PUF SetKey 命令让 PUF 对用户密钥进行编码,例如工厂配置的共享主密钥或由开发人员为其应用程序提供的私钥。在这里,PUF 根据密钥大小、密钥索引和用户密钥本身生成相应用户密钥的密钥代码(图 5)。
图 5:NXP 的 LPC55S6x PUF 提供的 SetKey 功能使用其数字指纹对用户密钥和密钥索引进行编码,提供随后用于访问原始用户密钥的密钥代码。(图片来源:NXP Semiconductors)
开发人员还可以使用 PUF GenerateKey 命令生成新密钥,该命令采用与 SetKey 相同的生成过程,但使用内部生成的唯一数据取代图 5 中显示的 KEYIN 功能。使用密钥索引 = 0 设置或生成的密钥可获得进一步的保护,如下文所述。
要使用密钥,开发人员调用 PUF GetKey 命令以检索原始用户密钥,其输出路径有两条,具体输出路径取决于设置或生成密钥时使用的密钥索引值。如果密钥索引大于零,则可通过 PUF CODEOUTPUT 寄存器获得用户密钥。如果密钥索引等于零,则用户密钥将直接传递给 AES 引擎,或传递给 KEYENABLE 的值所指定的 PRINCE 引擎的三个支持的闪存区域(图 6)。尽管没有直接参与密钥检索,但 PUF 的 4 位 KEYMASK 寄存器支持专为缓解旁路攻击的内部机制。
图 6:开发人员使用 NXP 的 LPC55S6x PUF GetKey 命令访问密钥。这会使用 SetKey(或 GenerateKey)操作期间生成的密钥索引和密钥代码输出原始用户密钥,或通过专用总线将其发送到微控制器的加密加速器。(图片来源:NXP Semiconductors)
零索引密钥有助于加强生命周期安全性,甚至从工厂配置阶段开始便能保证安全。一旦通过 PUF SetKey 配置,无论是用于对称加密的共享主密钥,还是用于非对称加密的私钥,都永远不会离开器件或进入系统总线。相反,密钥通过软件无法访问的专用硬连线接口在内部传输到 AES 或 PRINCE 引擎。
PUF 密钥管理机制和微控制器的其他安全特性共同支持其他生命周期安全性阶段,包括安全引导和固件更新。针对安全引导,LPC55S6x 支持多种保护方法,包括使用经验证的 X.509 证书对 RSA2048 签名映像进行身份验证,或对 PRINCE 闪存区域中存储的映像进行解密。无论何种情况,引导程序都使用 PUF 生成的密钥哈希值从 PUF 密钥存储区中安全地检索验证证书或解密映像所需的密钥,这些密钥哈希值与映像一起存储在受保护的闪存区域中。
固件更新使用类似的机制来验证无线更新固件映像,对其进行解密,然后准备好进行引导。
除了安全引导和固件更新的直接需求外,该器件的多个密钥存储插槽和密钥生成功能还支持持续的安全生命周期要求,可以撤销密钥和证书。这种密钥管理功能进而支持更高级别的安全策略,例如固件映像撤销。
通过使用 NXP 的 LPCXpresso55S69 开发板并结合 NXP 的 MCUXpresso 集成开发环境 (IDE)、IAR 或 Keil IDE,开发人员可以快速探索 LPC55S6x 微控制器的能力。MCUXpresso Config Tools 集成在 MCUXpresso IDE 中,可帮助开发人员设置 MCU 硬件并生成初始化代码。利用该配置工具集中的可信执行环境 (TEE) 工具,开发人员可以更轻松地配置 LPC55S6x MCU 的多级安全访问。使用 TEE 工具的图形界面,开发人员可以针对上文描述的四种 CPU 状态和执行模式中的每一种,优化对存储器、总线主控器和外设的访问权限(图 7)。
图 7:利用 NXP 的 MCUXpresso Config Tools 实用工具集中可信执行环境工具的图形界面,开发人员可以针对以四种 CPU 状态和执行模式运行的代码,设置对存储器、总线主控器和外设的访问权限(图片来源:NXP Semiconductors)
针对代码开发,NXP 还提供了许多简单的代码示例,这些示例演示了使用微控制器安全特性(例如安全 GPIO、PUF 密钥管理和其他器件功能)的基本设计模式。然而,即使在开发阶段,LPC55S6x MCU 也可通过单线调试 (SWD)
认证能力来帮助维持生命周期安全性。借助此功能,经授权的开发人员可以调试其安全代码并禁用对安全资源的任何进一步 SWD 访问,然后将开发工作交给非安全软件开发人员。这些开发人员在完成代码调试之后,进而可以禁用所有通过 SWD 端口的调试访问。
总结
开发人员面临着对低功耗、高性能设计日益增长的需求,同时还需要能够维持从工厂配置到现场安全操作的整个生命周期的安全性。如本文所述,NXP 的 LPC55S6x 系列微控制器提供了一种有效的解决方案,它既具备通用处理能力,又有丰富的专用硬件特性来支持生命周期安全性。
免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。