3、信任根与信任链:什么是信任根(RoT)、信任链的建立过程,以及从BootROM到应用层的信任传递机制
在Secure Boot的体系架构中,信任不是凭空产生的,而是从一个绝对可信的起点开始,通过逐级验证、逐级授权的方式,将信任范围像链条一样延伸至整个系统。这个起点被称为信任根(Root of Trust, RoT),而信任延伸的路径则被称为信任链(Chain of Trust)。理解信任根与信任链,是设计安全启动方案、分析启动故障、评估系统抗攻击能力的基础。本章将从信任根的定义与形态出发,详细拆解信任链的建立过程,并深入分析从BootROM到应用层的完整信任传递机制。
3.1 信任根(RoT)的核心原理与形态
3.1.1 信任根的定义与本质
信任根是系统中无条件可信的最小集合,它不依赖任何外部实体来验证自身的可信性。在Secure Boot体系中,信任根通常固化在芯片内部的BootROM(只读存储器)中,以及一次性可编程存储器(eFuse/OTP)内。BootROM是芯片出厂时由硅片厂商写入的不可修改代码,它构成了整个信任链的第一环。信任根的本质在于:它必须物理不可变、逻辑不可绕过、内容不可篡改。任何试图修改BootROM的行为都意味着物理破坏芯片,这在绝大多数攻击场景中是不现实的。
3.1.2 信任根的组成要素
一个完整的信任根通常包含以下三个核心要素:
- 不可变代码:BootROM中的启动代码,负责最基础的硬件初始化和引导加载。
- 根密钥材料:存储在eFuse/OTP中的RoT公钥哈希(或公钥本身),用于验证第一级引导程序的签名。
- 安全状态寄存器:记录芯片的安全状态(如是否已锁定调试接口、是否已启用安全启动),这些寄存器只能被BootROM写入,且一旦写入不可逆。
| 信任根组件 | 存储介质 | 不可变性 | 作用 |
|---|---|---|---|
| BootROM代码 | Mask ROM | 物理不可变 | 执行初始引导、验证一级引导程序 |
| RoT公钥哈希 | eFuse/OTP | 一次性烧写,不可回退 | 锁定信任根公钥,防止密钥替换 |
| 安全配置位 | eFuse/OTP | 熔断后不可恢复 | 禁用调试接口、强制安全启动 |
| 版本号计数器 | eFuse/RPMB | 单调递增 | 防止固件回滚攻击 |
3.1.3 信任根的判断方法
在实际嵌入式项目中,判断一个系统是否具备合格的信任根,可以从以下维度进行验证:
- 代码不可改性验证:检查BootROM是否位于Mask ROM中,能否通过任何软件手段修改。
- 密钥存储安全性:确认RoT公钥哈希是否存储在eFuse中,且烧写后无法通过JTAG/SWD等调试接口读取。
- 启动路径唯一性:确保芯片不存在未经验证的备用启动路径(如UART下载模式、USB烧录模式),这些路径必须在量产前被熔断禁用。
- 安全状态锁定:检查安全启动使能位是否已熔断,调试接口是否已永久关闭。
3.2 信任链的建立过程
3.2.1 信任链的逐级验证模型
信任链的建立遵循逐级验证、逐级授权的原则。每一级引导程序在获得执行权之前,必须由上一级完成对其完整性和真实性的验证。验证通过后,当前级才将控制权移交给下一级,同时传递信任。这个过程可以形式化地表示为:
信任根(BootROM) --验证--> 一级引导(SPL) --验证--> 二级引导(U-Boot) --验证--> 内核 --验证--> 应用
每一级验证都包含两个关键步骤:完整性校验(确保镜像未被篡改)和真实性校验(确保镜像来自合法发布者)。完整性通常通过哈希算法(如SHA-256)实现,真实性则通过非对称签名算法(如RSA-2048/ECC-256)实现。
3.2.2 信任链建立的操作流程
以典型的ARM Cortex-A系列嵌入式平台为例,信任链的建立过程如下:
- BootROM阶段:芯片上电后,BootROM首先初始化时钟、SRAM和基本外设,然后从eFuse中读取RoT公钥哈希,并从固定地址(如BootROM映射的SPI Flash起始地址)读取一级引导程序(SPL)及其签名。
- 一级验证:BootROM使用RoT公钥对SPL的签名进行验签,同时计算SPL的哈希值并与签名中的哈希比对。验证通过后,将SPL加载到SRAM并跳转执行。
- 二级引导阶段:SPL初始化DDR控制器,将U-Boot(BL2)从Flash加载到DDR中,并使用SPL内置的公钥(该公钥由RoT公钥签名,形成密钥链)验证U-Boot的签名。
- 内核加载阶段:U-Boot验证内核镜像(如zImage/Image)的签名,验证通过后将内核加载到内存并跳转。
- 应用层验证:内核启动后,通过dm-verity、IMA(完整性度量架构)或文件系统签名验证机制,确保根文件系统和关键应用的完整性。
3.2.3 信任链的密钥体系
信任链的强度依赖于密钥的层级管理。常见的密钥体系包括:
| 密钥层级 | 用途 | 存储位置 | 签名关系 |
|---|---|---|---|
| RoT私钥 | 签名一级引导程序 | HSM/离线安全环境 | 对应eFuse中的公钥哈希 |
| 一级引导私钥 | 签名二级引导程序 | HSM/离线安全环境 | 由RoT私钥签名 |
| 二级引导私钥 | 签名内核 | 构建服务器HSM | 由一级引导私钥签名 |
| 内核私钥 | 签名内核模块/驱动 | 构建服务器HSM | 由二级引导私钥签名 |
3.3 从BootROM到应用层的信任传递机制
3.3.1 信任传递的完整链路
信任传递并非简单的“验证一次就完事”,而是一个贯穿整个启动过程、持续到应用运行时的动态机制。完整的信任传递链路包括:
- 启动时静态信任传递:从BootROM到内核的逐级签名验证,确保启动镜像的完整性和真实性。
- 运行时动态信任传递:内核启动后,通过安全启动扩展(如UEFI Secure Boot、Linux IMA)对后续加载的驱动、模块、脚本进行验证。
- 应用层信任维持:通过文件系统完整性校验(dm-verity)、强制访问控制(SELinux/AppArmor)以及代码签名机制,维持应用运行时的可信状态。
3.3.2 信任传递中的关键机制
在信任传递过程中,有几个关键机制决定了整个链条的安全性:
- 密钥轮换与吊销:当某一级私钥泄露时,需要能够吊销该密钥并轮换新密钥。这通常通过版本号计数器或证书吊销列表(CRL)实现。
- 防回滚机制:攻击者可能尝试使用旧版本的固件(包含已知漏洞)来降级系统。防回滚通过单调递增的版本号计数器实现,每次固件更新时版本号必须递增,BootROM和各级引导程序会检查版本号是否低于当前值。
- 测量启动(Measured Boot):与Secure Boot的“验证后执行”不同,Measured Boot将每个阶段的哈希值记录在TPM(可信平台模块)的PCR(平台配置寄存器)中,系统启动后可以远程证明这些测量值,从而让外部实体确认系统运行在预期的可信状态。
3.3.3 案例拆解:基于i.MX8M Plus的信任链部署
下面以一个典型的工业物联网网关项目为例,说明信任链从BootROM到应用层的完整部署过程。
项目背景与约束:该网关基于NXP i.MX8M Plus处理器,需要满足IEC 62443-4-2安全等级要求,防止固件被篡改、防止非法固件升级、防止调试接口被滥用。系统使用Yocto构建Linux发行版,采用U-Boot作为引导加载程序。
初始状态与目标:设备出厂时,BootROM已由NXP烧录,eFuse中烧写了RoT公钥哈希(SHA-256)。项目目标是在此基础上建立完整的信任链,并确保应用层的关键服务(如MQTT Broker、OTA客户端)也纳入信任体系。
实施步骤:
- 生成密钥对:在离线HSM中生成RoT密钥对(RSA-4096)、一级引导密钥对(RSA-3072)、二级引导密钥对(RSA-3072)和内核密钥对(RSA-2048)。
- 烧写eFuse:将RoT公钥的SHA-256哈希烧写到eFuse中,同时熔断JTAG调试接口和串行下载模式。
- 签名SPL:使用RoT私钥对SPL镜像签名,生成包含签名的SPL镜像。
- 签名U-Boot:使用一级引导私钥对U-Boot镜像签名,并将一级引导公钥嵌入SPL中。
- 签名内核:使用二级引导私钥对内核镜像签名,并将二级引导公钥嵌入U-Boot中。
- 配置dm-verity:在内核中启用dm-verity,对根文件系统进行哈希树校验,防止文件系统被篡改。
- 应用层签名:对关键应用(如OTA客户端)进行代码签名,内核通过IMA在应用启动时验证签名。
验证结果:经过上述部署后,攻击者即使物理接触设备,也无法通过替换SPI Flash中的固件来植入恶意代码,因为BootROM会验证SPL签名。同时,由于JTAG已被熔断,攻击者无法通过调试接口读取内存或篡改运行状态。在OTA升级测试中,使用未签名的固件包进行升级,被U-Boot正确拒绝,并记录安全日志。
风险与代价:该方案的代价是密钥管理复杂度较高,且一旦RoT私钥丢失,将无法进行任何固件更新(需要更换芯片)。此外,每次固件更新都需要在HSM中完成签名,增加了构建流程的复杂度。
3.4 常见误区与总结复盘
3.4.1 常见误区
- 误区一:信任根可以放在外部存储中。部分开发者为了节省成本,将RoT公钥放在外部SPI Flash中,这等于将信任根暴露在物理攻击之下。
- 误区二:只验证启动镜像,不验证运行时。Secure Boot只保证启动过程的信任,但内核启动后加载的驱动、模块和脚本同样可能被篡改,必须配合IMA、dm-verity等运行时验证机制。
- 误区三:忽略防回滚机制。如果没有版本号计数器,攻击者可以降级到存在已知漏洞的旧版本固件,从而绕过安全启动。
- 误区四:调试接口未关闭。即使Secure Boot正常工作,如果JTAG/SWD接口仍然开放,攻击者可以通过调试接口直接读写内存、修改寄存器,完全绕过信任链。
- 误区五:密钥管理不当。将RoT私钥存储在开发者的电脑上,或使用弱密码保护HSM,都会导致信任根被攻破。
3.4.2 总结复盘
信任根与信任链是Secure Boot的基石。信任根必须物理不可变、逻辑不可绕过,而信任链的每一环都必须严格验证下一环的完整性和真实性。从BootROM到应用层的信任传递,不仅包括启动时的静态验证,还包括运行时的动态验证和持续监控。在实际部署中,需要综合考虑密钥管理、防回滚、调试接口关闭、运行时验证等多个维度,才能构建真正可信的嵌入式系统。
- 信任根 = BootROM + eFuse/OTP中的RoT公钥哈希 + 安全状态寄存器。
- 信任链 = 逐级签名验证,每一级验证通过后才移交控制权。
- 信任传递 = 静态验证(启动时)+ 动态验证(运行时)+ 持续监控(应用层)。
- 安全底线 = 信任根不可变、调试接口关闭、防回滚启用、密钥离线管理。