3. TF-M固件升级概述

在嵌入式安全系统中,固件升级并不是简单地把新镜像写入 Flash,而是一次涉及镜像来源、完整性、版本策略、回滚保护与执行切换的系统性安全操作。TF-M(Trusted Firmware-M)作为面向 Armv8-M 的安全固件框架,把升级能力纳入 PSA 固件更新规范,使安全固件、非安全固件以及安全启动链能够协同完成可信升级。理解本节内容,是后续掌握镜像签名、回滚计数器、双槽切换与恢复机制的基础。

一、固件升级的基本概念

固件升级是指用新版本固件镜像替换设备中正在运行的旧版本,并在升级后保持设备功能、安全属性与启动链完整性的过程。在 TF-M 语境下,升级对象通常包括安全固件(TF-M 本体)、非安全应用固件,以及可能存在的引导加载程序或配置数据。升级的核心目标可以概括为四点:来源可信、内容完整、版本可控、失败可恢复。

与普通 MCU 升级不同,TF-M 升级必须考虑安全域隔离。安全固件运行在安全状态,非安全固件运行在非安全状态,二者通过 PSA 接口交互。升级镜像通常由安全启动链验证,只有通过签名校验和版本检查的镜像才允许被激活。因此,TF-M 升级本质上是一个“受信任的镜像替换与状态迁移”过程,而不是单纯的数据写入。

关键概念:镜像(Image)、清单(Manifest)、签名(Signature)、版本号(Version)、安全启动(Secure Boot)、回滚保护(Rollback Protection)、双槽(Dual Slot)、激活(Activate)、恢复(Recovery)。

二、升级类型与部署形态

TF-M 固件升级可以按升级范围、存储布局和触发方式分类。按升级范围,可分为安全固件升级、非安全固件升级和混合升级;按存储布局,可分为单槽升级、双槽升级和外部存储升级;按触发方式,可分为本地触发升级、远程触发升级和恢复模式升级。

升级类型典型场景优点风险与限制
单槽升级资源受限设备,仅保留一份镜像占用 Flash 小,实现简单升级中断可能导致设备不可启动
双槽升级需要回滚与失败恢复的安全设备支持 A/B 切换,失败可回退Flash 占用翻倍,管理复杂
安全固件升级修复 TF-M 安全漏洞直接提升安全基线验证链必须绝对可信
非安全固件升级更新业务应用频率高,影响范围小需防止越权访问安全资源
混合升级安全与非安全镜像同时更新版本配套一致依赖关系复杂,需原子性保障

在 TF-M 参考实现中,双槽方案更常见于需要回滚保护的场景。设备通常维护“活动槽”和“候选槽”,新镜像先写入候选槽,验证通过后再切换活动槽。若新镜像启动失败,引导程序可根据状态标记回退到旧镜像。

三、安全威胁模型

固件升级是攻击面非常集中的环节。攻击者可能试图植入恶意固件、降级到存在漏洞的旧版本、篡改升级包、伪造签名、阻断升级过程,或利用升级失败后的恢复逻辑获取控制权。TF-M 升级设计需要面对以下主要威胁:

  • 镜像篡改:攻击者修改镜像内容,破坏完整性。
  • 签名伪造:攻击者伪造合法签名,使恶意镜像通过验证。
  • 版本降级:攻击者把设备回退到已知漏洞版本,绕过安全修复。
  • 重放攻击:攻击者重复发送旧版本升级包,诱导设备降级。
  • 中间人攻击:远程升级通道被劫持,升级包被替换。
  • 断电与故障注入:升级过程中断电或注入故障,使设备进入不稳定状态。
  • 回滚计数器篡改:攻击者修改安全版本计数器,绕过回滚保护。

注意:回滚保护不是“禁止回滚”,而是“禁止回滚到低于安全版本基线的镜像”。合法回滚仍可在受控条件下用于故障恢复,但必须受版本策略约束。

四、升级流程总览

TF-M 固件升级流程通常分为准备、传输、验证、写入、激活和确认六个阶段。下图展示了从升级包到镜像激活的总体信号与数据流关系,其中安全启动链负责验证,回滚计数器负责版本约束,双槽管理负责切换与恢复。

TF-M 固件升级流程总览 升级包来源 本地 / 远程 / 恢复模式 传输与接收 分片 / 缓存 / 完整性 镜像验证 签名 / 哈希 / 清单 版本与回滚检查 安全版本计数器 写入候选槽 非活动槽 / 外部存储 激活与切换 更新启动状态标记 启动确认 成功提交 / 失败回滚 失败回滚 安全启动链 BL2 / 签名验证 / 信任根 验证支撑 图例 正常升级流 失败回滚路径 安全启动支撑

从图中可以看出,升级流程并不是单向直线,而是包含验证、版本检查、写入、激活和确认的闭环。安全启动链贯穿始终,回滚路径则保证升级失败时设备仍可回到已知可用状态。

五、典型场景与误区复盘

以一款支持 TF-M 的安全门锁为例,厂商通过远程通道下发新固件,设备先接收升级包并缓存,然后由 BL2 验证签名和清单。验证通过后,镜像写入候选槽,同时检查安全版本计数器,防止降级到旧漏洞版本。设备重启后尝试从候选槽启动,若启动成功,则提交新版本并更新计数器;若启动失败,则回滚到旧槽并上报错误。

升级状态示例:
[BL2] image verify: OK
[BL2] version check: current=5, candidate=6, rollback=5
[BL2] write candidate slot: OK
[BL2] activate: pending
[BL2] boot candidate: OK
[BL2] commit: version=6, rollback=6

实践建议:升级前必须确认安全版本计数器不可被非安全域修改;升级包传输应使用加密通道;候选槽写入完成后应再次校验哈希;启动确认阶段应设置超时与重试策略,避免设备反复重启。

常见误区包括:只做签名验证而不做版本检查,导致降级攻击;把回滚计数器放在普通 Flash 区域,导致被篡改;升级过程中断电后没有恢复策略,使设备变砖;以及把安全固件和非安全固件版本独立管理,造成接口不兼容。TF-M 升级设计强调“验证前置、状态可恢复、版本不可逆”,只有把安全启动、回滚保护和双槽管理结合起来,才能形成完整的升级安全闭环。