2. Snapdragon硬件信任根
在骁龙(Snapdragon)平台的启动链中,硬件信任根(Hardware Root of Trust,HRoT)是整个安全体系的绝对起点。它不是一个软件模块,而是一组固化在芯片内部、上电即生效的硬件与只读代码的组合。理解这一层,是理解后续 XBL、ABL、TEE、Android 验证启动如何被“锚定”的前提。本节围绕五个核心对象展开:PBL(Primary Boot Loader)、QFPROM(Qualcomm Fuse Programmable Read-Only Memory)、熔丝(Fuse)、安全控制寄存器(Security Control Register)以及不可变启动代码(Immutable Boot Code)。
一、PBL:芯片上电后执行的第一段代码
PBL 是骁龙 SoC 内 Boot ROM 中固化的引导程序,位于芯片掩膜 ROM 中,出厂后不可修改。上电复位后,Cortex-A 核心从固定复位向量取指,第一条指令即落入 PBL。PBL 的职责非常明确且有限:初始化最小必要的时钟、电源与存储接口,读取启动模式引脚(Boot Mode Strap)判定启动介质(eUFS、SD、USB、UART 等),然后从该介质加载下一级引导镜像(通常是 XBL 的 ELF/PE 镜像),并在加载前完成镜像的认证。
PBL 的“不可变性”是信任根成立的关键。由于它无法被刷写、无法被调试器改写,攻击者无法在信任链的最底层注入代码。PBL 内部集成了高通公钥的哈希(Root Key Hash,通常称为 OEM Root Key 或 QC Root Key 的哈希),该哈希值本身存储在 QFPROM 中,PBL 在运行时读取并用于验证下一级镜像的签名。因此,PBL 的信任并非来自“代码可信”,而是来自“代码不可改 + 其验证依据不可改”。
二、QFPROM 与熔丝:一次性可编程的信任锚点
QFPROM 是骁龙 SoC 内部的一块一次性可编程(OTP)存储区域,物理实现为熔丝阵列(Fuse Array)。每个熔丝位出厂时为 0,通过施加高于常规工作电压的编程电压可将其永久烧写为 1,且不可逆转。QFPROM 中与安全启动直接相关的区域包括:
- OEM PK Hash(OEM Public Key Hash):存放 OEM 签名公钥的 SHA-256 哈希,PBL 用它验证 XBL 签名。
- QC PK Hash:存放高通自身公钥哈希,用于验证高通签名的镜像。
- Secure Boot Enable Fuse:使能安全启动的总开关,烧写后 PBL 强制走认证路径。
- JTAG Disable Fuse:关闭调试接口,防止通过 JTAG 读取内部状态。
- Anti-Rollback Fuse(版本熔丝):记录最低允许的镜像版本号,防止降级攻击。
熔丝烧写是不可逆操作,工程上必须谨慎。典型流程是:在产线首次启动时,通过高通提供的 QFuse 工具或 firehose 协议写入 OEM PK Hash 与 Secure Boot Enable 位。烧写前必须确认公钥哈希与签名密钥严格匹配,否则芯片将永久无法启动合法镜像,只能报废。以下是一个示意性的熔丝烧写命令结构(参数为示例,非实测值):
# 示例:通过 firehose 烧写 OEM PK Hash 与安全启动使能位
qfuse --port /dev/ttyUSB0 \
--oem-pk-hash 3a7f...c91d \
--secure-boot-enable 1 \
--jtag-disable 1 \
--anti-rollback 0x00000005
烧写完成后,可通过读取 QFPROM 的只读映射区域确认熔丝状态。例如在 XBL 或 TEE 中读取 QFPROM_RAW_OEM_PK_HASH 寄存器组,比对返回值是否与预期哈希一致。若返回全 0 或全 F,说明烧写未生效或地址映射有误。
三、安全控制寄存器:运行时的信任状态开关
安全控制寄存器(Security Control Register,SCR)是 SoC 内部一组用于控制安全域访问权限的寄存器。它们与熔丝不同,不是一次性的,而是在每次启动时由 PBL 根据熔丝状态和启动模式进行初始化。SCR 的典型字段包括:
- Secure Boot Status:指示当前是否处于安全启动模式。
- Debug Disable:控制调试接口是否可用。
- Memory Access Permission:定义哪些主设备(如 Modem、DSP)可以访问受保护内存区域。
- XPU 配置:与 eXecute-Only、Read-Only 等内存保护单元联动。
SCR 的值决定了后续 XBL、TEE 和 Android 内核能看到的“安全世界”边界。例如,当 Secure Boot Status 为 1 且 Debug Disable 为 1 时,PBL 会拒绝加载未签名镜像,并关闭 JTAG。若 SCR 配置错误,可能导致 TEE 无法访问安全内存,或 Modem 越权读取用户数据。
四、不可变启动代码与信任链的传递
不可变启动代码不仅指 PBL,还包括 QFPROM 中的哈希值、熔丝状态以及 SCR 的初始配置。它们共同构成一个“不可变集合”,在每次上电时被重新读取并作为信任判断的唯一依据。信任链的传递路径如下:
图中展示了信任链的完整传递逻辑:PBL 从 QFPROM 读取 OEM PK Hash,用它对加载的 XBL 镜像做签名验证;验证通过后,XBL 继续验证 ABL、TEE 等后续镜像;验证失败则进入 EDL(Emergency Download)模式或直接停止启动。SCR 在此过程中提供运行时的访问控制约束,确保即使某个环节被绕过,也无法越权访问受保护资源。
五、工程实践中的关键检查点
在实际项目中,围绕硬件信任根需要关注以下可操作检查点:
- 熔丝烧写前:确认 OEM PK Hash 与签名私钥严格对应,建议先在未烧写熔丝的样片上用
fastboot oem verify或高通QMSCT工具做一次完整签名验证。 - 熔丝烧写后:读取 QFPROM 只读区域,确认 Secure Boot Enable 位为 1,OEM PK Hash 与预期一致,Anti-Rollback 版本号不低于当前镜像版本。
- 启动日志检查:在 XBL 串口日志中搜索
SEC_BOOT、AUTH、FUSE关键字,确认认证路径被正确执行,无auth fail或hash mismatch报错。 - SCR 状态确认:在 TEE 或内核中读取 SCR 寄存器,确认 Debug Disable 已生效,安全内存区域不可被非安全主设备访问。
总结来说,Snapdragon 硬件信任根由 PBL、QFPROM、熔丝、SCR 和不可变启动代码共同构成。PBL 提供不可修改的执行起点,QFPROM 与熔丝提供不可逆的信任锚点,SCR 提供运行时的安全约束,三者结合形成从芯片上电到操作系统加载的完整信任链。理解这一层的物理与逻辑边界,是后续所有安全启动配置、镜像签名和调试操作的基础。