信任根与信任链:硬件信任根(RoT)、信任链的建立、从Boot到OS的度量过程
聊远程证明,绕不开一个最基础的问题:凭什么相信一个设备是它自己?
你想想看,一个设备从按下电源键到操作系统跑起来,中间要经历多少步?引导加载程序、内核、驱动、服务……每一步都可能被篡改。如果第一步就不安全,后面所有的证明都是空中楼阁。
所以,我们需要一个信任根,然后沿着启动过程一级一级建立信任链。这是我做物联网安全项目时,最常跟团队强调的底线思维。
1. 硬件信任根(RoT):一切信任的起点
信任根,说白了就是一个绝对可信的锚点。它必须是一个不可篡改、不可绕过的硬件实体。我个人习惯把它比喻成「保险箱的锁芯」——锁芯本身必须是安全的,否则整个保险箱都是摆设。
核心要求:信任根必须满足三个条件——不可伪造、不可篡改、不可绕过。
在实际项目中,常见的硬件信任根有这几种:
| 类型 | 载体 | 典型应用 | 我的经验 |
|---|---|---|---|
| TPM | 独立安全芯片 | PC、服务器 | 兼容性好,但成本高 |
| TEE | SoC内置安全区 | 手机、IoT设备 | 性能好,但依赖芯片厂商 |
| eFuse / OTP | 芯片内一次性存储 | 低成本MCU | 烧录后不可改,适合存储根密钥 |
| HSM | 专用硬件加密模块 | 金融、工业控制 | 安全性最高,但体积和功耗大 |
嗯,这里要注意:信任根不只是一个芯片,而是一个完整的硬件安全边界。我曾经在一个智能门锁项目里,客户坚持用软件模拟TPM,结果被侧信道攻击直接提取了私钥。从那以后,我对「纯软件信任根」一直持保留态度。
2. 信任链的建立:从Boot到OS的度量过程
有了信任根,下一步就是怎么把信任传递下去。这个过程叫信任链,也叫安全启动链。
它的核心逻辑很简单:前一级度量并验证后一级的完整性,验证通过后才把控制权交给后一级。每一级都像接力赛一样,把信任棒交给下一棒。
避坑指南:我曾经在一个网关项目里,只度量了Bootloader和内核,跳过了设备树和固件配置分区。结果攻击者篡改了设备树中的内存映射,绕过了内核的安全检查。记住:信任链必须覆盖所有可执行代码和关键配置数据。
2.1 典型的度量流程
以ARM TrustZone + TPM的典型架构为例,信任链的建立大致分这几步:
- ROM Code(不可变):芯片上电后,首先执行固化在ROM中的代码。它度量Bootloader的第一阶段(BL1)的哈希值,与存储在eFuse中的黄金哈希比对。
- BL1(第一阶段引导):验证通过后,控制权交给BL1。BL1度量BL2(第二阶段引导)的完整性。
- BL2(第二阶段引导):BL2度量Bootloader(如U-Boot)的完整性。
- Bootloader:Bootloader度量内核镜像、设备树、initramfs的完整性。
- 内核:内核度量关键内核模块、安全策略、关键服务的完整性。
- 操作系统:操作系统度量用户空间的关键服务(如SSH、认证服务)的完整性。
你看,每一级都只信任前一级,而前一级又只信任更前一级。最终,所有信任都归结到那个不可篡改的硬件信任根上。
2.2 度量什么?怎么度量?
度量不是简单算个哈希就完事。我建议至少包含以下内容:
- 代码完整性:可执行文件的哈希值
- 配置完整性:关键配置文件的哈希值
- 版本信息:防止回滚攻击
- 度量日志:记录所有度量事件的顺序和结果
度量结果通常存储在TPM的平台配置寄存器(PCR)中。PCR有一个重要特性:只能扩展,不能重置。这意味着攻击者无法伪造度量历史。
警告:千万不要把度量日志和PCR值放在同一个存储区域。我曾经见过一个设计,度量日志和PCR值都存储在同一个Flash分区,攻击者篡改日志后,直接重置了PCR值。正确的做法是:PCR值存储在TPM内部,度量日志存储在外部,但日志的完整性由PCR值保护。
3. 信任链的SVG流程图
下面这张图展示了从硬件信任根到操作系统的完整信任链建立过程。我特意把每个阶段的度量动作和控制流分开画,方便你理解。
4. 信任链的常见陷阱与应对
做了这么多年安全,我总结了几条信任链设计中的「坑」,分享给你:
| 陷阱 | 表现 | 我的建议 |
|---|---|---|
| 度量不全 | 只度量代码,忽略配置和数据 | 建立完整的度量清单,覆盖所有可执行区域 |
| 回滚攻击 | 攻击者用旧版本替换新版本 | 在度量中加入版本号,PCR扩展时包含版本信息 |
| 日志篡改 | 攻击者修改度量日志掩盖攻击 | 日志的完整性由PCR值保护,日志与PCR分离存储 |
| 信任根泄露 | 硬件信任根的私钥被提取 | 使用防篡改封装,启用物理安全机制(如主动屏蔽层) |
个人经验:我在一个车联网项目里,发现攻击者通过JTAG接口直接读取了信任根的密钥。解决方案很简单:量产时熔断JTAG保险丝。这个操作成本极低,但很多团队会忽略。
5. 信任链与远程证明的关系
你可能会问:信任链和远程证明有什么关系?
关系大了。远程证明的核心就是向验证方证明设备的当前状态是可信的。而这个「可信」的基础,就是信任链在启动过程中建立的度量证据。
具体来说:
- 信任链负责在本地建立信任(启动时度量)
- 远程证明负责向远程验证方展示信任(提供度量证据)
没有信任链,远程证明就是无源之水。你拿什么证明你的设备是干净的?