高通modem启动过程

HLOS kernel通过PIL加载MBA(Modem Boot Authenticator)到DDR
TrustZone 按照 mba.mdt的签名信息 对 mba 进行验证
HLOS kernel对Hexagon modem DSP 复位
Modem PBL(Primary BootLoader,位于rom中) 开始启动
HLOS kernel 通过PIL (Peripheral image loader) 加载modem image到DDR
Modem PBL验证MBA, 然后跳转到MBA

在msm8909平台上,需要签名的文件如下:

 boot_images/build/ms/bin/8909/emmc/sbl1.mbn 
 boot_images/build/ms/bin/8909/emmc/unsigned/prog_emmc_firehose_8909_ddr.mbn 
 LINUX/android/out/target/product/msm8909/emmc_appsboot.mbn 
 modem_proc/build/ms/bin/8909.gen.prod/mba.mbn 
 modem_proc/build/ms/bin/8909.gen.prod/qdsp6sw.mbn 
 rpm_proc/build/ms/bin/8909/pm8909/rpm.mbn 
trustzone_images/build/ms/bin/MAZAANAA/tz.mbn 
 wcnss_proc/build/ms/bin/SCAQMAZ/reloc/wcnss.mbn 

Modem Primary Boot Loader 的功能:

Sets up Hexagon TCM, copies MBA from LPDDR3 into Hexagon TCM, and authenticates MBA in Hexago TCM

Modem Boot Authenticator 的功能:
Authenticates the modem image, xPU protects the DDR regions for modem, and memory dump


签名镜像格式
Qualcomm Technologies 固件镜像使用标准 ELF 格式

ELF 标头主要用于定位 ELF 镜像文件中的程序标头。程序标头包含 ELF 镜像文件中所有段的位置,特别是用于定位 ELF 文件中的哈希段,其中包含用于验证 ELF 镜像的验证信息。

哈希段(hash segment)按顺序包含以下信息:

(1) 哈希段标头(元数据)是一个 48 字节的字段(Field),其中包含有关哈希段其他部分大小的信息。这允许在哈希段内识别字段。
(2) QTI 和设备制造商元数据字段都是 128 字节的字段,其中包含有关镜像的信息,例如镜像的类型和设计用于运行镜像的硬件。 QTI 元数据仅在镜像由 QTI 和设备制造商双重签名时才存在。
(3) 哈希表字段包含 ELF 文件中每个段(Segment)的哈希值。第一个条目(Entry)始终是 ELF 标头和程序标头的哈希值。这是为了确保标头段中的重要信息也得到验证(包括 ELF 标头中包含的镜像入口点地址)。
hash table field

(4) QTI签名和证书链。数字签名是根据哈希段标头、镜像元数据和哈希表(hash table)计算的。可以使用叶证书(Leaf Certificate)中的公钥对其进行验证。证书链最终由一个根证书验证,该根证书根据硬件中保存的 QTI 特定值进行验证。仅当镜像由 QTI 和设备制造商双重签名时,才应存在 QTI 签名和证书链。

(5) 设备制造商签名和证书链。与 QTI 签名和证书链一样,数字签名是根据哈希段标头、图像元数据和哈希表计算的,它可以使用证书链叶节点中的公钥进行验证,该公钥可以最终通过根证书进行验证,根证书根据硬件中的 OEM 特定值进行验证

镜像元数据(Image Metadata)描述了镜像的意图(intent)。最重要的是,它描述了镜像的意图(以便在要加载 Qualcomm TEE 镜像时系统不会加载 WLAN 镜像)和用于执行镜像的硬件(以便系统不会在 Qualcomm® Snapdragon™ 845 设备上加载 Snapdragon 835 的 Modem 镜像)。

在旧版本的 QTI 安全启动架构中,此信息已被编码到证书链中叶证书的组织单位(OU,Organizational Unit)字段中。新版本的安全引导格式将此信息移动到独立的元数据字段中。这旨在通过降低解析或证书创建错误的可能性来提高安全性,这些错误可能导致镜像不具有设备制造商预期的属性。

元数据字段允许签名者指定有关镜像的信息,包括以下内容:

镜像的软件标识(SW_ID)。每种不同的镜像类型都有不同的软件标识。这是为了确保在引导过程中正确的时间点加载正确的镜像。
设备的硬件标识(HW_ID)。每个 QTI 芯片组都有不同的硬件标识。这是为了确保只有那些被设计为在该硬件上执行的镜像才能在该硬件上执行。
设备制造商标识(OEM_ID)。这是为了确保由一个设备制造商签名的软件不能在另一个制造商的设备上运行,即使它们共享一个公共根证书。
设备的调试功能。某些镜像允许签名者在设备上启用调试功能;但是,签名者只能在特定设备(必须在镜像签名时标识)上使用这些功能。
镜像是绑定到单个设备还是可以在所有设备上使用。出于开发和调试目的,可以通过指定设备的序列号并在镜像元数据字段中设置标志来将镜像绑定到单个设备。每个设备都有一个不同的序列号,该序列号在制造过程中被烧入芯片中。
镜像的防回滚版本号。如果启用,则防回滚系统将防止已知存在错误的镜像在设备上运行。该架构旨在防止设备在成功加载具有更大防回滚版本号的镜像时接受镜像。

如果镜像由 QTI 和设备制造商签署,则 QTI 和设备制造商都将提供镜像元数据字段。两个元数据字段中的所有条件都必须有效才能加载镜像。

镜像加载

所有镜像加载都遵循相同的通用过程。在本节中,我们将加载镜像的软件称为“加载程序”(Loader)。流程如下:

加载程序分配一个安全的内存区域来加载 ELF 标头,该内存将被映射(mapped)以防止它被设备中的其他执行环境篡改,加载程序将 ELF 标头从(不受信任的 untrusted)存储(storage)复制到此内存中。如果因 ELF 标头太大而无法放入此内存区域,则镜像将被拒绝。

加载程序分配一个安全的内存区域来加载程序头(Program Header),该内存将被映射以防止它被设备中的其他执行环境篡改,加载程序将程序标头从(不受信任的)存储复制到此内存中。如果因程序标头太大而无法放入此内存区域,则镜像将被拒绝。

加载程序分配一个安全的内存区域来加载哈希段(hash segment),该内存将被映射以防止它被设备中的其他执行环境篡改,加载程序将哈希段从(不受信任的)存储复制到此内存中。如果因哈希段太大而无法放入此内存区域,则镜像将被拒绝。

加载程序通过验证根证书、证书链、镜像元数据和哈希表(hash table)来验证哈希段(hash segment)。

加载程序通过计算(已加载的)ELF 头 和 程序头 的哈希值并将哈希值与哈希表中的第一个条目进行比较来验证它们。如果哈希值不匹配,则镜像将被拒绝。

The loader validates the (already loaded) ELF Header and Program Header by hashing them and
comparing the hash value with the first entry in the hash table. If the hashes do not match, the
image is rejected.

然后加载程序将尝试加载镜像中的其他每个 ELF 段。对于每个段,加载程序检查整个段是否可以加载到其已批准(列入白名单)的安全且适合该镜像的内存区域中,如果无法加载段到内存的白名单区域,则镜像将被拒绝。

The loader will then attempt to load each of the other ELF segments in the image. For each
segment, the loader checks that the entire segment can be loaded into an area of memory that
has been approved (whitelisted) by the loader as safe and appropriate for that image. If a
segment cannot be loaded into a whitelisted area of memory, the image is rejected.

加载程序通过计算每一个加载的 ELF 段的哈希值并将哈希值与哈希表中的相应条目进行比较来验证。如果任何计算的哈希值与哈希表中的值不同,则镜像将被拒绝。
The loader verifies each of the loaded ELF segments by hashing them and comparing the hash
value with the corresponding entry in the hash table. If any of the computed hash values differ
from the value in the hash table, the image is rejected.

如果合适,加载程序使用在(已经加载和验证的)ELF 标头中定义的入口点将执行传递给镜像。

If appropriate, the loader passes execution to the image using the entry point defined in the
(already loaded and validated) ELF Header.

此过程旨在确保加载程序永远不会意外覆盖包含从不受信任的存储中加载的镜像数据的内存中的重要数据(包括加载程序自己的代码和数据)。


Modem Image modification
Modem image patching

Modem binaries are unencrypted on disk
modem 二进制代码以未加密的形式保存在 文件系统中
This facilitates easy disassembly, and easy patching
这有助于 反汇编 和打补丁
Secboot prevents unsigned images from loading
但是,安全启动机制,阻止 载入未签名的映像。
Signature verification performed in secure world
签名验证 执行在 安全世界 (Trustzone)

Leverages a integer overflow to achieve an arbitrary write into the trustzone, and patches two bytes to neuter signature checking.

Prereqs: ability to compile your own kernel and flash it,
Modem internal hashes still need to be consistent

https://github.com/eti1/tzexec
https://github.com/eti1/pymdt
https://github.com/laginimaineb/unify_trustlet


mdt: contains headers and information (certificate chain and signature blob) used to verify *.bxx

———————-
A bug can bypass the MBA to inject Hexagon code
– Ability to read/write modem memory at any time from the Linux kernel
– Reported to Qualcomm, patch in development
————————-

missing sections with critical OTA vectors code (q6zip decompressed & relocated in runtime)

——————
hash table segment 也是一个elf segment,只是qualcomm为这个hash table segment设置了自定义的格式。

hash table segment 包含:
mbn header: hash table segment各个field的位置信息
QTI metadata: Qualcomm对当前image设置的一些信息
OEM metadata: OEM对当前image设置的一些信息
Hash Table: 该ELF文件的{ elf header + program header}的hash、其他elf segments的hash
QTI signature
QTI Cert Chain
OEM signature
OEM Cert Chain
0xFF padding


QTI signature/OEM signature所对应的原文范围都是 { mbn header, QTI metadata, OEM metadata, Hash Table }

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注