启动顺序内的 Android 验证启动

信息安全 安卓 开机 可信引导
2021-08-25 14:08:02

我有兴趣了解 Android 中经过验证的启动过程,但我无法找到有关该过程某些属性的见解。

从到目前为止我收集到的信息中,我了解到在 Android 设备中,使用 支持验证的启动过程dm-verity,它检查要加载的操作系统所在的内存块的签名哈希。此外,当前大多数(如果不是全部)基于 ARM 处理器的设备都具有 TrustZone 功能,用于创建所谓的“安全世界”和“不安全世界”。

我想了解的是这一切是如何结束的:

  1. 在Android启动过程中什么时候dm-verity运行?
  2. 是否dm-verity从“安全世界”中运行?如果是这样,如何验证“安全世界”操作系统加载?
  3. 在启动过程中,TrustZone“世界”功能第一次被访问/激活是什么时候?
2个回答

AVB 由引导加载程序强制执行,dm-verity 由内核强制执行。两者都在android boot flow中连续运行

在工厂:

  1. OEM 构造/system/vendor产品ODM分区的哈希树。Hashtree 不是为/boot/vbmeta分区构造的。

  2. 在 vbmeta 分区中,OEM 写入引导映像的散列描述符,其中包含引导映像的散列。OEM 还编写其他分区的哈希描述符,其中包含哈希树的根哈希和盐。

  3. OEM 使用 OEM 私钥对 vbmeta 进行签名,并将其签名附加到 vbmeta 映像本身。OEM 公钥在构建时被硬编码在 android bootloader (ABL) 中。

开机时:

  1. ABL 使用 OEM 公钥验证 vbmeta 上的签名。

  2. ABL 在加载时计算引导映像的哈希值,并与存储在 vbmeta 中的映像进行验证。

  3. 验证 boot.img(包含内核)后,加载内核并启动内核 dm-verity。

  4. 内核重建除 /boot 之外的每个分区的哈希树,并将它们的根哈希与存储在 vbmeta 中的哈希树进行比较。

  5. 如果所有哈希值都匹配,设备将启动并锁定屏幕。

AVB 2.0

链分区用于委托权限,例如企业设备和运营商设备。如果企业想要包括额外的分区,链分区的 vbmeta 存储在页脚中,或者如果有多个链分区,vbmeta_enterprise可以创建一个单独的验证所有链分区。它由企业的私钥(key1)签名。然后将公钥 (key1_pub) 存储在原始 vbmeta 分区中。只需使用链分区的新描述符更新原始 vbmeta 映像并删除公钥,即可轻松撤销此委托权限key1_pub

AVB 的信任链从 ABL 开始,因此可以用您自己的公钥替换 OEM 公钥,并按照与 OEM 相同的过程重新签署 vbmeta。为了保护 ABL 免受篡改,生产 SoC 强制执行secure-boot. 为了实现安全启动,生产设备的电子保险丝在工厂中熔断,这是不可逆转的。Fastbootunlockunlock_critical命令不会关闭安全启动。即使是 fastboot 命令也可以破坏原型设备的 eFuse,从而永久启用 SoC 的安全启动。

fastboot oem SecureBoot EnableFuse

在 Qualcomm Snapdragon SoC 中,ABL 由 Xtended Bootloader (XBL) 验证,XBL 由 Primary Bootloader (PBL) 验证。PBL 被刻录在 CPU 芯片上,其公钥存储在 eFUSE 中,从而使其具有防篡改功能。可信执行环境 (TEE) 未经 AVB 验证。它由 XBL_SEC(Xtended Bootloader Secondary)验证,这是另一个由 PBL 验证的引导加载程序。TEE 图像由芯片制造商和 OEM 双重签名。如图所示,在 XBL 加载 ABL 的同时,TEE 被 XBL_SEC 唤醒。

高通安全启动链


安卓验证启动 2.0

Android验证开机2.0 vbmeta数据结构分析

高通安全启动链分析

高通的信任链

安全启动和映像身份验证(pdf)

我知道这是个老问题,但无论如何这里有一些答案,因为官方文档缺少许多重要细节:

AVB 的文档可以在 Google 开发者网站和官方代码库中找到

dm-verity 在 Android 启动过程中何时运行?

dm-verity是一个内核扩展,在挂载分区时和运行时运行。但是,Android Verified Boot 进程会在内核加载之前启动。更准确地说,您设备的 ROM 引导加载程序会在加载内核 (boot.img) 之前验证它的完整性,从而防止内核被损坏。一旦内核被加载,dm-verity 就会生效。您应该知道,验证启动的实现是由每个供应商定制的。例如,华为三星使用自己的实现。

dm-verity 是否在“安全世界”中运行?如果是这样,如何验证“安全世界”操作系统加载?

如前所述,dm-verity 是内核扩展,在内核级别运行,Arm TrustZone 是 CPU 的安全扩展,在内核加载之前运行。TrustZone 在硬件级别上运行,三星 Knox等产品使用 Arm TrustZone 进行实时内核验证。dm-verity 本身不需要在 TrustZone 中运行,但 dm-verity 的自定义实现可能使用 TrustZone 进行加密操作。例如,三星使用 TrustZone 进行密钥认证。

TrustZone 不是 Android Verified Boot 的直接组成部分,因为它是一种商业产品。它被三星等公司用于在启动阶段和运行时对内核进行额外验证。Android 验证启动不是必需的或强制的。通常使用 AVB 的引导过程可以总结如下:

  1. ROM 引导加载程序验证可闪存引导加载程序的签名。
  2. 可闪存引导加载程序验证 vbmeta.img、boot.img 和其他分区的签名并加载内核。可选:在加载内核或初始化设备特定的 TEE 操作系统之前完成供应商特定的检查。
  3. 内核从 boot.img 加载,dm-verity 在挂载和内核运行期间检查分区的完整性。

在启动过程中,TrustZone“世界”功能第一次被访问/激活是什么时候?

如前所述,根据维基百科, TrustZone 是封闭源代码,我们不知道它在启动过程中何时可用。但是,通常可信执行环境是在操作系统之前加载的。例如,华为在加载可闪存引导加载程序后加载其 TEE。在这种情况下,每个组件都只是验证下一个组件的完整性并构建一个钥匙链。