作者:Jacob Beningo
与嵌入式产品的传统要求相比,边缘物联网设备需要更多安全措施。对于拥有电气工程背景,却不具备密码学或系统安全方面专业知识的团队和开发人员来说,理解和着手处理安全问题通常比较困难。
在现代开发周期中,开发人员几乎没有时间和预算从零开始学习或成长为安全专家。不过,开发人员可以利用现有的安全解决方案,根据自己的特定需求灵活调整。
本文将介绍 Arm® 的 TrustZone,这是一种有趣的解决方案,在基于微控制器的系统的设计师群体中越来越受欢迎。本文将通过列举实例的方法来介绍支持 TrustZone 的 STMicroelectronics STM32L5 系列微控制器,并展示如何使用相关开发套件来初步应用 TrustZone。
通过隔离保障安全性
安全嵌入式系统的核心基本元素是通过隔离保障安全性。其概念是,重要的数据资产(如私钥、用户数据、安全功能等)应与通用数据和功能(如图形用户界面元素或实时操作系统 (RTOS))隔离开来。虽然有些方法可以创建软件隔离,但安全专家认为嵌入式系统需要通过基于硬件的隔离来实现安全性。
有多种方法可以用硬件创建隔离,比如使用微控制器和安全处理器,或者使用多核处理器,将其中一个核专门用于安全处理。较新的 Arm Cortex®-M23、Cortex-M33 和 Cortex-M55 处理器均支持基于硬件的可选隔离功能 TrustZone。
什么是 Arm TrustZone?
TrustZone 是一种在单核微控制器中实现的硬件机制,将执行环境划分为安全和非安全的内存、外设和功能。此外,每个执行环境中都包含一个内存保护单元 (MPU),用来进一步隔离内存区域,提供类似洋葱的多层屏障,威慑和阻碍试图访问数据资产的潜在攻击者。
通常来说,嵌入式开发人员会将他们的系统划分为至少两个项目:一个是非安全的执行项目,通常称为用户项目;另一个是安全的执行项目,通常称为固件项目。启用 TrustZone 的微控制器将启动进入安全状态,并在跳到非安全状态以执行用户应用程序之前启动系统(图 1)。
图 1:TrustZone 项目通过一种将嵌入式软件分隔为用户项目(非安全)和固件项目(安全)的硬件机制实现隔离。(图片来源:Arm)
用户项目只能通过在固件项目和用户项目之间创建的安全网关访问安全功能,若不触发异常则无法访问安全内存位置。
选择支持 TrustZone 的开发板
要开始理解 TrustZone,最简单的方法就是直接开始使用。为此,开发人员必须先选择开发板。通过不同的微控制器供应商可以选择不同的开发板,但要注意一点:各种开发板实现 TrustZone 的方式并不相同,这可能会让情况变得有点棘手。
TrustZone 入门应用可以搭配的理想开发板示例是 STMicroelectronics 的 STM32L562E Discovery 套件(图 2)。
图 2:STM32L562E Discovery 套件包含许多板载传感器、蓝牙和 I/O 扩展板,因而可以轻松地开始使用 TrustZone 应用程序。(图片来源:STMicroelectronics)
这个套件提供的许多支持特性,在初次使用 TrustZone 时非常有用。例如,该开发套件中包括一个 1.54 英寸 240 x 240 像素的 TFT LCD 模块(附触摸式控制面板)、蓝牙 v4.1 低能耗模块、iNEMO 3D 加速计和陀螺仪、板载 STLINK-V3E,以及其他用于 I/O 和外设扩展的功能。
另一种可用于 TrustZone 入门应用的开发板是 STMicroelectronics NUCLEO-L552ZE-Q Nucleo 板(图 3)。
图 3:STM32L552ZE-Q NUCLEO 开发板提供支持 TrustZone 的处理器、ST-LinkV3 和扩展排针,适合定制开发活动。(图片来源:STMicroelectronics)
与 STM32L562E Discovery 套件不同的是,NUCLEO-L552ZE-Q 属于基本开发板,包含 ST-LinkV3、STM32L552VET6 微控制器、扩展端口和 LED 灯。对于想要使用 TrustZone 并尽可能快地开始集成自己的硬件组件的开发人员来说,此开发板是非常棒的选择。
尽管 NUCLEO-L552ZE-Q 的附加功能并不全面,但 STM32L552VET6 的表现确实令人印象深刻。这是一个 Arm Cortex-M33 处理器,带有一个浮点单元 (FPU),闪存容量为 512KB,静态随机存取存储器 (SRAM) 容量为 256KB。除 TrustZone 之外,它还包括多个其他安全特性,例如具有唯一启动项目的信任根、安全固件安装和针对 Cortex-M 可信固件 (TF-M) 的安全固件升级支持。
这两种开发板的处理器都包含 TrustZone 安全仲裁单元 (SAU),用于设置将由 TrustZone 提供保护的内存和外设。某些微控制器供应商的 TrustZone 实现中缺少 SAU。虽然不一定会导致问题,但需要用不同的程序来设置 TrustZone。
启动第一个基于 TrustZone 的应用程序
启动并运行 STMicroelectronics 开发板需要执行几个步骤和软件包。首先,开发人员需要下载 STM32CubeIDE。STM32CubeIDE 提供用于应用程序开发的编译器、微控制器包和 IDE,以及包括 STM AN5394 在内的任何相关应用程序说明。
使用现有的 TrustZone 示例项目是启动和运行应用程序的最快方法。STM32Cube_FW_L5 软件包中包含多个项目。该软件作为 STM32CubeL5 软件的一部分下载。下载后,开发者可以从相应的目录路径导入 TrustZoneEnabled 项目,比如:
STM32Cube_FW_L5_V1.2.0STM32Cube_FW_L5_V1.2.0ProjectsSTM32L552E-EVTemplatesTrustZoneEnabled
导入项目后,开发人员可以看到该项目具有层级项目结构,将应用程序分为了安全应用和非安全应用(图 4)。
图 4:TrustZone 项目在由安全和非安全项目构成的分层项目结构中实现。(图片来源:Beningo Embedded Group)
这些项目中有很多细节可以探索。AN5394 可以补充很多细节,而每个项目的 Doc 文件夹中的 readme.txt 文件则可以解释关于安全和非安全项目的细节。在本文中,我们将研究与 TrustZone 相关的最重要概念。具体来说,就是如何配置 TrustZone。配置可以在以下路径的 partition_stm32L562xx.h 文件中找到:
C:STM32Cube_FW_L5_V1.2.0ProjectsSTM32L562E-DKTemplatesTrustZoneEnabledSecureInc
此文件中包含 SAU 的设置。例如,图 5 显示了 SAU 区域 0 的设置。此区域当前配置为安全执行。另一方面,图 6 显示了被配置为非安全的 SAU 区域 1。
为安全执行配置的 SAU 区域 0 的代码
图 5:SAU 用于配置安全和非安全的内存区域。上面的代码演示了如何为安全执行配置 SAU 区域 0。(图片来源:Beningo Embedded Group)
为非安全执行配置的 SAU 区域 1 的图片
图 6:SAU 用于配置安全和非安全的内存区域。上面的代码演示了如何为非安全执行配置 SAU 区域 1。(图片来源:Beningo Embedded Group)
开发人员将决定需要安全或非安全执行的区域,并使用分区文件配置 SAU。创建这些设置并不能保证 TrustZone 将被启用!将基于 TrustZone 的应用程序编程到目标上时,开发人员需要将 TZ 选项字节设置为 1 才能启用 TrustZone。然后目标会在启动期间启用 TrustZone,并读取和使用 SAU 配置。
TrustZone 的使用技巧与诀窍
TrustZone 上手并不难,但需要开发人员以略微不同的方式考虑自己的应用程序设计。下面是几个启动设计的“技巧与诀窍”:
· 并非所有数据都需要保护。预先确定需要保护的关键数据资产。
· 利用现有的安全框架,如 CMSIS-Zone 和针对 Cortex-M 的可信固件 (TF-M) 来加速开发。
· 仔细检查对设备的潜在威胁,并选择支持硬件和软件解决方案的微控制器来预防这些威胁。
· TrustZone 提供单层隔离。利用 MPU 和其他硬件机制创建多个基于硬件的隔离层。
· 在架构阶段(而非实现阶段)识别安全和非安全代码元素。
开发人员遵循这些“技巧与诀窍”后,便会发现他们可以在保护物联网设备安全的过程中节省不少时间并省去很多麻烦。
结语
TrustZone 是面向物联网开发人员提供的一件重要工具,用以帮助他们保护自己的设备和数据资产。安全解决方案可以通过几种不同的方式实现,但正如我们所看到的,TrustZone 为开发人员提供了单一核心解决方案,其中包含传统的软件开发模型。唯一的区别在于,开发人员需要开始考虑安全和非安全的组件、数据和线程。