2、信任根(RoT)建立:硬件信任锚点与根密钥烧录
安全启动的根基,说白了就是「第一级信任从哪来」。
你想想看,整个启动链像一条锁链——BootROM 验证 Bootloader,Bootloader 验证内核,内核验证文件系统。但这条锁链的第一环,谁来验证?没人验证。它必须是天生可信的。
这就是信任根(Root of Trust, RoT)。我做了这么多年嵌入式安全,见过太多项目在 RoT 上翻车。有的芯片出厂后才发现 eFuse 没烧对,整批报废。有的 BootROM 有硬件漏洞,攻击者直接跳过验证。嗯,这一章咱们就把 RoT 的每个坑都踩一遍。
2.1 硬件信任锚点:eFuse 与 OTP
硬件信任锚点,就是芯片上那块「一次写入、永久生效」的存储区域。常见的有两种:eFuse 和 OTP ROM。
| 特性 | eFuse | OTP ROM |
|---|---|---|
| 写入方式 | 电迁移熔断(一次性) | 高压击穿(一次性) |
| 存储密度 | 较低(每位一个熔丝) | 较高(类似 ROM 阵列) |
| 读取速度 | 快 | 快 |
| 物理安全性 | 中等(可被探针检测) | 较高(不易逆向) |
| 典型容量 | 128 bit ~ 8 Kbit | 512 bit ~ 64 Kbit |
| 常见用途 | 密钥存储、芯片 ID、配置位 | 根密钥、安全配置、生命周期 |
2.2 BootROM 的不可篡改性
BootROM 是芯片上电后执行的第一段代码。它固化在芯片内部,出厂后无法修改。这就是「不可篡改性」的物理基础。
但不可篡改 ≠ 绝对安全。我在项目中遇到过一个问题:某款芯片的 BootROM 里有一段「调试后门」代码,用于工厂测试。结果攻击者通过电压毛刺攻击,让芯片误以为处于测试模式,直接跳过了签名验证。
BootROM 的不可篡改性依赖于芯片的物理设计:
- 掩膜 ROM:制造时直接刻入,无法修改
- 一次性可编程(OTP):出厂后锁定,无法回退
- 硬件安全模块(HSM):独立的安全岛,BootROM 运行在隔离环境中
嗯,这里要注意:有些芯片厂商为了「灵活性」,会在 BootROM 里留一个「安全更新」接口。我个人强烈建议——量产前必须把这个接口永久关闭。否则它就是一颗定时炸弹。
2.3 根密钥对生成与烧录
根密钥对是安全启动的「终极信任」。它通常是一对 RSA 或 ECC 密钥:私钥用于签名固件,公钥烧录到芯片的 OTP/eFuse 中。
2.3.1 密钥生成的最佳实践
我见过太多团队直接在开发机上用 OpenSSL 生成密钥,然后复制到 U 盘里到处传。这太危险了。正确的做法是:
- 使用硬件安全模块(HSM)生成密钥——私钥永远不离开 HSM
- 如果不用 HSM,至少用离线电脑——断网、无蓝牙、无 WiFi
- 生成后立即备份私钥——用 Shamir 秘密共享分片存储
- 销毁生成环境——格式化硬盘,物理销毁
2.3.2 烧录流程与验证
根公钥烧录到 eFuse/OTP 的过程,必须严格受控。我建议的流程如下:
# 1. 在 HSM 中生成密钥对
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 \
-out root_private.pem -engine pkcs11
# 2. 导出公钥
openssl rsa -pubout -in root_private.pem -out root_public.pem
# 3. 计算公钥哈希(用于烧录验证)
openssl dgst -sha256 -binary root_public.pem | xxd -p
# 4. 烧录到 eFuse(示例命令,实际由芯片厂商工具完成)
efuse_program --address 0x00 --data root_public_hash.bin
# 5. 回读验证
efuse_read --address 0x00 --length 32 | cmp - root_public_hash.bin
2.4 信任根建立的整体流程
下面这张图展示了 RoT 建立的完整逻辑。我把它画成流程图,方便你理解各环节的依赖关系。
2.5 常见陷阱与对策
做 RoT 这么多年,我踩过的坑和见过的坑可以列一张长清单。这里挑几个最要命的:
| 陷阱 | 后果 | 对策 |
|---|---|---|
| eFuse 烧录后未回读验证 | 位错误导致密钥无效,芯片变砖 | 烧录后必须回读并与原始数据逐位比对 |
| BootROM 存在未关闭的调试接口 | 攻击者通过 JTAG/SWD 读取 eFuse 内容 | 量产前永久熔断调试接口对应的 eFuse |
| 根密钥在开发环境生成 | 私钥可能被恶意软件窃取 | 使用 HSM 或离线专用电脑生成 |
| 公钥哈希字节序错误 | 签名验证永远失败 | 烧录前用测试镜像做闭环验证 |
| OTP 容量不足 | 无法存储多个密钥或配置 | 设计阶段预留足够 OTP 空间(建议至少 2KB) |
嗯,信任根建立是整个安全启动中最不能出错的一环。它就像大楼的地基——地基歪了,上面盖得再漂亮也没用。我见过太多团队把精力花在后面的签名算法、镜像加密上,却忽略了 RoT 本身的安全性。结果呢?攻击者直接从 BootROM 下手,绕过了所有防护。
记住一句话:信任根不可信,则一切安全皆为空谈。