关于移动设备启动安全和Qualcomm平台Secure Boot机制、BL锁的简谈

在我们讨论到“刷机”“root”时,我们总是绕不开一个大前提,就是解锁bootloader,在各大设备制造商的官网也都指出了解锁bootloader是一种不安全的行为,那么为什么bootloader能确保我们的设备安全呢

首先,我们需要了解bootloader是什么

来自百度百科“BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。”

那么我们就需要知道,bootloader是如何一步一步成功启动设备,并且保证操作系统可信的呢?

首先,在Qualcomm平台,bootloader由几部分组成,它们会在CPU上电后一一执行,并且帮助我们成功启动系统

  1. PBL:PBL是处理器上电后第一个执行的代码,这段代码是在处理器出厂时写死的,不可更改,它的作用是校验并加载下一级(XBL)进行启动,同时它还提供了一个烧录模式:EDL,如果加载XBL失败,或者校验不通过,就会进入EDL模式,这时我们就会在电脑上看到9008端口,可以使用QFIL进行完整固件的写入,来“救砖”,关于EDL的更多细节,将会在下文进行说明
  2. XBL:它的主要作用是初始化一些硬件环境,如DDR, clocks和USB等和代码安全环境(TrustZone),并且加载QSEE高通可信执行环境,并且校验加载ABL,这部分程序与PBL不同,在手机UFS(字库)里面,所以可以被升级。
  3. ABL:它的主要任务是校验加载Linux kernel(boot.img),并且提供fastboot协议,根据按键状态决定进入fastboot还是进入recovery,还是直接校验加载Linux kernel
  4. Linux kernel:内核加载后会进入用户态执行init,并且最终拉起Launcher,到这里,操作系统完成启动。

那么,回到最开始的问题,为什么解锁BL,就可以启动一个第三方操作系统,并且会变得不安全

在上文中,提到了多次“校验并加载”,每一级bootloader在加载下一级bootloader时,会比对数字签名,来确保所加载的bootloader是手机厂商的可信bootloader,也就是说,如果这个启动链的任何一个安全环节被破坏了,都会导致最终启动的操作系统不可信,我们所说的“解锁BL”就是在这一整个环节,关闭一个环节对下一个环节的校验,通常特指ABL不校验bootimg,而直接进行启动,所以无论是面具还是kernelsu,都是通过改bootimg来实现的。

有的小伙伴会说,那我们能不能暴力修改那个数字签名的公钥,改成我们自己签发的公钥,这样就可以绕过整个安全启动机制了

可惜想法很美好,现实很苦感。如果我们修改ABL,会导致XBL进行校验时不通过,那我们如果直接把PBL一把改掉呢?

PBL用了两个机制来确保启动是安全的

首先,PBL本体是写死在CPU里面的,只有TEE有权限读取,但是没办法写入(貌似近几年的可以了?我在读XBL日志时看到了一个pbl_patch的数值,可能通过efuse吧)设备厂商的公钥存在CPU的efuse里面,物理熔断区域,一旦写入,无法更改,要写入的数据存在于UFS的secdata分区里,CPU第一次上电时会检查是否有该分区,如果有,将会根据分区内容写入efuse并开启secure boot开关(同样写入efuse),如果没有,将不会进行熔断,并且secboot为no

也就是说,secure boot开关一旦打开,就无法关闭,除非找到bootrom的漏洞,我们就无法更改ABL和ABL之前的启动环节,但是如果有漏洞呢

苹果A系列处理器曾经有一个checkmate漏洞,利用该漏洞,我们可以绕过苹果的安全启动机制,甚至加载一个安卓系统

联发科天玑芯片也有漏洞,比如amonet,还有之前联发科机型强解BL,也是利用bootrom的漏洞,这里附一张图

可以看到,我们的root,magisk是工作在EL0权限下的,有时可以达到EL1权限,而weishu的kernelsu是工作在EL1权限下的,但是都没有权限访问EL2或者更高的权限,Secure world为TEE空间,这里我们后面会说

但是我们如果找到bootrom的漏洞,我们就能轻而易举拿到EL3最高权限,可以任意控制TEE可信执行环境,XBL,ABL,Linux kernel和下面的执行空间,也就是绕过了secure boot来启动了一个不可信的操作系统,这也就解释了为什么能强解BL,也就是在EL3环境执行了一段脚本,修改了RPMB分区的解锁标志位,通常这个分区会有专用的密钥进行保护,并且由TEE接管,但是TEE工作在EL3等级以下,我们就可以拿到RPMB key并且修改分区文件,进行解锁BL,关于TEE部分,我会单独出一个文章进行说明。

这就是Qualcomm平台的安全启动全流程

下面对于一些名词进行解释:

EDL:高通紧急下载模式,只要硬件没坏,这个模式就不会没,就算UFS换成新的,我们依旧可以写入工厂固件来建立分区表,进行RPMB绑定,Attestation key的导入后刷入正常的系统包,并且momo不会出现TEE损坏(只要不是你手机不支持TEE,使用高通芯片的设备其实都可以修复momo的tee损坏的,因为那个只看你attestation key的状态,但那个KEY在工厂包里是可以被导入进RPMB分区的),EDL原理是通过USB加载一个临时的XBL,来刷写字库的,这也就说明了小米是如何进行EDL身份验证的,小米通过secboot分区将通过USB加载XBL的文件数字签名公钥写入efuse,每次使用miflash刷机时,会让你登录有权限的小米账号,如果通过,小米服务器就会给你的文件进行签名,如果你使用了高通QFIL刷机,会因为签名校验不过而强制报错。

RPMB:RPMB(Replay Protected Memory Block重放保护内存块)Partition 是 eMMC 中的一个具有安全特性的分区。eMMC 在写入数据到 RPMB 时,会校验数据的合法性,只有指定的 Host 才能够写入,同时在读数据时,也提供了签名机制,保证 Host 读取到的数据是 RPMB 内部数据,而不是攻击者伪造的数据。RPMB通过RPMB key来判断访问是否合法,这个KEY只能写入一次,一般是CPU通过内部的PRNG(随机数发生器)来生成一段key并且写入ufs的otp区域,一个UFS只能写入一次,写入后不可更改(当然不排除UFS供应链厂商有一些方法更改这个区域)

作者:QWEOVO

参考资料:

  1. 小米安全白皮书:https://trust.mi.com/zh-CN/security
  2. Weishu notes:https://weishu.me/2021/07/24/what-is-bootloader-unlock/
  3. 腾讯云-高通可信执行环境:https://cloud.tencent.com/developer/article/1043597
  4. Reprogram-TEE-on-Qualcomm-devices:https://github.com/chiteroman/Reprogram-TEE-on-Qualcomm-devices
  5. 高通的可信执行环境—QSEE:https://blog.csdn.net/weixin_42135087/article/details/129275342
  6. Vulnerability analysis of Qualcomm Secure Execution Environment (QSEE): https://www.sciencedirect.com/science/article/abs/pii/S016740482200027X
  7. THE ROAD TO QUALCOMM TRUSTZONE APPS FUZZING:https://research.checkpoint.com/2019/the-road-to-qualcomm-trustzone-apps-fuzzing/
  8. Bootloader:https://en.wikipedia.org/wiki/Bootloader
  9. RPMB原理介绍:https://blog.csdn.net/shenjin_s/article/details/79868375
  10. 蛋蛋读UFS之八:RPMB:http://www.ssdfans.com/?p=92765
  11. RPMB说明与使用(Replay Protected Memory Block):https://developer.aliyun.com/article/1306003

12、Secure Boot and Image Authentication-Qualcomm:https://www.qualcomm.com/content/dam/qcomm-martech/dm-assets/documents/secure-boot-and-image-authentication-version_final.pdf

Author:QWEOVO
您的赞赏将会有助于我的开发和网站运营,谢谢你们
Express Your Appreciation,Your support will greatly contribute to my development and website operations. Thank you all!
下一篇