TEE 安全架构:信任根、安全启动链与生命周期管理
聊到 TEE 的安全架构,我习惯先看三个东西:信任从哪来、信任怎么传递、信任怎么保持。说白了,就是信任根、安全启动链、安全生命周期管理。这三件事搞不清楚,后面做密钥管理和权限隔离就是空中楼阁。
2.1 信任根(Root of Trust, RoT)
信任根是整个 TEE 安全的基石。你想想看,如果最底层的东西都不可信,上面盖再多层也没用。
在 TEE 里,信任根通常固化在硬件里。我见过不少项目,芯片一回来先测的就是 RoT 是不是真的「不可篡改」。常见的信任根载体有:
- OTP(一次性可编程存储器)——出厂烧录,之后谁也别想改
- eFuse——熔丝方案,熔断后物理上不可恢复
- ROM 代码——掩膜 ROM,只读,改不了
信任根的核心职责:
- 提供硬件唯一身份(Device Unique Secret)
- 存储根密钥(Root Key)
- 验证第一段启动代码的签名
我个人习惯把信任根比作「保险箱的锁芯」。锁芯本身必须是出厂焊死的,不能让人从外面换掉。我在一个 IoT 项目里遇到过,某厂商把根密钥放在 Flash 里,结果被物理攻击直接读出来了……嗯,那项目后来全量召回重做。
2.2 安全启动链(Secure Boot Chain)
有了信任根,接下来就是怎么把信任一级一级传递下去。这就是安全启动链要干的事。
安全启动链的流程,说白了就是「一级验一级」:
- ROM 代码(信任根)验证 Bootloader 的签名
- Bootloader 验证 TEE 内核的签名
- TEE 内核 验证可信应用(TA)的签名
- TA 在受保护环境中运行
每一级只信任上一级签过名的东西。中间任何一级验证失败,启动就停在那里。我曾经调试过一个启动卡死的问题,查了两天才发现是 Bootloader 的签名算法版本和 ROM 里硬编码的不一致——这种坑,设计阶段就得想清楚。
避坑指南:我曾经在项目里看到团队把公钥硬编码在 ROM 里,但没留升级路径。后来算法需要升级,整个芯片只能报废。建议在设计时预留 OTP 区域的更新机制,哪怕只是「熔断后不再更新」的开关。
2.3 安全生命周期管理
芯片从出厂到退役,经历多个安全状态。每个状态能做什么、不能做什么,都得严格定义。我习惯把生命周期分成这几个阶段:
| 阶段 | 状态 | 可操作内容 | 安全等级 |
|---|---|---|---|
| 芯片制造 | 测试模式 | 功能测试、扫描链 | 低(未锁) |
| 固件烧录 | 开发模式 | 烧录密钥、调试接口开放 | 中 |
| 产线部署 | 生产模式 | 烧录设备证书、关闭调试 | 高 |
| 设备运行 | 安全模式 | 仅运行签名的 TA | 最高 |
| 设备退役 | 销毁模式 | 擦除密钥、禁用芯片 | 不可逆 |
这里有个关键点:生命周期状态转换通常是单向的。从生产模式回退到开发模式?不行,熔丝断了就是断了。我在一个车规项目里见过,产线误操作把芯片锁死,整批 5000 片直接报废——就是因为没做好状态转换的防呆设计。
注意:生命周期管理中最容易出问题的就是「调试接口」。很多芯片在开发阶段会开放 JTAG/SWD,但量产时忘了关闭。攻击者只要接上调试器,整个 TEE 就形同虚设。我建议在产线部署环节,必须做一次「调试接口关闭验证」的自动化测试。
2.4 三者关系:一张图说清楚
下面这张图是我自己画的结构,把信任根、安全启动链、生命周期管理串在一起。你看完应该能明白,这三件事不是孤立的,而是一个闭环。
2.5 实践中的常见误区
做 TEE 安全架构这几年,我踩过不少坑,也看过别人踩坑。总结几个最常见的:
- 信任根选型太随意——有人用 Flash 存根密钥,觉得加个读保护就行。物理攻击面前,读保护就是个笑话。
- 启动链验证不完整——只验了 Bootloader,没验 TA 签名。攻击者直接替换 TA 就能提权。
- 生命周期状态没锁死——生产模式还能进调试接口。这相当于你家大门锁了,但窗户开着。
- 密钥和生命周期耦合太紧——状态变了,密钥没跟着变。旧密钥还能用,那状态转换的意义在哪?
我的建议:做架构设计时,先把这三件事画成状态机。每个状态定义清楚:谁可信、谁不可信、密钥在哪、调试口开不开。画完你就知道哪里可能出问题了。