1. 安全启动基础:什么是安全启动、信任链模型与硬件根信任

各位同学好,我是老周。做安全固件和硬件安全这块,一晃十几年了。今天咱们开始聊安全启动——这个听起来很基础、但实际坑特别多的领域。

先问大家一个问题:你按下电源键,CPU 开始跑的第一条指令,你确定它是你写的吗?

嗯,很多人没想过这个问题。但攻击者想过。他们会在你启动之前,就把恶意代码塞进 Flash,或者篡改 Bootloader。等你系统跑起来,一切看起来正常,其实后门早就开了。

安全启动,就是来解决这个问题的。

1.1 什么是安全启动

安全启动(Secure Boot),说白了就是一套「验身」机制。从芯片上电的第一刻起,每一段要执行的代码,都得先通过签名验证。验不过?对不起,不跑。

我习惯把它理解成「接力验证」——每一棒选手跑之前,先检查前一棒给的接力棒是不是真的。

核心要点:安全启动不是防你刷机,也不是防你改系统。它的目标是防止未经授权的代码在启动阶段执行。攻击者想植入持久化后门?先过签名验证这关。

实际项目中,我见过很多团队把安全启动和「加密启动」搞混。安全启动验证的是代码完整性,不是保密性。你的 Bootloader 可以是明文存储的,只要它有合法签名就行。

1.2 信任链模型

信任链(Chain of Trust)是安全启动的骨架。它长什么样?我画个图你就明白了。

安全启动信任链模型 安全启动信任链模型 硬件根信任 (RoT) BootROM / eFuse 一级 Bootloader (PBL) 验证下一级签名 二级 Bootloader (SBL) 加载并验证 OS Kernel 操作系统内核 验证驱动与系统服务 应用与服务 信任根不可篡改 BootROM 固化在芯片内 物理上无法修改 逐级验证 每一级只信任上一级 环环相扣,不可跳过 信任传递 从 RoT 开始逐级传递 直到整个系统就绪

你看这个图,从底到顶,每一级都只信任上一级。最底层的 BootROM 是硬件固化的,改不了。它验证完一级 Bootloader,一级 Bootloader 再去验证二级 Bootloader,以此类推。

我曾经在一个 IoT 项目里遇到过一个问题:客户说他们的安全启动总是不通过。查了两天,发现是二级 Bootloader 的签名公钥被存在了可写的 Flash 分区里。你想想看,攻击者只要改了这个公钥,就能用自己的签名代码通过验证。这信任链就断了。

避坑指南:信任链的强度取决于最弱的一环。公钥存储位置、签名算法强度、验证逻辑的完整性,任何一个环节出问题,整个信任链就形同虚设。我曾经见过一个产品,BootROM 验证做得很好,但二级 Bootloader 验证内核时用了硬编码的弱哈希——攻击者直接碰撞就绕过去了。

1.3 硬件根信任(RoT)概念

硬件根信任(Root of Trust, RoT),是整个安全启动的基石。它必须是不可伪造、不可篡改、不可绕过的。

常见的 RoT 实现方式有几种:

实现方式 存储位置 特点 常见场景
BootROM 芯片内部 Mask ROM 出厂固化,物理不可改 手机 SoC、MCU
eFuse / OTP 芯片内一次性可编程区域 可烧录公钥哈希,烧后不可逆 PC 主板、服务器
TPM / HSM 独立安全芯片 隔离执行,防侧信道攻击 企业级设备、金融终端
安全飞地 SoC 内独立安全域 硬件隔离,专用处理器 ARM TrustZone、Intel SGX

我个人习惯把 RoT 分成两类:

  • 静态 RoT:启动时一次性验证,之后不再参与。BootROM 就是典型代表。
  • 动态 RoT:运行时也可以触发重新验证。比如 Intel 的 Boot Guard 就支持动态重新测量。

这里有个容易忽略的点:RoT 不仅要防篡改,还要防绕过。我见过一个案例,某款芯片的 BootROM 有 JTAG 调试接口没关,攻击者直接通过 JTAG 注入代码,跳过了整个安全启动流程。嗯,这就是典型的「门锁得很好,但窗户没关」。

实战建议:选型时,别只看 RoT 的加密强度。先确认这几个问题:

  • BootROM 有没有调试接口?能不能在生产时熔断禁用?
  • eFuse 烧录后能不能回读?有些芯片的 eFuse 是可以通过特殊电压读出来的。
  • RoT 的密钥是谁生成的?生成环境是否安全?

我踩过最大的坑就是 eFuse 烧录后没做物理防护,攻击者用电子显微镜直接读出了密钥。从那以后,我所有项目都要求 RoT 密钥必须在安全环境中生成,并且烧录后立即熔断回读路径。

1.4 信任链的验证流程

咱们把整个流程串起来,看看实际跑起来是什么样子:

  1. 芯片上电:CPU 从 BootROM 开始执行。BootROM 是只读的,攻击者改不了。
  2. BootROM 读取 eFuse:拿到根公钥的哈希,或者直接读取根公钥。
  3. 验证一级 Bootloader:BootROM 从 Flash 读取 PBL,用根公钥验签。验不过?直接死循环或者进恢复模式。
  4. PBL 验证二级 Bootloader:PBL 从 Flash 读取 SBL,用 PBL 内置的公钥验签。注意,这个公钥本身也是被 BootROM 保护的。
  5. SBL 验证 OS Kernel:SBL 加载内核镜像,验签。验过才跳转执行。
  6. 内核验证驱动和服务:现代系统里,内核也会验证后续加载的模块。比如 Linux 的模块签名验证。

每一步都环环相扣。只要有一环没验,或者验得不严,攻击者就能从那里切入。

我记得有一次帮客户做安全审计,发现他们的 SBL 验完内核签名后,没有清理验签用的公钥缓冲区。攻击者通过内存残留数据,逆向出了公钥结构,然后伪造了一个合法签名的内核。嗯,细节决定成败啊。

关键认知:安全启动不是「验一次就完事」。它是从硬件到软件、从启动到运行时的持续验证过程。信任链断了,安全就不存在了。

1.5 为什么硬件根信任这么重要

你可能会问:软件做根信任不行吗?

不行。软件是存在 Flash 里的,攻击者可以物理读取、修改。就算你加密了,密钥也得有个地方存。存哪?最后还是得靠硬件保护。

硬件根信任的核心价值在于:

  • 物理不可篡改:BootROM 是芯片制造时刻进去的,出厂后改不了。
  • 执行环境可信:BootROM 执行时,外部存储器还没初始化,攻击者无法注入代码。
  • 密钥安全存储:eFuse 和 OTP 区域,一旦烧录就不可逆,物理攻击成本极高。

说白了,硬件根信任就是整个安全体系的「锚」。锚稳了,后面的链才能稳。锚松了,后面再强的加密也没用。

好了,这一章的基础概念就聊到这。记住三个关键词:验身、接力、锚点。后面几章我们会深入每个环节的攻防细节,包括怎么绕过、怎么防护、怎么检测。