1 原理
首先,Secure Boot功能的目的是什么?查了下资料,就是不让设备刷第三方的固件。类似圆环套圆环,圆环第一环是CPU,CPU定制了空间保存密钥,然后就是Boot,然后是OS,最后一直套到最后APP。
安卓的Secure Boot(安全启动)是整个 Android 移动设备安全架构的第一道防线和根基(Root of Trust)。它的核心目标是:确保设备从通电开机的那一刻起,到加载操作系统内核的全过程,每一行代码都是合法的、未被篡改的,从而防止恶意软件在底层植入(如 Rootkit)或刷入被篡改的系统。
如下图:
高通芯片流程如下,基本和上面的差不多,就是Bootloader分成了两个:
之后的启动过程如下:
第一环:硬件信任根(Root of Trust, RoT)
在芯片出厂时,制造商会将一个公钥的哈希值(Hash)烧录到芯片内部一次性可编程寄存器(eFuse)中。这个硬件级别的烧录是物理不可逆的,无法被软件篡改。
第二环:芯片固化引导(PBL - Primary Bootloader)
手机按下开机键后,CPU 首先运行固化在芯片内部硅片 ROM 中的代码(PBL)。
PBL 会去读取并加载下一级引导程序(如 XBL 或 SBL),并使用硬件 eFuse 中的公钥去解密/验证下一级程序的数字签名。
第三环:引导程序层层校验(Secondary Bootloader & Bootloader)
每一级引导程序在被执行前,必须先对紧接着的下一级引导程序进行 RSA / ECDSA 签名验证。
如果验证通过,才把控制权交接给下一级。
第四环:操作系统内核与校验(Verified Boot / vbmeta)
当引导进入到 Android 内核(
boot.img、init_boot.img)以及分区元数据(vbmeta.img)时,系统会通过AVB(Android Verified Boot)机制,对整个文件系统的区块(dm-verity)进行哈希校验。
这里稍微要注意的就是有一个efuse,保存了根密钥的hash值,可以用来验证后面的hash是否正确。就是电子保险丝,一旦写入之后就不能更改。
可以看到的是以后手机,刷机成了不再可能的事情了,甚至可能刷一个软件都不行。。。
在Andorid的层面,又进行了扩展。搞了一个Verified boot,运行时也可以校验。
最后,在开发阶段,Secure Boot其实一般不都弄。可能在量产的时候会在产线上做,到时候会有专门的设备和人员,甚至区域做这个。。。
2 用Openssl生成密钥
可以看下面这篇,我觉得写的还不错:
https://zhuanlan.zhihu.com/p/492475360
3 以高通为例
在高通平台上,提供了一套python的工具,用的是Openssl,还有一个V3.ext。
官方的流程大概是以下几步。(下面所有的命令均是示例)
3.1 Generate secure boot keys
3.1 3.2 3.3这几步通常在安全的离线主机(Offline Security Workstation)上通过 OpenSSL 完成。就是把openssl,和v3.ext的相关文件拷贝到一个文件夹。同时配置配置文件。
# 1. 生成根 CA 私钥 (RSA 4096位) openssl genpkey -algorithm RSA -out root_ca.key -pkeyopt rsa_keygen_bits:4096 # 2. 生成根 CA 自签名证书 (有效期 10 年) openssl req -x509 -new -nodes -key root_ca.key -sha256 -days 3650 \ -out root_ca.crt -subj "/CN=OEM Root CA/O=MyCompany/C=CN"3.2 Generate root key pair and certificate
生成根CA密钥对和证书。使用四个openssl命令。
3.3 Generate attestation CA key pair and certificate
生成认证CA密钥对和证书。这样同样也是4个openssl命令完成。
Attestation CA / Sub-CA:中间认证 CA,用于对下级的二级签名密钥(如 OS 镜像签名密钥、Bootloader 签名密钥)进行授权。
# 1. 生成二级认证 CA 私钥 openssl genpkey -algorithm RSA -out attestation_ca.key -pkeyopt rsa_keygen_bits:4096 # 2. 生成二级 CA 的证书签名请求 (CSR) openssl req -new -key attestation_ca.key -out attestation_ca.csr \ -subj "/CN=OEM Attestation CA/O=MyCompany/C=CN" # 3. 使用根 CA 对二级 CA 证书进行签名授权 openssl x509 -req -in attestation_ca.csr -CA root_ca.crt -CAkey root_ca.key \ -CAcreateserial -out attestation_ca.crt -days 1825 -sha2563.4 Configure PK hash in fuse
生成电子熔断中的根证书hash。用openssl digest命令。
这里生成根证书的 SHA-256 哈希值,并通过高通的工具(如 QFIL / Prommer 烧录器)写入芯片的OEM_PK_HASH寄存器(eFuse)。
一旦通过高通的 9008 烧录模式将这个 Hash 写入 eFuse 并执行熔断,芯片在物理层就被彻底“锁定”了。此后,芯片内部的 PBL(Primary Bootloader)在每次开机时,都会拿当前引导程序的签名去和这个 eFuse 里的 Hash 做数学比对。如果对不上,直接拒绝启动。
# 1. 提取根证书中的公钥并转换为 DER 格式 openssl x509 -in root_ca.crt -pubkey -noout | openssl pkey -pubin -outform DER > root_pubkey.der # 2. 计算 SHA-256 哈希值(这就是需要写入 eFuse 的目标哈希) openssl dgst -sha256 -binary root_pubkey.der | xxd -p -c 32 > oem_pk_hash.txt echo "生成的 OEM_PK_HASH 内容为:" cat oem_pk_hash.txt3.5 Generate sec.elf image
生成加密分区。虽然是叫做加密分区,当时实际是一个配置程序。
# 典型的高通 SecImage 工具调用示例(依赖高通 BSP 提供的 Sectools 脚本) python3 ${SECTOOLS_PATH}/sectools.py secure-policy \ --image_in sec.dat \ --config_path security_config.xml \ --sign_config sign_config.xml \ --output_dir ./output_sec这里的sec.elf实际就是XBL之后一个配置安全的程序。主要做的事情有两个:
1 配置硬件隔离控制器:它通过向芯片内部的 TZASC(TrustZone Address Space Controller)和 TZPC(TrustZone Protection Controller)等硬件寄存器写入参数,把物理内存和外设严格切割为 Secure World(安全世界)和 Non-Secure World(普通世界)。
2 初始化密码学上下文:为后续运行在安全世界里的 TEE(如 QSEE / Trusty)初始化硬件加密引擎、真随机数发生器(TRNG)和安全存储接口。
3.6 Sign the images
对各个分区镜像进行签名。这里可以看到,高通常规的操作是对各个分区进行验证。如果私下对有的分区进行了烧写,就可能导致校验不过无法启动。
# 使用高通 Sectools 对单个镜像(如 boot.img)进行签名的命令示例 python3 ${SECTOOLS_PATH}/sectools.py sign \ -ih boot.img \ -sa \ --config ${SECTOOLS_PATH}/config/integration_config.xml \ --un-signed-image boot.img \ --output_dir ./signed_output \ --exponent 3 \ --key attestation_ca.key \ --cert attestation_ca.crt3.7 Flash signed image on device
将签名后的各个镜像通过 Fastboot(或生产线上的 9008 / QFIL 工具)烧录到设备的对应物理或逻辑分区中。
# 进入 Fastboot 模式后,直接刷入签名后的镜像 fastboot flash boot signed_output/boot_signed.img fastboot flash vbmeta signed_output/vbmeta_signed.img fastboot flash xbl signed_output/xbl_signed.elf # 重启设备 fastboot reboot4 参考
https://source.android.com/docs/security/features/verifiedboot?hl=zh-cn
Secure boot and image authentication in mobile tech | Qualcomm
android手机系统的启动流程-secureboot流程(以MTK平台为例)_android secure boot怎么开启-CSDN博客