信任根与安全启动:芯片的第一道防线

说实话,做了这么多年硬件安全,我越来越觉得信任根这东西就像芯片的「出生证明」。没有它,后面所有的安全机制都是空中楼阁。今天咱们就聊聊这个最基础、也最关键的话题。

信任根(RoT)到底是什么?

信任根,英文叫 Root of Trust,简称 RoT。说白了,它就是系统中一个绝对可信的起点。这个起点必须是硬件实现的,不能被篡改的。

我习惯把 RoT 比作「锚」。一艘船不管怎么漂,锚点不动,船就安全。芯片也一样——所有安全决策最终都要追溯到某个不可更改的硬件单元。

信任根的核心属性:

  • 不可篡改性——物理上无法改写
  • 唯一性——每颗芯片的 RoT 都不同
  • 隔离性——普通软件无法访问
  • 持久性——掉电不丢失

你想想看,如果攻击者能改掉信任根,那整个安全体系就崩了。所以 RoT 通常放在一次性可编程(OTP)存储器里,或者用熔丝实现。写进去就锁死,谁也别想动。

安全启动链:一级验证一级

有了信任根,接下来就是怎么用它来验证整个系统。这就是安全启动链要做的事。

安全启动链的核心理念很简单:逐级验证,层层信任。就像接力赛,每一棒都要确认下一棒是合法的。

安全启动链流程 信任根 (RoT) BootROM 一级 Bootloader 验证签名 二级 Bootloader 加载驱动 操作系统内核 完整性校验 安全应用 运行时保护 安全外设 加密引擎 关键原则: • 每一级只信任上一级的签名结果 • 任何一级验证失败,立即停止启动 • 信任根是硬件实现的,不可绕过

这个流程里,BootROM 是硬件固化的,它里面存着信任根的根密钥。芯片上电后,BootROM 先验证一级 Bootloader 的签名。通过了,一级 Bootloader 再去验证二级 Bootloader。以此类推,直到操作系统和应用程序。

我的经验:有一次做 IoT 芯片,客户说启动太慢。查了半天发现是签名验证算法选得太重。后来换成 ECDSA,速度提了 3 倍。选算法时一定要权衡安全性和性能。

密钥存储与保护:别把钥匙挂在门上

密钥存储是信任根里最头疼的部分。我见过太多设计,密钥存得跟闹着玩似的。

密钥存储的几个层次:

存储位置 安全等级 典型用途 风险点
OTP 熔丝 最高 根密钥、芯片身份 容量小,一次性写入
eFuse 高 设备密钥、配置 编程电压高,有物理攻击风险
安全 SRAM 中高 会话密钥、临时密钥 掉电丢失,需电池备份
Flash 加密区 中 固件密钥、证书 易被读擦,需配合加密引擎

我个人习惯把根密钥放在 OTP 里,然后用它来加密派生密钥。这样即使攻击者拿到芯片,也只能看到加密后的密钥 blob,真正的密钥在 OTP 里出不来。

密钥生命周期管理

密钥不是存进去就完事了。它有自己的生命周期:

  1. 生成——必须在芯片内部真随机数发生器(TRNG)产生,不能从外部导入
  2. 分发——产线烧录时要用安全通道,我见过有人用 JTAG 明文传密钥,当场裂开
  3. 使用——密钥只在硬件安全模块(HSM)内部使用,软件永远拿不到明文
  4. 更新——支持密钥轮换,但不能影响正在运行的系统
  5. 销毁——芯片报废时,密钥必须物理销毁,不能残留

我曾经踩过的坑:有一款芯片产线烧录密钥时,测试脚本把密钥写进了日志文件。结果这批芯片还没出厂,密钥就已经泄露了。后来我们加了产线审计,所有密钥操作必须双人复核。

物理攻击与防护

密钥存好了,还得防着别人物理拆解。常见的物理攻击手段:

  • 探针攻击——用微探针直接读总线上的密钥
  • 侧信道攻击——通过功耗、电磁辐射分析密钥
  • 故障注入——用激光或电压毛刺让芯片出错,泄露信息
  • 反向工程——逐层打磨芯片,拍照分析电路

对应的防护措施:

  • 总线加密,密钥传输全程密文
  • 加掩码逻辑,让功耗曲线随机化
  • 电压/频率/温度检测,异常时自动擦除密钥
  • 顶层金属网格,探测到开盖就触发自毁

嗯,这里要注意——防护措施不是越多越好。每加一层防护,芯片面积和功耗就涨一截。你得根据产品的威胁模型来取舍。消费级芯片和军用芯片的防护等级肯定不一样。

安全启动的验证流程

最后,咱们把整个流程串起来看一遍:

上电复位
  ↓
BootROM 执行(硬件固化)
  ↓
读取 OTP 中的根公钥
  ↓
验证一级 Bootloader 签名 ← 失败 → 进入安全错误状态
  ↓ 成功
一级 Bootloader 执行
  ↓
验证二级 Bootloader 签名 ← 失败 → 进入恢复模式
  ↓ 成功
二级 Bootloader 执行
  ↓
验证 OS 内核签名 ← 失败 → 停止启动
  ↓ 成功
OS 启动,加载安全应用
  ↓
应用运行时,HSM 提供密钥服务

这个流程看起来简单,但每个环节都有坑。比如 BootROM 的代码必须极其精简,因为它是只读的,一旦流片就不能改。我见过一个项目,BootROM 里有个 bug,导致整个芯片无法安全启动,最后只能重新流片,损失几百万。

建议:BootROM 的代码一定要做形式化验证。光靠测试用例覆盖不全。我团队现在所有 RoT 相关的代码都跑过形式化验证工具,虽然慢,但值得。

信任根和安全启动,说白了就是给芯片装一个「防伪标签」和「验货流程」。没有它,你的芯片就是个裸奔的。有了它,至少攻击者得花点功夫才能撬开你的门。