3. 可信发布基础

在OTA可信发布体系中,所有安全机制最终都要回答一个问题:我凭什么相信这次发布的固件、镜像或配置没有被篡改?可信计算正是为回答这个问题而建立的一整套技术体系。它不依赖“看起来正常”这种主观判断,而是通过硬件可信根、逐级度量、密码学证明,把信任从不可篡改的硬件锚点,一层层传递到操作系统、应用乃至OTA发布包。理解可信计算的核心概念与关系,是构建可信发布链路的起点。

一、核心原理:从可信根到信任链

可信计算的基本思想是“信任必须有一个不可再分的起点”。这个起点称为可信根(Root of Trust, RoT)。可信根通常由硬件实现,因为软件可以被替换,而硬件锚点更难被远程篡改。可信根一般拆分为三个职责:

  • 可信度量根(RTM):负责对后续加载的代码进行完整性度量,通常由固化在芯片中的只读代码承担。
  • 可信存储根(RTS):负责安全保存度量结果,例如TPM中的平台配置寄存器(PCR)。
  • 可信报告根(RTR):负责对外提供可信的证明能力,例如用设备私钥对度量结果签名。

有了可信根,系统启动时由RTM先度量下一段代码,把度量值存入RTS,再把控制权交给这段代码;这段代码继续度量再下一段代码。如此逐级传递,就形成了信任链(Chain of Trust)。信任链的本质是:每一级都先验证下一级的完整性,验证通过才移交执行权。只要可信根未被攻破,且每一级验证逻辑正确,整条链上的组件就都可被信任。

关键关系:可信根是“锚点”,信任链是“传递路径”,安全启动是“执行控制”,度量启动是“记录证据”,远程证明是“对外举证”。五者不是并列概念,而是同一信任体系在不同阶段的不同表现。

二、安全启动与度量启动:控制与记录的分工

安全启动(Secure Boot)和度量启动(Measured Boot)经常被混为一谈,但它们在可信发布中承担不同职责。

安全启动的核心是“验证并阻断”。每一级引导程序在加载下一级之前,先用公钥验证其签名。如果签名无效或哈希不匹配,启动流程立即停止。它保证设备不会运行未授权代码,是一种强制性的执行控制。安全启动通常依赖固化的公钥哈希(如PK、KEK、db)作为信任起点。

度量启动的核心是“度量并记录”。它不阻断启动,而是把每一级组件的哈希值扩展到TPM的PCR中,形成一条不可逆的度量日志。度量启动不直接判断好坏,但它为后续的远程证明提供了可验证的证据。换句话说,安全启动负责“不让坏代码跑起来”,度量启动负责“把跑过什么如实记下来”。

对比维度 安全启动 度量启动
核心动作 验证签名,失败则阻断 计算哈希,扩展PCR,不阻断
信任依据 固化公钥/证书 TPM PCR与度量日志
输出结果 允许或拒绝启动 可验证的完整性证据
OTA发布中的作用 防止未签名固件被加载 为远程证明和审计提供依据
典型实现 UEFI Secure Boot、Verified Boot TPM PCR扩展、IMA度量

在OTA场景中,二者通常配合使用:安全启动确保设备只运行合法固件,度量启动则把当前固件版本、配置、启动参数等记录到PCR中。发布服务器在推送新版本前,可以要求设备先完成远程证明,确认其当前状态可信,再决定是否下发更新包。

三、远程证明:把本地信任变成可验证的远程结论

远程证明(Remote Attestation)是可信计算对外输出的关键能力。它解决的问题是:一台远程设备声称自己运行的是可信固件,我如何验证这句话是真的?

远程证明的基本流程如下:

  1. 挑战方(如OTA发布服务器)生成一个随机数nonce,发送给设备。
  2. 设备调用TPM,读取当前PCR值,并用可信报告根私钥对“PCR值 + nonce”进行签名,生成Quote。
  3. 设备把Quote、PCR值、度量日志(Event Log)一起返回给挑战方。
  4. 挑战方验证签名,确认Quote来自真实TPM;再用度量日志重放PCR,确认PCR值与日志一致。
  5. 挑战方将PCR值与预期基线比对,判断设备是否处于可信状态。

远程证明的价值在于:它把设备本地的信任链状态,转化为发布服务器可以独立验证的密码学证据。没有远程证明,OTA服务器只能“盲推”;有了远程证明,服务器可以做到“先验证、再发布”。

四、案例场景:OTA发布前的可信准入

假设某车厂要推送一次ECU固件升级。发布平台在推送前执行以下准入检查:

# 伪代码:OTA发布前的远程证明准入
challenge = random_nonce()
quote = device.tpm.quote(pcr_selection=[0,1,2,7], nonce=challenge)
verify(quote.signature, tpm_pubkey)
replay_pcr(quote.event_log)
if quote.pcr[0] != expected_bootloader_hash:
    reject("引导程序度量值异常")
if quote.pcr[7] != expected_secureboot_policy:
    reject("安全启动策略被篡改")
approve_update(device_id, firmware_version)

这个流程中,安全启动保证了设备不会加载未签名引导程序,度量启动把引导程序哈希写入PCR[0],远程证明把PCR值签名后发给发布平台。发布平台验证通过后,才允许下发新固件。整条链路中,可信根是起点,信任链是路径,安全启动是闸门,度量启动是账本,远程证明是举证。

五、常见误区与复盘

误区一:把安全启动等同于可信启动。安全启动只保证“验证通过才运行”,但不记录运行过什么。没有度量启动,远程证明就没有证据来源。

误区二:认为有了TPM就自动可信。TPM只是可信存储根和报告根,如果RTM被替换、度量逻辑被绕过,PCR值同样不可信。可信根必须从硬件固化代码开始。

误区三:远程证明只看签名不看日志。签名只证明Quote来自真实TPM,不证明PCR值对应真实运行状态。必须结合度量日志重放,才能发现“PCR正确但日志被裁剪”的攻击。

误区四:忽略PCR基线管理。远程证明的比对基线需要随固件版本更新而维护。基线过期会导致合法设备被误判,基线过宽则会让攻击者有机可乘。

复盘来看,可信发布不是单一技术,而是一条从硬件可信根出发、经过安全启动和度量启动、最终由远程证明对外举证的完整信任链。OTA发布系统只有把这条链接入发布准入流程,才能真正做到“不可信不发布、不可信不升级”。

可信发布信任链:从硬件可信根到远程证明 安全启动负责“验证并阻断”,度量启动负责“记录并举证” 设备内部:逐级度量与信任传递 硬件可信根 RoT RTM 度量根 · RTS 存储根 · RTR 报告根(TPM/安全芯片) 度量并移交 引导程序 Bootloader 安全启动验证签名 → 度量值写入 PCR[0] 验证并度量 操作系统内核 Kernel 安全启动验证 → 度量值写入 PCR[1-6] 加载并度量 OTA代理与应用程序 度量值写入 PCR[7-9],形成完整度量日志 TPM PCR 寄存器 + 度量日志 Event Log 不可逆扩展,记录每一级组件的哈希证据 远程证明与发布准入 OTA发布服务器 生成 nonce,发起远程证明挑战 nonce 挑战 TPM Quote 签名响应 PCR值 + nonce + 度量日志 由 RTR 私钥签名,不可伪造 验证与重放 发布准入判断 ① 验证 Quote 签名有效性 ② 重放度量日志,核对 PCR ③ 与预期基线比对 ④ 通过则允许下发固件 可信则发布 · 不可信则拒绝 实现“先验证、再发布” Quote + 日志 可信根 安全启动验证 度量启动记录 远程证明举证 发布准入决策