目录
一 概述... 4
二 原理及流程... 4
2.1 安全启动原理... 4
2.2 安全启动结构图:... 5
2.3 安全启动流程图... 5
三 证书简介... 6
四 签名镜像格式... 7
五 熔丝熔断... 7
5.1 熔断使能... 7
5.2 熔断过程... 8
5.2.1. 8
5.2.2. 8
5.2.3. 8
5.2.4. 8
5.2.5. 8
5.2.5. 9
5.2.6. 9
六 安全启动使能步骤... 9
1 利用openssl工具生成证书链... 9
2 配置Root-of-Trust to QFPROM eFuses. 10
3 签名镜像文件... 11
七 调试策略... 13
附录... 15
名词及缩写:... 15
参考文档:... 16
安全启动是指为安全应用程序建立可信平台的启动序列。它以一个不变的启动序列开始,该序列使用加密身份校验来验证代码的来源,因此只能执行授权的软件。启动序列将设备置于已知的安全状态,防止用二进制修改软件和镜像重刷攻击。
安全启动系统向启动过程的每个阶段添加加密检查。每个过程判断设备执行的所有安全软件镜像的真实性。这个附加检查可防止任何未经授权或恶意修改的软件在设备上运行。安全启动通过一组硬件熔丝来启用。必须由硬件保险丝中标识的受信任签署实体程序才能被运行。
设备的启动包含多个过程。每个过程中的镜像都会执行特定的功能,并且每个镜像都由上一个镜像(例如,主引导加载程序(PBL)→辅助引导加载程序(SBL)→ARM TrustZone)进行验证。根信任(启动此过程的最受信任的实体)是PBL,它是出厂固化在ROM中,因此已经受信任。在执行启动序列中的下一个镜像之前,首先对该镜像进行身份验证,以确保它是授权软件。例如,只有当SBL被PBL成功验证之后,才会让SBL运行。因为SBL现在是可信的,所以可以信任它来对下一个镜像进行身份验证。这些镜像通过其功能进一步建立了设备的安全性。
证书链用于对镜像进行身份验证。首先,验证镜像的证书链。例如,sbl使用appsbl的证书链对应用程序引导加载程序(appsbl)镜像进行身份验证。链中的认证证书根据中间证书进行认证(认证CA,反过来根据根CA进行认证(见下图)。根证书本身根据不可变区域中提供的散列进行身份验证–位于受信任区域中的QFPROM或qti的密钥表。
验证证书链后,使用认证证书(公钥A)中的公钥对其进行解密,来验证代码签名(签名D)。
安全启动场景:
以下熔丝必须被熔断来使能安全启动:
5.2.1 使用Sectorols.py工具生成一组自定义的熔丝熔断值。此工具生成具有以下格式的sec.dat二进制文件:
5.2.2 生成的sec.dat文件被烧写到设备nand中的sec分区。以下命令用于将sec.dat烧写到sec分区中:
Fastboot flash sec
5.2.3 在烧写后的下一次重新启动中,SBL1从设备读取SE分区数据并将其加载到TrustZone DDR区域
5.2.4 在跳转到appsbl之前,trustzone确定是否已发生熔丝熔断。这是通过读取QFPROM_RAW_RD_WR_PERM_MSB中的OEM_SEC_BOOT位是否断开来完成的。
5.2.5 如果没有断开,trustzone将解析DDR中加载的sec.dat文件,并逐个解析熔丝列表中的熔丝值。
5.2.5 要强制执行熔丝值,TrustZone将重新启动设备
5.2.6 重新启动后,将对所有预期的熔丝列表进行熔断。
流程框图如下:
1.1 新建临时目录tmp
mkdir tmp
cd tmp
1.2 复制opensslroot.cfg和v3.ext到tmp目录,这两个文件在后面的命令中要用到:
cp MDM9x07-LE2.0/common/sectools/resources/data_prov_assets/General_Assets/Signing/openssl/opensslroot.cfg .
cp MDM9x07-LE2.0/common/sectools/resources/data_prov_assets/General_Assets/Signing/openssl/v3.ext .
1.3 生成自签名根密钥对和证书以及认证CA密钥对和证书:
openssl genrsa -out oem_rootca.key -3 2048
openssl req -new -key oem_rootca.key -x509 -out oem_rootca.crt -subj /C="US"/ST="CA"/L="SANDIEGO"/O="OEM"/OU="General OEM rootca"/CN="OEM ROOT CA" -days 7300 -set_serial 1 -config opensslroot.cfg
openssl genrsa -out oem_attestca.key -3 2048
openssl req -new -key oem_attestca.key -out oem_attestca.csr -subj /C="US"/ST="CA"/L="SANDIEGO"/O="OEM"/OU="General OEM attestation CA"/CN="OEM attestation CA" -days 7300 -config opensslroot.cfg
openssl x509 -req -in oem_attestca.csr -CA oem_rootca.crt -CAkey oem_rootca.key –out oem_attestca.crt -set_serial 5 -days 7300 -extfile v3.ext
openssl x509 -in oem_rootca.crt -inform PEM -out oem_rootca.cer -outform DER
openssl x509 -in oem_attestca.crt -inform PEM -out oem_attestca.cer -outform DER
mv oem_rootca.key qpsa_rootca.key
mv oem_attestca.key qpsa_attestca.key
mv oem_rootca.cer qpsa_rootca.cer
mv oem_attestca.cer qpsa_attestca.cer
openssl dgst -sha256 qpsa_rootca.cer
这个命令产生的哈希值在后面会用到:
SHA256(qpsa_rootca.cer)=8ecf3eaa03f772e28479fa2f0bbae2141ccad6f106b384d1c46263edb5b02838
1.4.将产生的qpsa_rootca.key,qpsa_attestca.key,qpsa_rootca.cer,qpsa_attestca.cer复制到MDM9x07-LE2.0/common/sectools/resources/data_prov_assets/Signing/Local/qti_presigned_certs-key2048_exp3目录:
cp qpsa_rootca.key qpsa_attestca.key qpsa_rootca.cer qpsa_attestca.cer MDM9x07-LE2.0/common/sectools/resources/data_prov_assets/Signing/Local/qti_presigned_certs-key2048_exp35
注意:qti_presigned_certs-key2048_exp35此目录里面不要再建文件夹否则后面用工具生成sec.dat时会报错
2.1 进入sectools目录,配置哈希值,使能secure boot:
cd MDM9x07-LE2.0/common/sectools
修改文件common/sectools/config/9607/9607_fuseblower_USER.xml,红色的为修改内容,一共有4处:
1)
这个哈希值就是步骤1.3最终生成的64位哈希值。
2)
3)
4)
2.2 生成sec.dat文件:
python sectools.py fuseblower -p 9607 -g –d
Here,
-d is for debug information which generate file with fuse information in file
-p is platform or chipset and config files for platform are in
-g to generate SEC.dat file
sec.dat文件会生成在
根据9607_fuseblower_OEM.xml、9607_fuseblower_QTI.xml、9607_fuseblower_USER.xml这三个配置文件可生产的sec.dat带四中功能:
1. Secure boot Enable
2. JTAG access disable
3. Anti rollback Enable
4. Read/Write permissions disable/enable for fuses
具体可参见相关文档,本文只打开了Secure boot
3.1 配置镜像签名配置文件9607_secimage.xml
前几项配置对应配置使用Local\qti_presigned_certs-key2048_exp3文件夹下的密钥和证书
msm_part:每个平台芯片对应唯一一个JTAG ID可以读取下面的寄存器获取对应的值:
oem_id和model_id我们使用默认值0;专用值可以向高通申请
3.2 签名镜像
用命令:python sectools.py secimage -h --chipset 9607 --sign_id LIST
可以列出工具支持签名的镜像
9607平台分别需要签名的镜像有:sbl1.mbn、NPRG9x07.mbn、ENPRG9x07.mbn、prog_nand_firehose_9x07.mbn、tz.mbn、appsboot.mbn、rpm.mbn、mba.mbn、qdsp6sw.mbn、mcfg_hw.mbn、mcfg_sw.mbn
Eg:签名TZ
python sectools.py secimage -s -i input/tz.mbn -g tz -p 9607 --cfg_selected_cert_config=qti_presigned_certs-key2048_exp3
Here,
-s: sign the image.
-i: path to the image file to sign.
-g: sign id corresponding to the image_file provided.
-p: id of the chipset corresponding to the image_file.
--cfg_selected_cert_config: cert config selection file.
签名之后的tz.mbn会生成在
qdsp6sw.mbn、mba.mbn 、mcfg_hw.mbn、mcfg_sw.mbn签名完成后打包成NON-HLOS.ubi
最后将镜签名后的所有镜像烧入设备中,重启检测设备是否能正常启动(文件烧录高通建议用QFILE工具)
启动后可通过读QFPROM_RAW_OEM_SEC_BOOT_ROW0_LSB | 0X000A01D0寄存器的值来判断是否开启安全启动。
/system/bin/r 0x000A01D0 若值为0x303030 说明安全启动已开启
要从安全启动的设备获取所有信息作为ramdump的一部分,请使用debug on+crashdump on和串口号对sbl1.mbn映像进行签名,如下所示:
n File name:
n Example: SecTools-Build-3.23\config\9607\9607_secimage.xml
Change 1
---------
The crash_dump option field contains 32-bit chipset serial number (e.g.: 0x002341A9) + 32-bit crash dump ON option.
The serial number is unique to each chipset. To dump serial number from device use the ADB command:
>>adb root >> adb shell /system/bin/r 0x000A60A8
Change 2
----------- msm_part>0x009600E1
The debug option field contains 32-bit chipset serial number (Ex: 0x002341A9) + 32-bit DEBUG option.
Acronym or term |
Definition |
APPS |
Applications processor |
APPS PBL |
Applications primary boot loader |
APPSBL |
Applications boot loader |
CA |
Certificate authority |
CSMS |
Code signing management system |
CASS |
Code authorization signing services |
DDR |
Double data rate |
DN |
Distinguished name |
ELF |
Executable and linking format |
eMMC |
Embedded multimedia card |
eMMCBLD |
Qualcomm image used for downloading emmc |
FEC |
Forward error correction |
HLOS |
High-level operating system |
HMAC |
Hashed message authentication code (RFC 2104) |
JTAG |
Joint test action group |
KDF |
Key derivation function |
MBA |
Modem boot authentication |
MRC |
Multiple root certificates |
MSA |
Modem self authentication |
MSS |
Modem subsystem |
OCIMEM |
On-chip internal memory |
OU |
Organizational unit name |
PBL |
Primary boot loader |
PHK |
Primary hardware key |
PIL |
Peripheral image loading |
QFPROM |
Qualcomm fuse-programmable read-only memory |
QGIC |
Qualcomm generic interrupt controller |
QPSA |
Qualcomm platform signing application |
RMB |
Relay message buffer |
RPM |
Resource power manager |
RPMB |
Replay protected memory block |
SBL |
Secondary boot loader |
SCM |
Secure channel manager |
SDI |
System debug image |
SDRAM |
Synchronous dynamic random access memory |
SFS |
Secure file system |
SHK |
Secondary hardware key |
SMC |
Secure monitor call |
SPS |
Qualcomm smart peripheral subsystem |
SRoT |
Secure root of trust |
TCM |
Tightly coupled memory |
TZBSP |
Trustzone board support package |
TZExec |
Trustzone executive |
VMIDMT |
Virtual machine id mapping table |
WCN |
Wireless communication network |
80-p2200-39_c_enabling_secure_boot_on_mdm9x07_mdm8207_mdm9628_mdm9206_asics.pdf
80-p9116-1_c_qualcomm_firehose_validated_image_programming_guide.pdf
80-p5279-1_d_mdm_sdx_platforms_firehose_download.pdf
FuseBlower Tool User Guide (80-NM248-3)