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核之间传递消息。这种“按资源分配安全属性”的方式,让一颗芯片能同时承载安全服务与普通应用,而互不越权。

STM32MP 硬件安全结构:TrustZone 世界划分与核间隔离 安全世界 Secure World TF-A / OP-TEE 安全启动 · 密钥管理 安全服务 可信应用 TA 安全外设 / 安全内存 CRYP · HASH · OTP · SRAM 安全区 非安全世界 Non-secure World Linux 内核 驱动 · 文件系统 用户应用 业务逻辑 非安全外设 / 内存 UART · SPI · DDR 非安全区 SMC 硬件隔离与安全控制层 ETZPC 外设安全属性分配 BSEC OTP 读取与熔丝控制 IPCC A核↔M核通信 RCC / TZ 时钟复位安全控制 硬件信任根 Root of Trust Boot ROM(不可修改) 首段执行代码 · 验签入口 OTP 熔丝区 公钥哈希 · 生命周期 · 密钥 FSBL 验签 逐级校验下一阶段镜像

三、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的启动链大致如下:

  1. Boot ROM:芯片上电后执行的第一段代码,固化在芯片内,不可修改。它读取OTP中的公钥哈希,用它验证FSBL的签名。
  2. FSBL(如TF-A BL2):验证通过后运行,负责初始化DDR、加载并验证下一阶段镜像(如OP-TEE、U-Boot)。
  3. OP-TEE / U-Boot:继续验证Linux内核和设备树。
  4. 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烧写要格外谨慎。硬件信任根是整个安全体系的起点,也是量产部署中最不能出错的一环。