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 内部。具体放在哪?我画了一张图,你看完就明白了。

硬件可信根在SoC中的位置 SoC 芯片内部架构 CPU 核心 应用处理器 内存控制器 外设总线 安全执行环境 (TEE/安全域) 硬件可信根 RoT 引擎 安全存储 密钥/证书 BootROM (只读) 安全外设 (TRNG/加密引擎) 安全总线 RoT 位于安全域内,通过专用安全总线与 CPU 和外设隔离

从这张图你能看到,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 不是孤立存在的。它要构建一条完整的信任链,从芯片上电一直延伸到操作系统。我习惯用下面这个模型来理解:

信任链模型 硬件可信根 不可篡改 BootROM 只读,RoT 验证 SPL/BL1 BootROM 验证 操作系统 BL1 验证 每一级只信任上一级的签名,RoT 是整个信任链的起点

这个模型里,每一级只验证下一级的签名。RoT 验证 BootROM,BootROM 验证 SPL,SPL 验证操作系统。只要 RoT 是安全的,整条链就是安全的。反过来,如果 RoT 被攻破,后面所有环节都是白搭。

我的经验:在设计信任链时,尽量让每一级的代码量最小化。BootROM 通常只有几 KB,SPL 几十 KB。代码越少,攻击面越小。我曾经见过一个项目,把整个 U-Boot 都塞进 BootROM,结果一个缓冲区溢出漏洞就让整个安全体系崩溃了。

2.5 RoT 的密钥管理

RoT 的核心资产是什么?密钥。没有密钥,RoT 就是个空壳。密钥怎么放、怎么用、怎么销毁,都有讲究。

我习惯把密钥分为三级:

  1. 根密钥:固化在 RoT 的安全存储中,芯片出厂时一次性烧录。永远不可读出,只能由 RoT 引擎内部调用。
  2. 设备密钥:每个芯片独一无二,由根密钥派生。用于签名验证和会话加密。
  3. 会话密钥:每次启动时动态生成,用于保护运行时通信。

这里有个容易犯的错误——有人把根密钥直接用于签名验证。我见过一个案例,芯片的根密钥是 AES 密钥,但签名算法是 RSA。结果每次签名验证时,RoT 都要把根密钥从安全存储读到临时寄存器,这就给了侧信道攻击可乘之机。正确的做法是:根密钥只用于派生设备密钥,设备密钥再用于签名。

密钥层级 存储位置 生命周期 使用场景
根密钥 RoT 安全存储(eFuse/OTP) 芯片全生命周期 派生设备密钥
设备密钥 RoT 内部寄存器 芯片全生命周期 签名验证、解密
会话密钥 SRAM(临时) 单次启动 运行时加密通信

警告:千万不要把根密钥放在 Flash 或外部 EEPROM 里。我接手过一个项目,他们把根密钥放在 SPI Flash 中,用软件加密存储。结果攻击者直接读 Flash,再配合一个简单的 XOR 解密,密钥就拿到了。记住:RoT 的密钥必须存储在芯片内部的物理安全存储中,比如 eFuse 或 OTP。

2.6 小结

硬件可信根是整个安全启动的基石。它不是一个软件概念,而是一个物理实体。它的位置决定了它的隔离性,它的物理特性决定了它的抗攻击能力。设计 RoT 时,记住三个原则:

  • 不可绕过:RoT 必须是芯片上电后第一个执行的代码。
  • 不可篡改:RoT 的代码和密钥必须在物理上只读。
  • 不可窃取:RoT 的密钥必须通过物理安全机制保护。