1. 课程导入
在物联网与嵌入式安全领域,设备固件一旦发布,就不可避免地面临漏洞修复、功能迭代与安全策略更新。TF-M(Trusted Firmware-M)作为 Arm 平台安全架构的重要开源实现,为 Cortex-M 系列 MCU 提供了可信执行环境、安全启动、安全存储与安全固件升级能力。本课程聚焦其中最具工程挑战性的主题之一:安全固件升级与回滚保护。它解决的不是“如何把新固件写进去”这么简单的问题,而是如何在不可信网络、断电、恶意降级、镜像篡改等条件下,仍然保证设备只运行经过授权且版本正确的固件。
一、核心价值:为什么回滚保护是安全升级的“另一半”
很多开发者第一次接触固件升级时,关注点集中在“传输可靠性”和“写入完整性”。但在安全视角下,升级系统必须同时回答三个问题:镜像是否可信?版本是否允许?失败后能否恢复? 如果只做签名验证而不做回滚保护,攻击者可以合法签名一个旧版本固件,利用已知漏洞重新刷入设备,这就是典型的降级攻击。回滚保护通过安全计数器、版本号与不可逆状态记录,确保设备拒绝低于当前安全版本的镜像。
TF-M 将升级与回滚保护建立在信任链之上:从不可变的 Boot ROM 开始,逐级验证 BL2、安全固件与不可信固件。升级镜像通常以 MCUboot 格式封装,包含镜像头、TLV 区域、签名与安全计数器。BL2 在启动或升级时执行验证,只有通过验证且版本合法的镜像才会被激活。这种设计使升级不再是“覆盖写”,而是一次受控的状态迁移。
二、整体知识框架:四层结构
本课程的知识框架可以划分为四层。第一层是信任根与启动链,包括 Boot ROM、BL2、安全分区与不可信分区的划分,理解“谁验证谁”是后续所有机制的基础。第二层是镜像格式与签名,重点掌握 MCUboot 镜像头、TLV 区域、哈希与签名算法,以及镜像清单如何绑定版本与安全计数器。第三层是回滚保护机制,包括安全计数器存储、版本比较规则、防降级策略与不可逆状态管理。第四层是升级与恢复流程,涉及 PSA Firmware Update API、A/B 分区或暂存区方案、试运行确认与失败回滚。
| 层次 | 核心对象 | 关键问题 | 典型输出 |
|---|---|---|---|
| 信任根与启动链 | Boot ROM、BL2、安全分区 | 信任从哪里开始?如何逐级验证? | 启动链验证通过/失败日志 |
| 镜像格式与签名 | MCUboot Image、TLV、ECDSA | 镜像是否完整?签名是否有效? | 镜像验证结果与哈希值 |
| 回滚保护机制 | 安全计数器、版本号、NV 存储 | 版本是否允许?能否被降级? | 版本比较结论与计数器状态 |
| 升级与恢复流程 | PSA FWU API、A/B 分区、暂存区 | 升级失败后如何恢复? | 激活成功或自动回滚记录 |
三、方法流程:一次安全升级的完整链路
从工程实现角度看,一次安全升级通常包含以下步骤:镜像构建与签名、镜像传输与暂存、BL2 验证与版本检查、试运行与确认、失败回滚。下面是一段典型的镜像签名与版本信息查看命令,帮助建立直观认识:
# 使用 imgtool 为 TF-M 镜像签名并写入安全计数器
imgtool sign \
--key root-ec-p256.pem \
--align 8 \
--version 2.1.0 \
--security-counter 12 \
--pad-header \
tfm_s.bin tfm_s_signed.bin
# 查看镜像头与 TLV 信息
imgtool dumpinfo tfm_s_signed.bin
其中 --version 表示固件语义版本,--security-counter 表示安全计数器。设备端在验证镜像时,会同时检查签名有效性与安全计数器是否大于等于当前存储值。若攻击者试图刷入 security-counter=8 的旧镜像,即使签名合法,也会被拒绝激活。
四、案例与场景:智能门锁的升级失败恢复
假设一台智能门锁通过 OTA 升级新固件。升级过程中设备突然断电,新镜像只写入了一半。重新上电后,BL2 发现暂存区镜像哈希不匹配,签名验证失败,于是放弃激活,继续运行旧固件。用户重新发起升级,这次镜像完整且安全计数器为 15,高于当前 14,验证通过后进入试运行。若试运行期间应用无法正常启动,看门狗触发回滚,设备恢复到旧版本并上报升级失败事件。这个场景说明:安全升级的目标不是“一定升级成功”,而是“任何失败都不会让设备变砖或降级”。
五、常见误区与复盘
- 误区一:签名验证等于回滚保护。 签名只证明镜像来源可信,不能阻止合法旧版本被重新刷入,必须配合安全计数器与版本策略。
- 误区二:安全计数器可以随意回写。 安全计数器通常存储在受保护的 NV 区域,写入具有单向递增特性,不能依赖普通 Flash 模拟。
- 误区三:升级失败就是回滚成功。 回滚需要旧镜像仍然完整可用,且 BL2 能正确识别回滚条件,否则可能停留在不可启动状态。
- 误区四:只测试成功路径。 断电、镜像截断、签名错误、版本过低、计数器不匹配等异常路径,才是安全升级测试的重点。