2. STM32MP硬件安全基础
STM32MP系列(如STM32MP157、STM32MP135)与普通MCU最大的区别,在于它把“安全”做成了硬件结构的一部分,而不是靠软件补丁堆出来的。理解这套硬件安全基础,是后续做安全升级、设备维护和量产部署的前提。本节围绕四个相互咬合的硬件机制展开:TrustZone架构、Cortex-A与Cortex-M核间安全隔离、OTP与BSEC、以及安全启动链的硬件信任根。
一、TrustZone:把一颗芯片切成两个世界
TrustZone是Arm的一项硬件安全扩展。在STM32MP的Cortex-A核上,它把处理器的运行环境划分为两个“世界”:安全世界(Secure World)和非安全世界(Non-secure World)。两个世界可以运行各自的代码、访问各自的内存和外设,硬件层面强制隔离,非安全世界无法直接读取安全世界的资源。
需要特别澄清一个常见误解:TrustZone并不是“双核”,它是同一颗Cortex-A核在时间维度上切换两种状态。CPU通过一个叫NS位(Non-Secure bit)的信号标记当前处于哪个世界,总线、内存控制器、外设都根据这个位判断是否放行访问。切换世界通过SMC(Secure Monitor Call)指令进入安全监控程序(Secure Monitor),由它完成上下文保存与切换。
在STM32MP上,典型的分工是:安全世界运行TF-A(Trusted Firmware-A)和OP-TEE,负责密钥管理、安全启动校验、可信服务;非安全世界运行Linux和用户应用。这样即使Linux被攻破,攻击者也拿不到安全世界里的密钥。
二、Cortex-A与Cortex-M的核间安全隔离
STM32MP157这类异构芯片同时集成了Cortex-A7(跑Linux)和Cortex-M4(跑实时任务)。两者共享内存和外设,但安全属性可以分别设定。核间隔离的关键在于ETZPC(Extended TrustZone Protection Controller)和RCC/TZ等控制器:它们为每个外设和每段内存分配“安全/非安全/共享”属性。
举例来说,可以把某个IP(如CRYP加密外设)配置为仅安全世界可访问,那么Cortex-M4若运行在非安全状态就无法直接操作它,必须通过安全世界的服务接口。反过来,也可以把一段共享内存(如通过IPCC核间通信通道)设为双方可访问,用于A核与M核之间传递消息。这种“按资源分配安全属性”的方式,让一颗芯片能同时承载安全服务与普通应用,而互不越权。
三、OTP与BSEC:一次性写入的硬件信任锚点
OTP(One-Time Programmable)是芯片内部一段只能写一次、之后永久保持的存储区。它不像Flash可以擦除重写,一旦某个bit被烧成1,就再也回不到0。STM32MP的OTP区存放着几类关键信息:
- 安全启动公钥哈希:Boot ROM用它来验证FSBL(第一阶段引导程序)的签名,这是信任链的起点。
- 生命周期状态:如“开放”“安全闭合”“量产”等,决定芯片当前允许哪些操作。
- 密钥材料:部分派生密钥的种子,用于加密存储或安全通信。
BSEC(Boot and Security Control)是管理OTP的硬件控制器。它负责在启动时把OTP内容读出来,提供给Boot ROM和后续阶段使用;同时提供接口让安全世界在受控条件下读取OTP状态。注意:OTP的写入是不可逆的,量产时一旦烧错,芯片可能直接报废。因此实际产线中,OTP烧写通常放在最后阶段,并且要有校验和回读确认。
四、安全启动链:从Boot ROM到操作系统
安全启动的核心思想是“逐级验证、信任传递”。STM32MP的启动链大致如下:
- Boot ROM:芯片上电后执行的第一段代码,固化在芯片内,不可修改。它读取OTP中的公钥哈希,用它验证FSBL的签名。
- FSBL(如TF-A BL2):验证通过后运行,负责初始化DDR、加载并验证下一阶段镜像(如OP-TEE、U-Boot)。
- OP-TEE / U-Boot:继续验证Linux内核和设备树。
- Linux内核:启动后,安全世界仍可通过OP-TEE提供可信服务。
每一级都用自己的公钥验证下一级的签名,形成一条完整的信任链。只要Boot ROM和OTP中的公钥哈希没有被篡改,整条链就是可信的。这里的关键参数是签名算法(通常为ECDSA P-256或RSA-2048)和哈希算法(SHA-256)。在STM32MP的官方工具链中,可以用STM32_SigningTool对镜像签名,并把公钥哈希烧入OTP。
示例:签名与OTP烧写的关键命令(示意)
# 1. 生成密钥对
STM32_KeyGen -p ECDSA -a P-256 -o key.pem
# 2. 对FSBL镜像签名
STM32_SigningTool -bin fsbl.bin -key key.pem -o fsbl_signed.bin
# 3. 计算公钥哈希并烧入OTP
STM32_OTP_Tool -pubkey key.pem -hash sha256 -write 0x18
上述命令为教学示意,实际参数以所用STM32MP型号的官方工具版本为准。
注意:OTP烧写不可逆。在量产前,务必在开发板上完整验证签名、烧写、启动流程,确认公钥哈希与镜像匹配无误后,再进入产线批量烧录。建议保留至少一片未烧写的“黄金样片”用于对比排查。
五、四者如何协同工作
把这四个机制串起来看:OTP提供不可篡改的信任锚点,BSEC负责读取和管理OTP,Boot ROM用OTP中的公钥哈希验证第一级镜像,TrustZone在运行时把安全世界和非安全世界隔开,ETZPC等控制器则把这种隔离落实到具体外设和内存上。Cortex-A与Cortex-M的核间隔离,本质上也是这套安全属性分配机制在异构核上的延伸。
理解这套硬件基础后,后续做安全升级时就能明白:为什么升级包必须签名、为什么密钥不能放在Linux文件系统里、为什么OTP烧写要格外谨慎。硬件信任根是整个安全体系的起点,也是量产部署中最不能出错的一环。