2. 硬件可信根(RoT)基础:RoT的定义、RoT在SoC中的位置、RoT的物理安全特性
聊安全启动,绕不开一个核心概念——硬件可信根。说白了,它就是整个安全体系的「信任原点」。我见过不少工程师,一上来就写安全启动代码,结果发现密钥随便放、校验逻辑能被绕过。为什么?因为没搞明白可信根到底该长什么样。
这一节,我们就把 RoT 的定义、它在 SoC 里的位置,以及它凭什么能「物理上」防篡改,一次性讲透。
2.1 什么是硬件可信根?
硬件可信根,英文叫 Root of Trust,简称 RoT。它是一个绝对可信的、不可篡改的硬件实体。你想想看,整个安全启动链就像一条锁链,每一环都要验证下一环。但锁链总得有个起点吧?这个起点就是 RoT。
我习惯把 RoT 比作「安全世界的创世神」。它不需要被验证,因为它本身就是验证的基准。在 SoC 上电的那一刻,RoT 是第一个执行代码的实体。它负责验证下一级固件(比如 BootROM 或第一级 bootloader)的完整性。
核心定义:硬件可信根是一个在物理上不可篡改、逻辑上不可绕过的安全锚点。它通常包含一组固化在芯片内部的密钥、一个只读的代码执行引擎,以及一组专用的安全存储单元。
这里有个关键点——「不可绕过」。我在一个项目里就踩过这个坑。当时芯片设计时,RoT 的启动路径和普通 CPU 启动路径混在一起,结果攻击者通过一个 JTAG 调试接口,直接跳过了 RoT 的校验逻辑,加载了恶意固件。嗯,从那以后,我每次审查 SoC 设计,第一件事就是确认 RoT 的物理隔离性。
2.2 RoT 在 SoC 中的位置
RoT 不是一颗独立的芯片,它通常被集成在 SoC 内部。具体放在哪?我画了一张图,你看完就明白了。
从这张图你能看到,RoT 并不是随便挂在某个总线上的外设。它位于 SoC 的安全执行环境内,通过专用的安全总线与主 CPU 和普通外设隔离。为什么要这样设计?
我举个例子。假设 RoT 和 CPU 共享同一套总线,攻击者就可以通过 DMA(直接内存访问)来读取 RoT 内部的密钥。我在一个 IoT 芯片的渗透测试中就遇到过类似问题——攻击者利用 USB 控制器发起 DMA 攻击,直接 dump 了安全存储区的内容。所以,物理隔离不是可选项,是必选项。
| 组件 | 与 RoT 的关系 | 安全要求 |
|---|---|---|
| CPU 核心 | RoT 验证 CPU 启动代码 | RoT 必须早于 CPU 启动 |
| BootROM | RoT 的第一段执行代码 | 物理只读,不可更新 |
| 安全存储 | 存放 RoT 的根密钥 | 防物理探针、防侧信道 |
| 加密引擎 | RoT 调用其进行签名验证 | 专用硬件,不共享寄存器 |
| 普通外设 | 与 RoT 完全隔离 | 无 DMA 访问 RoT 路径 |
2.3 RoT 的物理安全特性
光有逻辑隔离还不够。攻击者手里有探针台、激光、电压毛刺发生器——这些物理攻击手段,你都得防。RoT 的物理安全特性,说白了就是「让攻击者拆了芯片也拿不到密钥」。
我总结了几条核心的物理安全特性:
- 防探针保护:RoT 的安全存储区通常覆盖顶层金属网格。一旦有人试图用 FIB(聚焦离子束)或机械探针接触内部走线,网格就会断裂,触发安全擦除。我在一个车规芯片上见过这种设计——他们管它叫「主动屏蔽层」。
- 电压/频率毛刺检测:攻击者经常通过瞬间拉低电压或注入时钟毛刺,让芯片跳过安全检查。RoT 内部集成有独立的电压和频率监测器,一旦检测到异常,立即复位或锁死。
- 温度攻击防护:液氮冷却或高温烘烤,都可能改变芯片的物理特性。RoT 内置温度传感器,超出工作范围就触发安全熔断。
- 光攻击防护:用激光照射芯片的特定区域,可以翻转存储单元的内容。RoT 的存储阵列通常采用光敏检测层,一旦检测到强光照射,立即擦除密钥。
注意:物理安全不是「有就行」,而是「有多强」。我曾经评估过一款号称「军工级」的芯片,结果发现它的防探针网格只覆盖了 60% 的面积。攻击者绕开网格,直接从边缘打孔就拿到了密钥。所以,物理安全覆盖率必须达到 100%,不能留死角。
2.4 RoT 的信任链模型
RoT 不是孤立存在的。它要构建一条完整的信任链,从芯片上电一直延伸到操作系统。我习惯用下面这个模型来理解:
这个模型里,每一级只验证下一级的签名。RoT 验证 BootROM,BootROM 验证 SPL,SPL 验证操作系统。只要 RoT 是安全的,整条链就是安全的。反过来,如果 RoT 被攻破,后面所有环节都是白搭。
我的经验:在设计信任链时,尽量让每一级的代码量最小化。BootROM 通常只有几 KB,SPL 几十 KB。代码越少,攻击面越小。我曾经见过一个项目,把整个 U-Boot 都塞进 BootROM,结果一个缓冲区溢出漏洞就让整个安全体系崩溃了。
2.5 RoT 的密钥管理
RoT 的核心资产是什么?密钥。没有密钥,RoT 就是个空壳。密钥怎么放、怎么用、怎么销毁,都有讲究。
我习惯把密钥分为三级:
- 根密钥:固化在 RoT 的安全存储中,芯片出厂时一次性烧录。永远不可读出,只能由 RoT 引擎内部调用。
- 设备密钥:每个芯片独一无二,由根密钥派生。用于签名验证和会话加密。
- 会话密钥:每次启动时动态生成,用于保护运行时通信。
这里有个容易犯的错误——有人把根密钥直接用于签名验证。我见过一个案例,芯片的根密钥是 AES 密钥,但签名算法是 RSA。结果每次签名验证时,RoT 都要把根密钥从安全存储读到临时寄存器,这就给了侧信道攻击可乘之机。正确的做法是:根密钥只用于派生设备密钥,设备密钥再用于签名。
| 密钥层级 | 存储位置 | 生命周期 | 使用场景 |
|---|---|---|---|
| 根密钥 | RoT 安全存储(eFuse/OTP) | 芯片全生命周期 | 派生设备密钥 |
| 设备密钥 | RoT 内部寄存器 | 芯片全生命周期 | 签名验证、解密 |
| 会话密钥 | SRAM(临时) | 单次启动 | 运行时加密通信 |
警告:千万不要把根密钥放在 Flash 或外部 EEPROM 里。我接手过一个项目,他们把根密钥放在 SPI Flash 中,用软件加密存储。结果攻击者直接读 Flash,再配合一个简单的 XOR 解密,密钥就拿到了。记住:RoT 的密钥必须存储在芯片内部的物理安全存储中,比如 eFuse 或 OTP。
2.6 小结
硬件可信根是整个安全启动的基石。它不是一个软件概念,而是一个物理实体。它的位置决定了它的隔离性,它的物理特性决定了它的抗攻击能力。设计 RoT 时,记住三个原则:
- 不可绕过:RoT 必须是芯片上电后第一个执行的代码。
- 不可篡改:RoT 的代码和密钥必须在物理上只读。
- 不可窃取:RoT 的密钥必须通过物理安全机制保护。