MDM9607平台 Secure Boot调试记录

目录

一 概述... 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

 

 

 

 

一 概述

安全启动是指为安全应用程序建立可信平台的启动序列。它以一个不变的启动序列开始,该序列使用加密身份校验来验证代码的来源,因此只能执行授权的软件。启动序列将设备置于已知的安全状态,防止用二进制修改软件和镜像重刷攻击。

 

安全启动系统向启动过程的每个阶段添加加密检查。每个过程判断设备执行的所有安全软件镜像的真实性。这个附加检查可防止任何未经授权或恶意修改的软件在设备上运行。安全启动通过一组硬件熔丝来启用。必须由硬件保险丝中标识的受信任签署实体程序才能被运行。

 

二 原理及流程

2.1 安全启动原理

设备的启动包含多个过程。每个过程中的镜像都会执行特定的功能,并且每个镜像都由上一个镜像(例如,主引导加载程序(PBL)→辅助引导加载程序(SBL)→ARM TrustZone)进行验证。根信任(启动此过程的最受信任的实体)是PBL,它是出厂固化在ROM中,因此已经受信任。在执行启动序列中的下一个镜像之前,首先对该镜像进行身份验证,以确保它是授权软件。例如,只有当SBL被PBL成功验证之后,才会让SBL运行。因为SBL现在是可信的,所以可以信任它来对下一个镜像进行身份验证。这些镜像通过其功能进一步建立了设备的安全性。

2.2 安全启动结构图:

MDM9607平台 Secure Boot调试记录_第1张图片

2.3 安全启动流程图

MDM9607平台 Secure Boot调试记录_第2张图片

 

三 证书简介

证书链用于对镜像进行身份验证。首先,验证镜像的证书链。例如,sbl使用appsbl的证书链对应用程序引导加载程序(appsbl)镜像进行身份验证。链中的认证证书根据中间证书进行认证(认证CA,反过来根据根CA进行认证(见下图)。根证书本身根据不可变区域中提供的散列进行身份验证–位于受信任区域中的QFPROM或qti的密钥表。

 

验证证书链后,使用认证证书(公钥A)中的公钥对其进行解密,来验证代码签名(签名D)。

MDM9607平台 Secure Boot调试记录_第3张图片

四 签名镜像格式

MDM9607平台 Secure Boot调试记录_第4张图片

安全启动场景:

MDM9607平台 Secure Boot调试记录_第5张图片

五 熔丝熔断

5.1 熔断使能

以下熔丝必须被熔断来使能安全启动:

MDM9607平台 Secure Boot调试记录_第6张图片

5.2 熔断过程

5.2.1 使用Sectorols.py工具生成一组自定义的熔丝熔断值。此工具生成具有以下格式的sec.dat二进制文件:

MDM9607平台 Secure Boot调试记录_第7张图片

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 重新启动后,将对所有预期的熔丝列表进行熔断。

流程框图如下:

MDM9607平台 Secure Boot调试记录_第8张图片

六 安全启动使能步骤

1 利用openssl工具生成证书链

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 配置Root-of-Trust to QFPROM eFuses

2.1 进入sectools目录,配置哈希值,使能secure boot:

   cd MDM9x07-LE2.0/common/sectools

   修改文件common/sectools/config/9607/9607_fuseblower_USER.xml,红色的为修改内容,一共有4处:

   1)

               contains the OEM public key hash as set by OEM

               root_cert_hash

               8ecf3eaa03f772e28479fa2f0bbae2141ccad6f106b384d1c46263edb5b02838

       

   这个哈希值就是步骤1.3最终生成的64位哈希值。

   2)

             PK Hash is in Fuse for SEC_BOOT1 : Apps

             SEC_BOOT1_PK_Hash_in_Fuse

             true

       

   3)

            PK Hash is in Fuse for SEC_BOOT2 : MBA

            SEC_BOOT2_PK_Hash_in_Fuse

            true

       

   4)

            PK Hash is in Fuse for SEC_BOOT3 : MPSS

            SEC_BOOT3_PK_Hash_in_Fuse

            true

       

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

\fuseblower_output\v1\debug\secdat_repr.txt

-p is platform or chipset and config files for platform are in \config\

-g to generate SEC.dat file

sec.dat文件会生成在\fuseblower_output\v1\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 签名镜像文件

MDM9607平台 Secure Boot调试记录_第9张图片

3.1 配置镜像签名配置文件9607_secimage.xml

         local

        

         qti_presigned_certs

         secboot_sha2_root

 

         2048

         3

 

         0

         1

 

        

        

         0x000480E1

         0x0000

         0x0000

         0x0000000000000002

 

         2048

         3

前几项配置对应配置使用Local\qti_presigned_certs-key2048_exp3文件夹下的密钥和证书

msm_part:每个平台芯片对应唯一一个JTAG ID可以读取下面的寄存器获取对应的值:

MDM9607平台 Secure Boot调试记录_第10张图片

oem_id和model_id我们使用默认值0;专用值可以向高通申请

3.2 签名镜像

用命令:python sectools.py secimage -h --chipset 9607 --sign_id LIST

可以列出工具支持签名的镜像

MDM9607平台 Secure Boot调试记录_第11张图片

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会生成在\secimage_output\9607\tz\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: /config/ /_secimage.xml

n Example: SecTools-Build-3.23\config\9607\9607_secimage.xml

 

Change 1

--------- 0x0000000000000000

0x002341A900000001

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 0x0000 0x0000 0x0000000000000002 0x002341A900000003 /*Add this line with chipset serial number*/

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)

你可能感兴趣的:(MDM9x07)