Trusted Firmware-M 概述
Trusted Firmware-M (TF-M) 是平台安全架构(PSA) IoT 安全框架 的参考实现。它定义并实现了一套架构和软件组件,旨在解决 IoT 产品中的一些主要安全问题。
Zephyr RTOS 自 Zephyr 2.0.0(搭配 TF-M 1.0)起已通过 PSA Certified 认证,目前与 TF-M 2.1.0 集成。
TF-M 提供哪些功能?
TF-M 通过一组安全服务以及自身的设计,提供以下能力:
安全与非安全资源的隔离
适合嵌入式环境的加密能力
设备机密(密钥等)的管理
固件校验(与加密)
受保护的片外数据存储与读取
设备身份证明(设备证明)
审计日志记录
构建系统集成
在受支持的平台上使用 TF-M 时,作为标准 Zephyr 构建过程的一部分,TF-M 会在后台自动构建并链接。该构建过程对 TF-M 的使用方式做了若干假设,并对 Zephyr 应用镜像能做什么和不能做什么有某些影响:
安全处理环境(安全启动与 TF-M)先启动
Zephyr 的资源分配取决于安全镜像中所做的选择。
架构概述
TF-M 应用通常包含以下三个部分,从左到右信任程度由高到低,代码的执行顺序也与此相同(安全启动 > 安全镜像 > ns 镜像)。
安全 bootloader 虽然是可选的,但默认启用,而安全启动是提供安全解决方案的重要组成部分:
+-------------------------------------+ +--------------+
| Secure Processing Environment (SPE) | | NSPE |
| +----------++---------------------+ | | +----------+ |
| | || | | | | | |
| | bl2.bin || tfm_s_signed.bin | | | |zephyr.bin| |
| | || | | <- PSA -> | | | |
| | Secure || Trusted Firmware-M | | APIs | | Zephyr | |
| | Boot || (Secure Image) | | | |(NS Image)| |
| | || | | | | | |
| +----------++---------------------+ | | +----------+ |
+-------------------------------------+ +--------------+
(Zephyr)非安全处理环境(NSPE)与(TF-M)安全处理环境镜像之间的通信基于一组 PSA API 进行,通常会使用 TF-M 构建中附带、并在 Zephyr 中实现的 IPC 机制(见 modules/trusted-firmware-m/interface)。
信任根(RoT)架构
TF-M 基于 信任根(RoT) 架构。这样可以形成从最高信任到较低信任再到最低信任的信任层级,为构建或访问可信服务和资源提供坚实的基础。
这种方法的优点在于,信任程度较低的组件无法访问或破坏系统中更关键的部分,而且信任程度较低的环境中的错误状况不会破坏更可信的隔离资源。
TF-M 定义了以下 RoT 层级,信任程度由高到低:
PSA 信任根(PRoT),包括:
PSA 不可变信任根:安全启动
PSA 可更新信任根:最可信的安全服务
应用信任根(ARoT):隔离的安全服务
PSA 不可变信任根 是系统中信任程度最高的代码,后续的信任根都以它为根基。在 TF-M 中,它就是安全启动镜像,负责校验安全和非安全镜像是否有效、是否被篡改过,以及是否来自可靠的来源。安全 bootloader 借助内置的公开签名密钥,还会在固件更新过程中校验新镜像。顾名思义,该镜像是 不可变的。
PSA 可更新信任根 实现了 TF-M 中最可信的安全服务和组件,例如安全分区管理器(SPM),以及 PSA Crypto、内部可信存储(ITS)等共享安全服务。PSA 可更新信任根中的服务可以访问同一信任根中的其他资源。
应用信任根 是安全处理环境中的一个权限受限区域;根据构建 TF-M 时所选的隔离级别,它对 PRoT 的访问受到限制,在最高隔离级别下甚至对其他 ARoT 服务的访问也受到限制。ARoT 中存在一些标准服务,例如受保护存储(PS);一般来说,你实现的自定义安全服务应放在 ARoT 中,除非有充分理由将它们放在 PRoT 中。
这些划分与 不可信代码 不同,后者运行在非安全环境中,在系统中权限最低。在本例中,它就是 Zephyr 应用镜像。
隔离级别
目前,TF-M 中定义了三种不同的 隔离级别,各区域之间的边界越来越严格。所使用的隔离级别取决于你的安全需求以及你可用的系统资源。
隔离级别 1 是最低的隔离级别,唯一的主要边界是安全处理环境与非安全处理环境之间,通常通过 Armv8-M 处理器上的 Arm TrustZone 实现。此级别不区分 PSA 可更新信任根(PRoT)和应用信任根(ARoT),它们以相同的权限级别执行。该隔离级别会得到最小的组合应用镜像。
隔离级别 2 在级别 1 的基础上引入了 PSA 可更新信任根与应用信任根之间的区分:ARoT 服务对 PRoT 服务的访问受到限制,只能通过 PRoT 服务公开的公共 API 与它们通信。不过,ARoT 服务之间并未严格隔离。
隔离级别 3 是最高的隔离级别,它在级别 2 的基础上将各个 ARoT 服务相互隔离,使每个 ARoT 基本上与其他服务相互隔绝。这提供了最高级别的隔离,但代价是额外的开销以及服务之间的代码重复。
当前的隔离级别可以通过 CONFIG_TFM_ISOLATION_LEVEL 查看。
安全启动
TF-M 中默认的安全 bootloader 基于 MCUBoot,在 TF-M 中称为 BL2 (指第二阶段 bootloader,它可能位于安全 MCU 上基于硬件的 bootloader 之后,等等)。
TF-M 中的所有镜像都会计算哈希并签名,固件更新过程中由 MCUBoot 校验哈希和签名。
TF-M 中所用 MCUBoot 的一些关键特性包括:
公开签名密钥被固化到 bootloader 中
S 和 NS 镜像可以使用不同的密钥签名
固件镜像可以选择加密
由客户端软件负责将新镜像写入副槽位
默认使用由两个大小相同的存储区域构成的静态 flash 布局
可选的安全计数器,用于防回滚保护
处理(可选)加密镜像时:
只有有效载荷会被加密(头部和 TLV 为明文)
哈希计算和签名针对未加密的数据进行
使用
AES-CTR-128或AES-CTR-256进行加密每个加密周期都会重新随机生成加密密钥(通过
imgtool)AES-CTR密钥包含在镜像中,可以使用以下方式加密:RSA-OAEPAES-KW(128 或 256 位,取决于AES-CTR密钥长度)ECIES-P256ECIES-X25519
用于控制 Zephyr 中安全启动的密钥配置属性包括:
CONFIG_TFM_BL2用于切换 bootloader(默认值 =y)。CONFIG_TFM_KEY_FILE_S覆盖安全签名密钥。CONFIG_TFM_KEY_FILE_NS覆盖非安全签名密钥。
安全处理环境
安全 bootloader 执行完毕后,基于 TF-M 的安全镜像会在 安全处理环境 中开始执行。设备将在这里完成初始配置,安全服务也会在这里初始化。
请注意,设备的初始状态由安全固件控制,这意味着非安全 Zephyr 应用启动时,外设可能并不处于硬件默认的复位状态。如有疑问,请务必查阅 TF-M 中的开发板支持包,它们位于 TF-M 模块的 platform/ext/target/ 文件夹中(在默认的 Zephyr west 工作区中,该模块位于 modules/tee/tf-m/trusted-firmware-m/)。
安全服务
从 TF-M 1.8.0 起,通常可以使用以下安全服务(不过各厂商的支持情况可能有所不同):
加密
固件更新(FWU)
初始证明
平台
安全存储,包含两部分:
内部可信存储(ITS)
受保护存储(PS)
此外还提供了一个模板,用于创建你自己的自定义服务。
有关这些服务及其公开 API 的完整详细信息,请参阅 TF-M 文档。
密钥管理与派生
密钥与机密管理是任何安全设备的关键组成部分。你需要确保密钥材料只对需要它的区域可用,而不对其他任何对象可用,并且其存储方式足够安全,难以被篡改或恶意访问。
TF-M 中的 内部可信存储 服务被 PSA Crypto 服务(其自身使用 mbedtls)用来存储密钥,并确保私钥只能被安全处理环境访问。使用密钥材料的加密操作(例如对有效载荷签名或解密敏感数据)都通过密钥句柄进行。任何时候都不应将密钥材料暴露给 NS 环境。
一个例外是,私钥可以作为单向操作注入到安全处理环境,例如在工厂配置过程中;但即便如此也应尽可能避免,而应请求 SPE(通过 PSA Crypto 服务)自行生成新的私钥,随后在配置过程中请求其公钥并在工厂中登记。这样可以确保私钥材料在配置阶段从不暴露,甚至从不被知晓。
TF-M 还大量使用 硬件唯一密钥(HUK),每个 TF-M 设备都必须提供该密钥。这种设备唯一的密钥被 受保护存储 服务用来加密存储在外部存储器中的信息。例如,这可以确保 flash 存储器的内容一旦被移出并放到新设备上就无法解密,因为每个设备都有自己唯一的 HUK,在首次加密存储器内容时使用。
HUK 还为开发者提供了额外优势:它可以用来派生新密钥,而 派生密钥 无需存储,因为可以在启动时借助附加的盐值/种子值(取决于所用的密钥派生算法)从 HUK 重新生成。这消除了存储问题以及一种常见的攻击途径。HUK 本身在安全设备中通常受到高度保护,用户无法直接访问。
TFM_CRYPTO_ALG_HUK_DERIVATION 指定了使用软件实现时所采用的默认密钥派生算法。当前的默认算法是带 SHA-256 哈希的 HKDF (RFC 5869)。某些平台上可能还提供其他硬件实现。
非安全处理环境
Zephyr 用于 NSPE,所用开发板需受 TF-M 支持,并且已启用 CONFIG_BUILD_WITH_TFM 标志。
通常,你只需选择某个有效开发板的 */ns 开发板目标(例如 mps2/an521/cpu0/ns),它就会把你的 Zephyr 应用配置为在 NSPE 中运行、正确地将其与 TF-M 安全镜像一起构建和链接、对安全和非安全镜像签名,并将三个二进制文件合并为单个 tfm_merged.hex 文件。在此配置下,west flash 命令默认会烧写 tfm_merged.hex。
目前,Zephyr 还不能配置为用作安全处理环境。