信任根与信任链:硬件信任根(RoT)、信任链的建立与传递、TPM/TEE在信任链中的作用

聊到设备安全,我经常被问到同一个问题:“到底从哪开始信任?”

你想想看,一个系统从上电到跑起操作系统,中间经历了多少步?Bootloader、内核、驱动、服务……每一步都可能被篡改。如果连第一步都不安全,后面全是白搭。

这就是我们今天要聊的核心——信任根(Root of Trust, RoT)和信任链(Chain of Trust)。说白了,就是给设备找一个“绝对可信的起点”,然后一级一级把信任传递下去。

3.1 硬件信任根(RoT)——信任的起点

信任根是什么?我个人的理解是:一个不可篡改、不可绕过的安全锚点。它必须是硬件层面的,因为纯软件可以被改写、被注入。

核心原则:信任根必须满足三个条件——不可伪造、不可篡改、不可绕过。缺一个,整个信任链就塌了。

常见的硬件信任根有几种形态:

  • Boot ROM:芯片出厂时固化在只读存储器里,物理上无法修改。上电后CPU第一条指令就从这里开始执行。
  • eFuse / OTP:一次性可编程存储,用来存放根密钥、芯片唯一ID。写进去就改不了。
  • 独立安全芯片:比如TPM、安全元件(SE),它们有自己的CPU、存储、密码加速器,和主系统物理隔离。

我在一个IoT网关项目里遇到过这么个事:客户说“我们用软件校验Bootloader就够了”。结果呢?攻击者直接物理短接Flash引脚,跳过了校验逻辑。从那以后,我坚持所有量产设备必须用硬件信任根——哪怕只是一个OTP fuse。

我的建议:选型时优先看芯片是否提供不可修改的Boot ROM,以及是否有独立的密钥存储区域。别指望“软件防物理攻击”,那是自欺欺人。

3.2 信任链的建立与传递——一级一级往上“扛”

有了信任根,下一步就是怎么把信任“传”下去。这个过程我习惯叫它“接力赛”:

  1. 阶段1:Boot ROM → Bootloader
    Boot ROM先校验Bootloader的签名或哈希。校验通过,才把控制权交给它。
  2. 阶段2:Bootloader → OS Kernel
    Bootloader校验内核镜像的完整性。我见过很多方案只校验了头部,没校验整个镜像——结果被人从中间插入了恶意代码。
  3. 阶段3:Kernel → 系统服务 / 应用
    内核在加载驱动、启动服务时,逐级验证签名。这一步通常依赖内核的完整性测量机制(比如IMA)。

每一级只信任上一级,上一级只把控制权交给经过验证的下一级。这就是信任链。

注意:信任链有一个致命弱点——单点失效。如果信任根本身被物理破解(比如通过激光切割读取OTP),整个链就断了。所以高端设备会用多层物理防护,比如主动屏蔽层、电压/温度检测。

我曾经帮一个客户调试启动失败问题。现象是Bootloader校验总是不通过,但镜像明明没改过。查了两天,发现是NAND Flash的坏块管理把签名区域重映射到了错误位置。嗯,信任链不仅要考虑“谁校验谁”,还得考虑存储介质的可靠性。

3.3 TPM在信任链中的作用

TPM(Trusted Platform Module)是个好东西。它本质上是一个专用的安全协处理器,有自己的非易失性存储、RNG、RSA/ECC引擎、哈希引擎。

在信任链里,TPM主要干三件事:

功能 说明 我见过的坑
平台配置寄存器(PCR) 存储启动过程的哈希度量值。每次度量都“扩展”进去,不可逆。 有人忘了扩展PCR,导致度量值永远一样——等于没度量。
密封存储(Sealing) 把密钥“绑定”到特定PCR值。只有系统状态符合预期,才能解开。 固件升级后PCR值变了,密钥解不开——需要提前规划升级策略。
远程证明(Remote Attestation) 用TPM的私钥签名PCR值,发给远程服务器验证。 签名用的AK(Attestation Key)证书链没配好,服务器不认。

TPM的PCR扩展机制很有意思。它不是简单的“写值”,而是 新PCR = SHA256(旧PCR || 新度量值)。这意味着你无法通过伪造某个阶段的度量值来“覆盖”之前的记录。顺序一旦定了,就改不了。

关键点:TPM本身不参与信任链的“执行”,它只做“记录”和“报告”。真正决定“是否继续启动”的,是CPU和Boot ROM。TPM更像一个公证人,而不是法官。

3.4 TEE在信任链中的作用

TEE(Trusted Execution Environment)和TPM不同。TPM是独立芯片,TEE是在同一个CPU上隔离出的安全世界。ARM的TrustZone、Intel的SGX/TDX、RISC-V的MultiZone都属于TEE。

在信任链里,TEE的角色更“主动”:

  • 安全启动的延伸:TEE可以接管信任链的后半段,在安全世界里加载和运行可信应用(TA)。
  • 运行时隔离:即使Rich OS(比如Linux)被攻破,TEE里的密钥和敏感操作依然安全。
  • 安全存储:TEE可以用硬件绑定的密钥加密数据,存到普通Flash里。解密只能在TEE内完成。

我做过一个项目,需要在设备上存储云端证书。客户一开始想用文件系统加密。我说不行,密钥本身存在哪?最后还是用TEE的安全存储,密钥由芯片硬件唯一密钥派生,攻击者就算dump了整个Flash也拿不到。

经验之谈:TPM和TEE不是二选一的关系。高端设备往往是“TPM做启动度量 + TEE做运行时保护”。TPM管“你是谁”,TEE管“你正在做什么”。

3.5 信任链的完整视图

下面这张图是我自己画的一个典型信任链流程,涵盖了硬件信任根、TPM和TEE的协作关系:

信任链建立与传递流程图 信任链建立与传递流程图 硬件信任根 (Boot ROM) Bootloader 签名/哈希校验 TPM PCR 扩展 OS Kernel 完整性校验 TPM PCR 扩展 TEE 安全世界加载 可信应用 / 安全服务 说明:每一步的度量值都扩展进TPM PCR,TEE在安全世界提供运行时隔离保护

从这张图可以清楚看到:信任从Boot ROM开始,经过Bootloader、Kernel,一直延伸到TEE里的可信应用。每一步的度量值都被TPM记录下来,形成一个不可伪造的“启动日志”。

3.6 避坑指南——我踩过的几个坑

做了这么多年安全,有些坑我至今记忆犹新。分享出来,希望大家别重蹈覆辙:

  • 坑1:信任链“断链”
    我曾经在一个项目里,Bootloader校验了内核,但内核加载驱动时没做任何校验。攻击者替换了一个驱动文件,轻松绕过整个信任链。记住:信任链必须覆盖到最后一个可执行实体。
  • 坑2:PCR扩展顺序搞反
    有次调试TPM远程证明,发现PCR值总对不上。查了半天,发现固件团队把度量顺序写反了——先扩展了内核,再扩展Bootloader。顺序一错,整个信任链的“证据”就废了。
  • 坑3:TEE和REE共用内存没隔离
    一个合作伙伴在TEE里处理密钥,但密钥输入缓冲区是REE(普通世界)直接传过来的指针。攻击者通过DMA直接修改了缓冲区内容。TEE再安全,入口没守住也是白搭。

血的教训:信任链不是“配了就行”,而是“配对了才行”。每一个环节的校验算法、度量顺序、存储位置,都必须经过严格的安全评审。我建议在项目早期就画好完整的信任链流程图,逐级评审。

3.7 小结

信任根和信任链是设备安全的基石。没有它们,远程证明、身份绑定都是空中楼阁。

记住几个关键点:

  • 信任根必须是硬件层面的,不可篡改
  • 信任链要覆盖从Boot ROM到应用的每一级
  • TPM负责记录和报告启动状态,TEE负责运行时保护
  • 两者配合,才能构建一个完整的可信执行环境