4. TEE与安全启动概述:安全启动的信任链模型(Root of Trust)
安全启动,说白了就是解决一个核心问题:你怎么知道你的设备跑的是你写的代码?
我早年做嵌入式开发时,总觉得这问题有点多余。代码是我烧进去的,还能有假?直到有一次,一个客户拿回一台设备,说系统启动后行为异常。我们查了三天,最后发现是 bootloader 被替换成了恶意版本。嗯,从那以后,我再也不敢轻视安全启动。
这一节,我们来聊聊安全启动的根基——信任链模型,以及它和 TEE 的关系。
4.1 信任链:从第一行代码开始
安全启动的核心思想,是逐级验证。你想想看,设备上电后,CPU 执行的第一条指令来自 ROM。ROM 是只读的,出厂后改不了。这就是整个信任链的起点——硬件信任根(Root of Trust, RoT)。
从 RoT 开始,每一级代码在加载下一级之前,都要先验证它的签名。验证通过,才把控制权交出去。这样,即使中间某一级被篡改,也能在加载前发现并阻止。
信任链的核心原则:
- 不可篡改的起点:RoT 必须是硬件固化的,无法被软件修改。
- 逐级验证:每一级只信任上一级,并验证下一级。
- 失败即停止:任何一级验证失败,系统必须停止启动或进入安全恢复模式。
下面这张图,是我在项目中经常用来跟团队解释信任链的。它把整个启动过程串起来了。
4.2 信任根的具体实现
信任根不只是一个概念。在真实芯片上,它通常由以下几部分组成:
| 组件 | 作用 | 是否可改 |
|---|---|---|
| ROM Code | 芯片上电后执行的第一段代码,负责初始化硬件并加载 BootROM | 不可改(掩膜固化) |
| eFuse / OTP | 一次性可编程存储,用于存放根公钥哈希、芯片唯一ID等 | 只能从 0 烧写为 1,不可擦除 |
| 安全存储 | 存放私钥、证书、设备密钥等敏感数据 | 受硬件保护,软件无法直接读取 |
| 硬件加密引擎 | 提供 RSA/ECC 签名验证、哈希计算等硬件加速 | 不可绕过 |
避坑指南: 我曾经在一个项目中,把根公钥直接编译进了 BootROM 的代码里。结果发现,ROM 空间太小,放不下完整的 RSA 2048 公钥。后来改用 eFuse 存储公钥的 SHA256 哈希,ROM 里只放验证逻辑。这样既省空间,又保证了灵活性。
4.3 信任链与 TEE 的交汇
你可能会问:安全启动和 TEE 有什么关系?
关系大了。TEE 本身也是一个独立的执行环境,它也需要自己的安全启动。而且,TEE 的启动通常是在主系统启动过程中完成的。
典型的流程是这样的:
- BootROM 验证并加载 SPL。
- SPL 验证并加载 U-Boot。
- U-Boot 同时验证 Linux 内核 和 TEE 镜像(如 OP-TEE)。
- TEE 镜像被加载到安全内存区域,由 Monitor 模式 或 EL3 保护。
- Linux 内核启动后,通过 SMC 指令 与 TEE 通信。
这里有个关键点:TEE 的镜像必须和内核一起被验证。如果只验证内核不验证 TEE,攻击者可以替换 TEE 镜像,从而窃取安全世界的数据。
注意: 我见过一个案例,某厂商只对内核签名,TEE 镜像直接明文存储在文件系统中。结果攻击者修改了 TEE 镜像,植入了后门。所有安全应用的数据全部泄露。记住:信任链必须覆盖所有可执行代码,包括 TEE。
4.4 信任链的扩展:多级与多核
现代 SoC 越来越复杂,信任链也在扩展。比如:
- 多级 Bootloader:有些芯片有 3 级甚至 4 级 bootloader,每一级只做一件事——验证下一级。
- 多核启动:主核启动后,再验证并启动其他核心(如 DSP、GPU、NPU)。每个核心的固件都需要签名。
- 安全域隔离:TEE 和 REE 各自有独立的信任链,互不干扰。
下面这个表格,对比了单级信任链和多级信任链的差异:
| 特性 | 单级信任链 | 多级信任链 |
|---|---|---|
| 启动速度 | 快(验证次数少) | 慢(每级都要验证) |
| 安全性 | 低(单点突破即全盘崩溃) | 高(每级独立验证) |
| 灵活性 | 差(代码必须全部固化) | 好(可动态更新中间级) |
| 实现复杂度 | 低 | 高(需要管理多级密钥) |
4.5 实际项目中的信任链设计
我个人习惯在设计信任链时,遵循以下几个原则:
- 最小化信任根:ROM 代码越少越好,减少攻击面。
- 密钥分级:根密钥只用于签名中间级证书,中间级证书再签名实际镜像。这样即使中间级泄露,根密钥仍然是安全的。
- 回滚保护:在 eFuse 中记录版本号,防止攻击者降级到有漏洞的旧版本。
- 硬件加速:签名验证一定要用硬件引擎,软件实现太慢,而且容易受到时序攻击。
一个典型的信任链密钥体系:
根密钥 (RSA 4096, 存储在HSM中)
└── 中间级证书 (RSA 2048, 用于签名Bootloader)
├── Bootloader A 镜像签名
├── Bootloader B 镜像签名
└── 内核/TEE 镜像签名
这样,即使中间级证书泄露,我们只需要吊销它,重新签发一个新的即可。根密钥不用动。
4.6 小结
安全启动的信任链模型,是整个系统安全的基石。它从硬件信任根开始,逐级验证,确保每一行代码都是可信的。TEE 作为安全世界,也必须纳入这条信任链中。
嗯,这一节的内容就到这里。记住一句话:信任不能传递,只能验证。