1. 固件度量基础:TPM与TEE概念、信任根(RoT)原理、度量启动流程概述

各位同学,咱们今天聊固件安全里最核心的几个概念。说实话,我入行那会儿,这些名词听着都挺唬人的——TPM、TEE、信任根、度量启动……但干久了你会发现,它们其实就解决一个问题:怎么让一台设备从通电开始,每一步都“可信”。

嗯,咱们一个一个来拆。

1.1 什么是信任根(RoT)?

信任根,英文叫 Root of Trust,简称 RoT。说白了,它就是整个安全体系的“起点”。你想想看,如果连起点都不安全,后面再怎么做度量、验证,都是白搭。

我个人习惯把信任根比作“第一个说真话的人”。在计算机里,这个角色通常由硬件来承担——比如芯片里固化的一段只读代码,或者一个独立的硬件安全模块。它不能被篡改,因为一旦它被改了,整个信任链就断了。

信任根的核心属性:

  • 不可篡改性——出厂后无法修改,或者修改需要物理破坏
  • 不可绕过性——系统启动必须经过它
  • 行为可预测——它做的事情是固定的、可验证的

我在项目中遇到过一种情况:某款 IoT 设备,信任根放在 Flash 里,结果攻击者通过电压故障注入,跳过了信任根的校验。嗯,这就是典型的“信任根不可信”了。所以现在很多方案都要求信任根必须放在片上 ROM 或者 OTP 里。

1.2 TPM 是什么?

TPM,全称 Trusted Platform Module,可信平台模块。它是一个独立的硬件芯片,专门干一件事——安全存储和度量。

TPM 能做什么?我列几个关键功能:

功能 说明 我见过的坑
平台配置寄存器(PCR) 存储度量值的寄存器,只能扩展(extend),不能直接写 有人试图直接写 PCR,结果被硬件挡了
安全存储 密钥、证书等敏感数据存在 TPM 内部,软件拿不到 密钥导出时没做访问控制,导致泄露
远程证明 向远程方证明当前平台状态是可信的 签名算法没更新,被降级攻击
密封(Seal) 将数据绑定到特定平台状态,状态变了就解不开 固件升级后 PCR 值变了,数据全废了

TPM 最核心的概念是 PCR。它有个特性:你只能往 PCR 里“追加”数据,不能覆盖。每次度量新组件,就把新值和旧值拼起来做哈希,再写回去。这样,PCR 的最终值就代表了整个启动过程的“指纹”。

一个小技巧: 调试时可以用 tpm2_pcrread 命令查看当前 PCR 值。如果发现 PCR 值和预期对不上,别慌——先检查度量顺序,我吃过这个亏,调了一整天发现是顺序反了。

1.3 TEE 又是什么?

TEE,Trusted Execution Environment,可信执行环境。它和 TPM 不一样,TPM 是独立芯片,TEE 是在主处理器上划出一块“安全区”。

你想想看,普通操作系统(比如 Linux)跑在“正常世界”(Normal World),TEE 跑在“安全世界”(Secure World)。两个世界是隔离的,安全世界的代码和数据,正常世界看不到。

常见的 TEE 实现有:

  • ARM TrustZone——手机、嵌入式设备用得最多
  • Intel SGX——PC 服务器上的飞地(Enclave)技术
  • RISC-V 物理内存保护(PMP)——开源架构的 TEE 方案

我记得有一次做固件审计,发现某个厂商把解密密钥直接放在正常世界的内存里。我说你们这不是白干吗?后来他们改成在 TEE 里做解密,密钥永远不离开安全世界。这才是正确的做法。

注意: TEE 不是万能的。它只保护运行时的数据,不保护启动过程。启动阶段的信任,还得靠信任根和度量启动来保证。TEE 和 TPM 是互补关系,不是替代关系。

1.4 度量启动流程概述

好,前面铺垫完了,咱们来看核心——度量启动(Measured Boot)。

度量启动的流程,说白了就是:从信任根开始,一级一级地度量,每一级在启动下一级之前,先量一量它是不是“原装”的。

我画了一张图,帮你理解这个链条:

度量启动信任链 信任根 (RoT) Boot ROM Bootloader OS Kernel 应用程序 度量 BootROM → PCR[0] 度量 Bootloader → PCR[1] 度量 Kernel → PCR[2] 度量 应用 → PCR[3] 每一级在启动下一级之前,先度量下一级的代码,将哈希值扩展到 PCR 如果度量值不匹配,则停止启动或进入恢复模式

流程其实不复杂:

  1. 上电,CPU 从固定地址执行 Boot ROM 代码(信任根)
  2. Boot ROM 度量 Bootloader 的代码,计算哈希,扩展到 PCR
  3. 如果度量通过,执行 Bootloader
  4. Bootloader 再度量 OS Kernel,扩展到下一个 PCR
  5. OS Kernel 度量关键应用程序和驱动
  6. 最终,PCR 里存了一串哈希值,代表整个系统的“健康状态”

这里有个关键点:度量不等于验证。度量只是把哈希值记下来,至于这个值对不对,那是验证阶段的事。验证可以由本地策略做,也可以由远程服务器做。

避坑指南: 我曾经在一个项目里发现,Bootloader 度量了 Kernel,但 Kernel 启动后没有度量任何东西。结果攻击者替换了一个系统服务,PCR 值完全没变。记住:度量链不能断,每一级都要度量下一级,直到你不再关心安全为止。

1.5 三个概念的关系

TPM、TEE、信任根,它们不是各自为战的。我习惯这么理解:

  • 信任根是起点,保证第一段代码可信
  • TPM 是记录员,把度量结果安全地存起来
  • TEE 是保镖,保护运行时的敏感操作

举个例子:设备启动时,信任根(Boot ROM)度量 Bootloader,把结果存到 TPM 的 PCR 里。Bootloader 再度量 OS,结果继续存。OS 启动后,某个敏感操作(比如解密)放到 TEE 里执行。远程服务器想确认设备是否安全,就向 TPM 要 PCR 值——这就是远程证明。

你看,三个东西配合起来,才构成一个完整的安全体系。

我个人习惯: 做固件安全审计时,先看信任根是不是真的不可篡改,再看度量链有没有断点,最后检查 TEE 的隔离边界。按这个顺序排查,基本不会漏掉大问题。

好了,这一章的基础概念就聊到这儿。记住:信任根是地基,TPM 是账本,TEE 是保险柜。后面的章节,咱们会深入每个环节,看看攻击者是怎么钻空子的,以及怎么堵住这些漏洞。