Qualcomm 信任链
撰写于 2018 年 9 月 17 日,作者:Nolen Johnson (@npjohnson)
Qualcomm 信任链是一个复杂但易于理解的过程集合。 你们中的许多人可能听说过“引导加载程序”这个术语,但不知道它实际上是什么,或者做什么。
在今天的文章中,将涵盖以上内容,因为它与 Qualcomm 芯片组有关。
词汇表
- 引导加载程序:引导链中的一个通用术语,它在每次冷启动时运行一个特定的作业
- 冷启动:从断电状态开始的全新启动
- QFUSE:集成到 SoC 中的微观硬件熔丝 - 一旦物理熔断,就无法重置或更换
- SoC:片上系统(您手机的“主板”之类的东西)
- EFUSE:基于软件的熔丝,其数据存储在 QFPROM 中
- QFPROM:Qualcomm 的熔丝区域
- TrustZone:Qualcomm ARM 芯片组的“安全世界”实现
- QSEECOM:一个 Linux 内核驱动程序,允许我们与 TrustZone 通信,并向 TrustZone 发出 SCM 调用以执行熔断等操作。 它只允许执行签名的小程序和批准的调用
- SCM:安全通道管理器(注意:与 Linux 的 SMC 调用无关)
- DTB:设备树 Blob。 其目的是“为 Linux 提供一种描述不可发现硬件的方法”,在此处阅读更多信息here
- Android 验证启动 (AVB):在 aboot/ABL 级别实施的一套严格检查,用于验证操作系统各个部分的完整性,在此处阅读更多信息here
- DM-Verity:Android 验证启动的一个组件,用于检查分区,以查看它们之前是否已以读/写方式挂载,在此处阅读更多信息here
- system_as_root:android 的一种新的挂载设置逻辑,它将系统分区挂载为“/”而不是“/system”。 这意味着系统文件现在位于“/system/system”。 这是 Qualcomm 检查“/”是否在验证启动下被重新挂载为读/写的一种方法。 它还引入了新标准,即 Android ramdisk 存储在系统分区上,而不是存储在引导镜像中
什么是 Qualcomm 的信任链/引导顺序?
Qualcomm 设备的信任链、引导加载程序顺序和安全世界。
信息
按照定义,引导加载程序是一个程序,当设备启动时,它会加载操作系统或链式加载另一个引导加载程序。
Qualcomm 设备都使用基于熔丝的逻辑来指示永久功能配置/密码密钥集。 如上所述,物理版本称为 QFUSE,并以行存储在 SoC 上名为 QFPROM 的区域中。
如果标记为 Qualcomm 安全启动的 QFUSE 熔丝行被熔断(在非中国/OnePlus 设备上就是这种情况),则从 BootROM(SoC 上的非可写存储器)验证 PBL(Qualcomm 的主引导加载程序)并将其加载到内存中。 然后执行 PBL 并启动少量硬件,然后验证链中下一个引导加载程序的签名,加载它,然后执行它。 链中的下一个引导加载程序是 SBL*/XBL(Qualcomm 的辅助/可扩展引导加载程序)。 这些早期引导加载程序启动核心硬件,如 CPU 核心、MMU 等。 它们还负责启动与 Android 并行的核心进程,例如 Qualcomm ARM 芯片组的安全世界,称为 TrustZone。 SBL*/XBL 的最后一个目的是验证 aboot/ABL 的签名、加载和执行 aboot/ABL。 Aboot 是你们大多数人所说的“引导加载程序模式”,因为它容纳了 fastboot 或 OEM 固件刷写工具等服务。 Aboot 启动大多数剩余的核心硬件,然后通常验证引导镜像的签名,通过 dm-verity 向 Android 验证启动报告 verity 状态,然后在前两个步骤成功后,将内核/ramdisk/DTB 加载到内存中。 在许多设备上,Aboot/ABL 可以配置为跳过密码学签名检查,并允许启动任何内核/引导镜像。 在 aboot 将所有内容加载到内存后,内核(在我们的例子中是 Linux)然后从引导镜像解压缩 ramdisk,或者在 system_as_root 配置中,系统分区被验证并挂载在“/”上,ramdisk 从那里提取。 在此之后不久,init 被执行,这将启动我们所知的 Android。
禁用 aboot/ABL 中密码学检查的配置选项通常称为“引导加载程序锁定状态”。 当设备被称为“已锁定”时,这意味着 aboot 当前正在 aboot/ABL 上对设备的引导镜像强制执行数字签名完整性检查,并且在较新的设备上,强制执行“绿色”Android 验证启动状态。 这些“已锁定”的设备不允许用户刷写分区,并且无法启动自定义的未签名内核。 如果锁定设备被认为是安全的,Android 验证启动通常会报告“绿色”并允许设备继续启动;如果被认为是不安全的,它将报告“红色”状态并阻止设备启动。 在“未锁定”的设备上,aboot/ABL 允许设备刷写,并且一些 OEM 允许从内存启动未签名的引导镜像(fastboot boot),在这种情况下,验证启动报告“橙色”或“红色”,具体取决于镜像是否已签名,但无论如何都允许设备继续启动。
链的成熟度
在过去的十年中,Qualcomm 信任链的安全性得到了极大的提高。
以下图表描述了信任链的成熟过程
2013 年之前时代
2013-2016 年时代
现代(2016-2018 年)时代
正如您所见,引导链已发生了重大演变。 在 2015 年,可能的攻击区域被缩小,并且辅助引导加载程序 (SBL) 链被合并为一个统一的 SBL。 随着我们进一步发展,我们看到 SBL 完全被 Qualcomm 的新型专有解决方案可扩展引导加载程序 (XBL) 取代,这减轻了 SBL 带来的许多安全问题。
Aboot 也从具有一些附加功能的 LittleKernel(一个开源引导加载程序)发展成为现在称为专有 Android 引导加载程序 (ABL) 的完全独立的解决方案。 这种新的引导加载程序允许使用 UEFI,以及为开发人员/OEM 提供的许多其他安全性和生活质量增强功能。
system_as_root 配置也提高了安全性以及总体架构。 它将 Android-ramdisk 从存储在引导镜像中移动到存储在系统分区中,顾名思义,系统分区被挂载为“/”。 这样做部分是为了允许它通过 dm-verity/Android 验证启动进行验证。
注意:新的无缝更新系统“A/B”与 system_as_root 是分开的,即使它们通常一起出现。 OEM 可以选择仅实施其中一个,而不是另一个。
OEM 添加
许多 OEM 在其引导加载程序集中实施额外的密码学检查,以尝试进一步提高安全性,或提供功能(例如允许最终用户解锁引导加载程序)。
几个常见的例子
- 三星使用 eMMC CID/aboot 镜像中 CID 的相应哈希 blob 来指示开发者(解锁)状态。
- 三星的“KNOX”QFUSE,在任何入侵时都会熔断,并且可以配置为在触发时擦除设备。
- 摩托罗拉使用单个 QFUSE,必须熔断才能解锁设备,永久使保修失效。
- 索尼使用密码学 blob 和其“TA”分区上的位集来允许解锁。
OEM 通常还实施他们自己的专有模式,该模式具有多种用途。 一些示例包括
- 三星用于固件刷写的专有下载模式。
- LG 用于固件刷写的专有 LAF(下载)模式。
- 谷歌用于固件刷写的 OSS Fastboot 模式。
OEM 特定功能/模式通常比通用解决方案具有主要优势,例如摩托罗拉是最早扩展 fastboot 协议以允许刷写稀疏分块系统镜像的 OEM 之一。 然而,这些解决方案也很可能存在不可预见的安全漏洞,例如 LG 频繁的 LAF 模式漏洞,或SamDunk漏洞,该漏洞使用三星的 CID 方法解锁原本无法解锁的设备)。
同样重要的是要注意,虽然 OEM 可以自定义 aboot/ABL,并且以一定的价格自定义 SBL*/XBL,但 PBL 是由 Qualcomm 自己在 SoC 上构建和分发的。 PBL 很少看到公开漏洞,因为大多数漏洞都通过 Qualcomm 的漏洞赏金计划获得了丰厚的赏金,尽管 PBL 之前也出现过一些公开漏洞,例如 Aleph Security 的 EDL(Qualcomm 下载模式)漏洞,您可以在here阅读相关信息。