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-OAEP

    • AES-KW (128 或 256 位,取决于 AES-CTR 密钥长度)

    • ECIES-P256

    • ECIES-X25519

用于控制 Zephyr 中安全启动的密钥配置属性包括:

安全处理环境

安全 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 还不能配置为用作安全处理环境。