4. 信任根与信任链
在 TrustZone 安全启动体系中,信任根(Root of Trust, RoT)是整个安全能力的起点。它并不是某个单独寄存器或某段代码,而是一组“不可被外部随意修改、且其行为可被预期”的最小可信组件集合。信任链(Chain of Trust)则是从信任根出发,逐级度量、验证并移交控制权的过程。理解信任根与信任链,是掌握安全启动、固件度量、远程证明与动态可信执行环境的基础。
一、信任根的定义与组成
信任根通常由三部分构成:可信根存储(RTS)、可信根度量(RTM)和可信根验证(RTV)。RTS 保存不可篡改的密钥或摘要,例如 BootROM 中固化的公钥哈希;RTM 负责对下一级镜像做第一次度量;RTV 则使用 RTS 中的密钥或摘要验证度量结果。三者共同保证“起点不可变、过程可追溯、结果可验证”。
在 TrustZone 场景中,信任根往往落在 BootROM 与安全引擎(如 CryptoCell、CAAM)中。BootROM 是芯片流片时固化的只读代码,攻击者无法通过软件改写;安全引擎提供密钥派生、签名验证和真随机数。二者结合,形成硬件级信任锚点。
核心结论:信任根不是“一段代码”,而是“不可变存储 + 度量逻辑 + 验证密钥”的组合。缺少任意一项,信任链都无法成立。
二、信任链传递机制
信任链的传递遵循“先验证、后执行、再移交”的原则。以典型 ARM TrustZone 启动流程为例:BootROM 首先验证 BL1(第一阶段引导)的签名,验证通过后将控制权交给 BL1;BL1 再验证 BL2,BL2 验证 BL31(安全监控固件)与 BL33(非安全引导加载程序),最终由 BL31 建立安全世界与非安全世界的隔离环境。
每一级都执行相同动作:读取下一级镜像、计算摘要、用上一级公钥验证签名、记录度量值、跳转执行。若任一级验证失败,启动流程应进入安全恢复或停机状态,而不是继续执行。这种“逐级信任、逐级传递”的结构,使攻击者必须同时攻破所有层级才能篡改最终运行态。
三、度量与验证:信任链的“证据”机制
度量(Measurement)与验证(Verification)是信任链的两个关键动作。度量是对镜像做密码学哈希,生成固定长度的摘要;验证是用公钥解密签名并与摘要比对。度量解决“记录了什么”,验证解决“是否可信”。
在工程实现中,度量结果通常写入 PCR(Platform Configuration Register)。PCR 采用扩展操作:PCR_new = Hash(PCR_old || measurement)。这种单向扩展保证历史度量不可被抹除,任何一级镜像变化都会导致最终 PCR 值不同。远程证明时,验证方只需比对预期 PCR 值,即可判断设备是否运行在可信状态。
# 典型度量与验证伪代码
measurement = SHA256(bl2_image)
if verify_signature(bl2_image, bl1_pubkey) == FAIL:
enter_recovery_mode()
pcr_extend(PCR[2], measurement)
jump_to(bl2_entry)
四、静态信任根与动态信任根对比
静态信任根(Static RoT)在设备上电时建立,其度量范围覆盖 BootROM、BL1、BL2、BL31 等启动阶段。它保证“启动过程可信”,但一旦系统进入运行态,静态信任根无法持续监控后续加载的应用或驱动。动态信任根(Dynamic RoT)则在运行态持续度量,例如对内核模块、安全服务、TA(Trusted Application)进行加载时验证,确保运行态不被篡改。
| 对比维度 | 静态信任根 | 动态信任根 |
|---|---|---|
| 建立时机 | 上电启动阶段 | 系统运行阶段 |
| 度量对象 | BootROM、BL1、BL2、BL31 | 内核模块、TA、安全服务 |
| 核心目标 | 保证启动镜像完整 | 保证运行态持续可信 |
| 典型技术 | Secure Boot、签名验证 | IMA、DM-Verity、TEE 动态加载 |
| 局限性 | 无法覆盖运行态变化 | 依赖静态根提供初始可信环境 |
五、案例场景:一次 BL2 验证失败复盘
某设备在量产阶段出现小概率启动失败。日志显示 BL1 验证 BL2 时签名比对失败,但 BL2 镜像哈希与发布版本一致。进一步排查发现,BL1 使用的公钥来自 OTP 区域,而部分批次 OTP 烧录时公钥哈希被写入了错误偏移。由于 BootROM 只校验 OTP 中公钥的哈希,不校验偏移,导致 BL1 读取到错误公钥,验证必然失败。
复盘要点:信任根不仅要求“密钥正确”,还要求“密钥存储位置与读取路径正确”。OTP 偏移、生命周期状态、读保护配置都属于信任根的一部分,任何一项出错都会导致信任链在起点断裂。
六、常见误区与工程建议
- 误区一:把信任根等同于 BootROM。BootROM 只是载体,真正的信任根还包括 OTP 中的密钥哈希、安全引擎的验证逻辑以及生命周期状态。
- 误区二:只做验证不做度量。验证保证当前镜像可信,度量保证历史过程可审计。远程证明依赖度量日志,缺少度量则无法向第三方证明设备状态。
- 误区三:静态信任根建立后不再关注运行态。静态根只覆盖启动阶段,运行态仍需动态度量与访问控制配合。
- 建议:在工程中把信任根配置、OTP 烧录、密钥轮换、PCR 预期值管理纳入同一套配置管理流程,避免“代码正确、配置错误”的隐性故障。
信任根与信任链的本质,是把“信任”从主观判断转化为可验证的密码学证据。静态信任根解决启动阶段的完整性,动态信任根解决运行阶段的持续性,二者结合才能构成完整的 TrustZone 安全启动与可信执行基础。