一.前言
本文对TrustZone 进行简单的介绍,不涉及具体的技术细节,旨在有一个概念性的感性的理解,后面有机会再分享几篇更详细的技术细节介绍和实际应用案例。
本文后续内容以瑞萨的RA系列为例,不同厂家芯片可能不同需要参考对应的手册。
二.TrustZone介绍
Arm® TrustZone® 技术是Armv8-M 架构一个可选的架构扩展。
其核心思想就是朴素的硬件隔离思想,系统和软件划分为安全区域和非安全区域,安全软件可以访问安全和非安全存储器和资源,而非安全软件只能访问非安全存储器和资源。安全与非安全状态与现有的线程和处理模式组合,即有四种处理器状态,如下所示:
系统实现了安全扩展,则系统默认以安全状态启动的,即启动时是无所不能的,一般此时对应bootrom完全相关工作,然后跳转到用户非安全程序运行。如果未实现安全扩展,则系统始终处于非安全状态。
注意安全是一个系统工程,Arm® TrustZone®只是提供了一种实现安全的隔离技术,并未包括安全的所有方面,比如他就不涉及加密等,也并不是说使用Arm® TrustZone®就安全了,安全是需要系统考虑的,任何一处不安全整个系统就不安全,符合木桶原理。打个比方,武侠小说中很牛逼的反派人物,练就了金钟罩铁布衫刀枪不入,但是往往会有一个弱点就是比如足下或者腋下很脆弱,这就不是安全系统,木桶原理导致其很容易从非安全处被攻破,所以最后大决战阶段正派一开始被暴击,最后快要挂了时,对准反派的弱点比如足下一击,立马KO。所以安全的考虑要系统的考虑,而不仅仅是考虑使用一种什么技术,及你就能考虑处理器就可以达到的。
三.关键组件
隔离的目的就是要隔离关键组件(资源),使得其受保护,不能被非信任软件直接访问,避免被攻击。
关键组件包括以下内容:
- 安全自举程序,即前面提到的bootrom程序,因为系统启动默认是安全状态的(能不能启动时不是安全状态呢? 不能,如果此时不是安全状态则没法配置安全资源,没法进行初始化配置,所以启动时必须是安全状态,此时无所不能)。所以启动程序要保证受保护,不会被攻破。
- 密钥,这个不用说,密钥肯定是要保证不能被非法获取的,否则别人有了你家的钥匙,你再牛逼的防盗门也没啥用。
- 闪存编程支持,这也很重要,因为程序最终是要写入FLASH的,如何保证程序烧录的安全,不被篡改,不烧录非授信程序等都是保证安全的前提。
- 高价值资产,其他的,比如用户信息数据等都是需要受保护的。
四.安全系统
要构建安全硬件平台,安全注意事项不仅仅要考虑处理器级别,而是需要考虑系统级别,所以一再强调的是系统安全,而不是处理器安全,主要包括:
存储器系统
总线系统
外设
调试系统等。
4.1存储器系统
前面提到了TrustZone 技术的核心是隔离,所以针对存储器系统就是划分不同的区域对应不同的属性。代码闪存、数据闪存和 SRAM 分为 安全 (S)、非安全 (NS) 和非安全可调用 (NSC) 区域,比如瑞萨的RA系列MCU这个划分是通过IDAU控制的。
如下图所示:
代码闪存和SRAM都可以执行程序所以有非安全可调用区域,而数据闪存不可执行程序只有非安全和安全区域之分。
当器件生命周期为安全软件开发 (SSD) 状态时,可通过使用串行编程命令将这些存储器安全属性编程到非易失性存储器中。
安全区域,执行安全程序,具备最高权限可以访问所有资源。
安全地址用于只能由安全代码或安全 master 访问的内存和外设。安全事务是那些由 master 发起并在安全状态下运行的事务。
非安全区域,执行非安全程序,只能访问非安全资源,也可以调用非安全可调用区域API,执行一些安全程序的接口。
非安全地址用于设备上运行的所有软件均可访问的内存和外设。非‑安全事务源自以非安全方式运行的 master或访问非安全地址的安全 master(仅数据事务,非获取指令)。仅允许非安全事务访问非‑安全地址。非安全事务不能访问安全地址。
非安全可调用区域NSC,即中间地带,提供非安全程序可调用的安全API。
NSC 是一种特殊类型的安全位置。这种类型的内存是 Armv8-M 处理器允许为其保留 SG(安全门)指令的唯一类型,该指令允许软件从非安全状态转为安全状态。该 SG 指令可用于防止非安全应用程序从分支进入无效入口点。
当非安全代码调用安全端函数时:
– API 中的第一条指令必须是 SG 指令。
– SG 指令必须在 NSC 区域内。
安全代码还提供非安全可调用函数,为非安全代码提供安全服务访问。
基于 TrustZone 区域 的代码和数据闪存安全功能
从非安全区域读取代码和数据闪存区域将生成 TrustZone 安全故障。
代码和数据闪存 编程和擦除 (P/E) 模式入口可以配置为仅通过安全软件实现,也可以配置为通过安全和非安全软件实现。默认情况下,MCU 将代码和数据闪存 P/E 功能配置为仅通过安全软件实现。闪存驱动程序可以置于安全分区 中,并且可以配置为非安全可调用,以允许非安全应用程序执行闪存 P/E 操作。
支持安全区域和非安全区域的临时和永久闪存块保护。
SRAM
SRAM 存储器可以通过存储器安全属性 (MSA) 分为安全/非安全 可调用/非安全状态,并且可以防止非安全访问。当 MSA 指示 SRAM 存储区域处于安全或非安全可调用状态 时,非安全访问无法覆写它们。
4.2总线系统
DMA 控制器和数据传输控制器
直接存储器访问控制器 (DMAC) 和数据传输控制器 (DTC) 由主 TrustZone 过滤器监控。在访问总线之前,会提 前检测闪存和 SRAM 的 TrustZone 违例区域。DMAC 和 DTC 中的主 TrustZone 过滤器可以检测 IDAU 定义的闪 存区域(代码闪存和数据闪存)和 SRAM 区域的安全区域。当非安全通道访问这些地 址时,主 TrustZone 过滤器会检测到安全违例,不允许访问违例地址。
以太网DMA控制器
EDMAC RAM 缓冲区置于 TrustZone 的非安全 RAM 中。EDMAC 被硬编码为 TrustZone 非安 全总线主器件。这些硬件特性允许以下两个以太网程序分区选项:
在安全区域中运行以太网程序 ,在非安全区域中放置 EDMAC RAM 缓冲区
在非安全区域中运行以太网程序 EDMAC RAM 缓冲区。
MPU
总线主 MPU 可用于除 CPU 外的每个总线主器件的存储器保护功能。安全软件可以设置总线主 MPU 的安全 属性。
4.3外设
MCU 中的大多数外设都可以配置为安全或非安全,但CS 区域控制器、QSPI、OSPI、ETHERC 和 EDMAC始终是非安全。
外设分为两种类型。 类型 1 外设具有一种安全属性,对所有寄存器的访问由一种安全属性控制。安全应用程序将类型 1 外设安 全属性设置到外设安全属性寄存器(PSARx:x = B 至 E)。外设的不同通道可以采用不同的安全属性。例如,UART 通道 0 和通道 1 可以具有不同的安全或非安 全属性。
类型 2 外设具有每个寄存器或每个位的安全属性,根据这些安全属性控制对每个寄存器或位域的访问。安 全应用程序将类型 2 外设安全属性设置到每个模块中的安全属性寄存器。
总结一下就是外设类型1颗粒度更大,所有寄存器一起控制安全属性,类型2颗粒度更小。
时钟生成电路针对每个时钟树控制都有单独的安全属性。可使用一下时钟控制方案。
整个时钟树仅通过安全项目进行控制,在非安全项目中被锁定。
整个时钟树可通过非安全项目和安全项目进行控制。
4.4调试系统
开发阶段希望有更强大的调试功能,以方便进行各种调试分析,而发布阶段希望关闭调试功能以放置通过调试系统被攻破。所以调试功能分为了不同级别
调试功能分为 DBG0、DBG1 和 DBG2 三个级别,以 对支持 TrustZone 技术的调试功能提供支持,并为开发、生产和部署的产品提供安全性。
DBG2:允许调试器连接,无限制访问存储器和外设。
DBG1:允许调试器连接,但仅限访问非安全存储区域和外设
DBG0:不允许调试器连接
调试级别根据产品的器件生命周期状态确定。通过器件生命周期管理系统可以实现调试级别的回退。
五.器件生命周期管理
使用 TrustZone 技术功能和安全加密引擎 9 (SCE9) 实现增强型器件 生命周期管理系统。器件生命周期管理在启用 TrustZone 技术的应用程序开发、生产和部署阶段非常重要,主要实现以下功能:
根据器件生命周期状态定义和切换,在开发和生产阶段创建、安 装和使用器件生命周期管理密钥等。
六.参考
https://developer.arm.com/documentation/100690/0201
《TrustZone® technology for Armv8-M Architecture Version 2.1》
《Renesas RA Family Security Design with Arm ® TrustZone ® - IP Protection》