4、安全启动链:三星Secure Boot流程、TrustZone与OTA结合、防止回滚攻击

安全启动链,说白了就是给设备上一把「从娘胎里就焊死的锁」。

我做过不少嵌入式项目,发现很多工程师对安全的理解停留在「加个密码」或者「校验一下签名」。但在三星的体系里,安全是从芯片上电的第一条指令就开始的。你想想看,如果Bootloader本身就被篡改了,那后面再怎么校验都是白搭。

4.1 三星Secure Boot流程

三星的Secure Boot,我习惯把它拆成四个阶段来看。每个阶段只信任上一阶段交给它的东西,环环相扣。

阶段 名称 核心职责
BL0 iROM(固化ROM) 芯片上电后第一条指令,不可更改
BL1 Primary Bootloader 验证BL2的签名,初始化DRAM
BL2 Secondary Bootloader 加载并验证U-Boot或LK
BL3 OS Bootloader 验证内核与ramdisk

这里有个关键点:BL0是写在芯片内部的ROM里,物理上无法修改。我在项目中遇到过有人想绕过这个环节,直接烧写BL1,结果芯片根本不理你——因为BL0只认自己手里的公钥哈希。

核心机制:每一级Bootloader在加载下一级之前,都会用内置的公钥验证下一级镜像的数字签名。签名通过才执行,否则直接进入「熔断」状态。

具体流程是这样的:

  1. BL0从OTP(一次性可编程)区域读取公钥哈希
  2. BL0验证BL1的签名,匹配则跳转
  3. BL1初始化时钟和DRAM,然后验证BL2
  4. BL2加载U-Boot,U-Boot再验证内核

嗯,这里要注意:公钥本身并不存在芯片里,存的是哈希。这样做的好处是,就算有人逆向工程读出了OTP内容,他也拿不到原始公钥,无法伪造签名。

4.2 TrustZone与OTA结合

TrustZone是ARM架构提供的一种硬件隔离技术。我打个比方:它把CPU分成了两个世界——

  • 正常世界(Normal World):跑Android、Linux这些通用OS
  • 安全世界(Secure World):跑TEE(可信执行环境),处理密钥、指纹、支付等敏感操作

那TrustZone跟OTA升级有什么关系?关系大了。

我在设计OTA方案时,最头疼的问题就是:升级包下载到正常世界,怎么保证它没被篡改? 你想想看,如果Root过的设备,攻击者完全可以拦截下载包,替换成恶意固件。

我的做法:把签名验证放到安全世界里执行。正常世界只负责下载和存储,拿到升级包后,通过安全监控调用(SMC)把数据传给TEE,TEE在安全世界里完成签名校验。这样就算正常世界被攻破了,攻击者也拿不到签名密钥。

具体流程我简化一下:

1. 设备下载OTA包到/data/ota/目录
2. 正常世界发起SMC调用,通知TEE有新包
3. TEE读取OTA包的签名头
4. TEE用内部存储的公钥验证签名
5. 验证通过,TEE写一个「允许升级」标志到RPMB分区
6. 重启后,BL2检查RPMB标志,执行升级

这个流程里,签名密钥永远不离开安全世界。我曾经见过一个方案,把私钥直接硬编码在应用层代码里——那基本等于把家门钥匙挂在门把手上。

4.3 防止回滚攻击

回滚攻击是什么?说白了就是:你明明修复了一个安全漏洞,发布了新版本。但攻击者把旧版本(有漏洞的那个)重新刷回去,然后利用旧漏洞搞事情。

我早期做一个IoT项目时就吃过这个亏。设备支持OTA降级,结果用户刷回了三个版本前的固件,那个版本有个缓冲区溢出漏洞,直接被拿了root权限。

教训:OTA升级必须支持「防回滚」机制。否则你修漏洞的速度,永远赶不上攻击者利用旧版本的速度。

三星的方案里,防回滚主要靠两个东西:

  • 版本计数器(Version Counter):存储在OTP或RPMB分区,只能递增,不能递减
  • 熔丝(eFuse):物理熔断,一旦烧断就不可恢复

具体做法是这样的:

  1. 每个版本的固件都有一个版本号,比如v1.0、v2.0
  2. 升级时,TEE检查新版本的版本号是否大于当前存储的版本计数器
  3. 如果大于,则更新版本计数器,然后执行升级
  4. 如果小于或等于,直接拒绝升级

这里有个细节:版本计数器是存储在安全世界能访问的区域。正常世界只能读,不能写。我见过有些方案把版本号存在普通文件系统里,结果攻击者直接改文件,轻松绕过防回滚。

进阶技巧:对于特别关键的设备(比如支付终端),我建议使用eFuse来存储版本号。每升级一次,熔断一组熔丝。虽然eFuse有次数限制(一般16次左右),但对于大多数设备来说足够了。而且eFuse是物理不可逆的,攻击者就算有物理访问权限也改不回去。

嗯,最后说一句。安全启动链不是银弹,它只是把攻击门槛提高了。但说实话,对于绝大多数攻击者来说,这个门槛已经够高了。你想想看,要攻破一个Secure Boot + TrustZone + 防回滚的系统,攻击者需要:

  • 找到BL0的漏洞(几乎不可能,因为它是固化ROM)
  • 或者物理破解OTP/eFuse(需要专业设备)
  • 或者攻破TEE(需要找到安全世界的漏洞)

这三条路,每一条都不好走。所以,做好安全启动链,你的设备就已经赢了90%的攻击者。