TrustZone 把一颗 CPU 切成安全世界和正常世界,但这个“切分”本身凭什么是可信的?答案在启动的那几百毫秒里:安全启动链(Secure Boot Chain)从芯片上电那一刻起,一级一级验证签名,只有验过的代码才能拿到控制权,任何一级被篡改都会让启动停在当场。

信任的起点是 Boot ROM——一小段烧死在芯片里的代码,无法改写,也就无法被替换。Boot ROM 只干两件事:初始化最小硬件,验证下一级固件的数字签名;签名用的公钥哈希(ROTPK)事先烧在 OTP 熔丝里,熔丝一旦烧断就改不了,攻击者换一把密钥也骗不过校验。验证通过,控制权交给 BL2;BL2 再验证 BL31(运行在 EL3 的安全监控固件)和 BL32(可信操作系统,如 OP-TEE),然后由 BL31 加载并验证 BL33,也就是 U-Boot 或 UEFI 这类非安全世界的引导程序。每一级只信任上一级验证过的内容,这条“信任链”(Chain of Trust)就是安全启动的全部逻辑。

要注意两个常被混淆的概念。安全启动(Secure Boot)管的是“只允许签过名的代码运行”,验不过就拒绝启动;度量启动(Measured Boot)管的是“把每一级代码的哈希值记下来”,启动照常进行,但远程服务器可以拿着这份度量值判断设备是否被改过——一个是门禁,一个是体检报告,两者常配合使用。

工程上有三个坑值得记牢。第一,密钥管理是命脉:签名私钥一旦泄露,整条信任链等于作废,私钥必须离线保管,轮换规划要提前做。第二,熔丝烧写不可逆:ROTPK 烧错了没有后悔药,量产前必须在样机上把整条链路跑通。第三,调试口要关:JTAG/SWD 一旦留在量产机上敞开,攻击者可以直接绕过启动链读内存,前面所有的签名校验等于白做。安全启动不是一个功能点,而是一整条从硅片到操作系统的信任约定。

这条链还有两个配套机制经常被忽略。一个是固件防回滚:每一级固件都带版本号,烧在熔丝或安全存储里的最低版本号只升不降,哪怕攻击者拿到旧版签过名的固件,也因为版本号低于门槛而无法刷回去利用已知漏洞。另一个是固件更新流程:量产后的升级包同样要走签名校验,更新时先写备用分区、校验通过后再切换启动分区,断电也不至于变砖——这和消费电子的 A/B 分区升级是同一个思路,只是每一环都多了签名校验。ARM 的参考实现 TF-A(Trusted Firmware-A)把 BL1、BL2、BL31 这套分工做成了开源代码,芯片厂商在此基础上裁剪适配;但要注意,TF-A 只是“参考”,每家芯片的 Boot ROM 细节、熔丝布局、密钥烧录流程都不一样,照搬别家的启动流程到自己的板子上,是量产时最常见的翻车点。