Android 启动流程 fastboot flashing unlock

 

启动流程  |  Android 开源项目  |  Android Open Source Project https://source.android.google.cn/docs/security/features/verifiedboot/boot-flow?hl=zh-cn

启动时验证

启动时验证会尽力确保所有已执行代码均来自可信来源(通常是设备的原始设备制造商 [OEM]),以防受到攻击或损坏。它可建立一条从受硬件保护的信任根到引导加载程序,再到 boot 分区和其他已验证分区(包括 systemvendor 和可选的 oem 分区)的完整信任链。在设备启动过程中,无论是在哪个阶段,都会在进入下一个阶段之前先验证下一个阶段的完整性和真实性。

除了确保设备运行的是安全的 Android 版本外,启动时验证还会检查 Android 版本是否为具有回滚保护的正确版本。回滚保护可确保设备只会更新到更高的 Android 版本,从而帮助避免可能的漏洞持续存在。

除了验证操作系统外,启动时验证还允许 Android 设备将其完整性状态传达给用户。

背景

Android 4.4 增加了对启动时验证和 dm-verity 内核功能的支持。这种验证功能组合就是启动时验证 1。

以前的 Android 版本会在发现设备损坏时向用户发出警告,但仍然允许他们启动设备;从 Android 7.0 开始,系统会严格强制执行启动时验证,从而使已破解的设备无法启动。Android 7.0 还增加了对前向纠错功能的支持,有助于更可靠地防范非恶意数据损坏。

Android 8.0 及更高版本包含 Android 启动时验证 (AVB),AVB 是启动时验证的一个参考实现,可与 Project Treble 配合使用。除了与 Treble 配合使用外,AVB 还对分区脚本格式进行了标准化并增添了回滚保护功能。

启动流程

建议的设备启动流程如下所示:

启动时验证流程图 1. 启动时验证流程

适用于 A/B 设备的流程

如果设备使用的是 A/B 系统,则启动流程略有不同。必须先使用启动控件 HAL 将要启动的槽位标记为 SUCCESSFUL,然后再更新回滚保护 (Rollback Protection) 元数据。

如果平台更新失败(未标记为 SUCCESSFUL),A/B 堆栈便会回退至仍具有先前 Android 版本的另一槽位。不过,如果已设置回滚保护元数据,之前的版本会因回滚保护而无法启动。

将启动时验证状态传达给用户

确定设备的启动状态后,您需要将该状态传达给用户。如果设备没有任何问题,则会继续运行,而不显示任何内容。启动时验证问题分为以下几类:

  • 黄色:针对设有自定义信任根的已锁定设备的警告屏幕
  • 橙色:针对未锁定设备的警告屏幕
  • 红色 (eio):针对 dm-verity 损坏的警告屏幕
  • 红色 (no os found):未找到有效的操作系统

具有自定义信任根的已锁定设备

黄色屏幕示例:

黄色设备警告屏幕

如果设备处于已锁定状态,已设置自定义的信任根,并且映像已使用该自定义信任根进行签名,则会在每次启动时显示黄色屏幕。黄色屏幕会在 10 秒钟后关闭,并且设备会继续启动。如果用户按下电源按钮,“按电源按钮即可暂停”文字便会更改为“按电源按钮即可继续”,并且该屏幕永远都不会关闭,但设备可能会调暗或关闭显示屏以防烧屏。如果再次按下按钮,该屏幕便会关闭,并且手机会继续启动。

对于hex-number,请使用用于验证的 libavb 表示形式公钥的 sha256 的前 8 位数字,例如 d14a028c

建议采用的文本:

您的设备加载了不同的操作系统。

请在其他设备上访问此链接以了解详情:

g.co/ABH

ID:hex-number

power_settings_new 按电源按钮即可暂停

已解锁的设备

橙色屏幕示例:

橙色设备警告屏幕

如果设备处于已解锁状态,则会在每次启动时显示橙色屏幕。橙色屏幕会在 10 秒钟后关闭,并且设备会继续启动。如果用户按下电源按钮,“按电源按钮即可暂停”文字便会更改为“按电源按钮即可继续”,并且该屏幕永远都不会关闭(设备可能会根据需要调暗和/或关闭显示屏,以防出现烧屏或类似问题)。如果再次按下按钮,该屏幕便会关闭,并且手机会继续启动。

对于hex-number,请使用用于验证的 libavb 表示形式公钥的 sha256 的前 8 位数字,例如 d14a028c

建议采用的文本:

引导加载程序已解锁,无法保证软件完整性。攻击者可能可以获取设备上存储的所有数据。请勿在此设备上存储任何敏感数据。

请在其他设备上访问此链接以了解详情:

g.co/ABH

ID:hex-number

power_settings_new 按电源按钮即可暂停。

dm-verity 损坏

红色 eio 屏幕示例:

红色 eio 设备警告屏幕

如果找到 Android 的有效版本,并且设备当前处于 eio dm-verity 模式,则会显示红色 eio 屏幕。用户需要按电源按钮才能继续。如果用户未在 30 秒内确认警告屏幕,设备将关机(以防烧屏并节省电量)。

注意:系统可能会在显示此屏幕后显示其他警告屏幕。例如,如果设备处于 UNLOCKED 状态,则之后会显示橙色屏幕。

建议采用的文本:

您的设备已损坏。该设备不可信任,并且可能无法正常工作。

请在其他设备上访问此链接以了解详情:

g.co/ABH

power_settings_new 按电源按钮即可继续。

找不到有效的操作系统

红色屏幕示例:

红色损坏设备警告屏幕

如果找不到有效的 Android 版本,屏幕会显示红色。设备无法继续启动。如果用户未在 30 秒内确认警告屏幕,设备将关机(以防烧屏并节省电量)。

对于hex-number,请使用用于验证的 libavb 表示形式公钥的 sha256 的前 8 位数字,例如 d14a028c

建议采用的文本:

找不到有效的操作系统。设备无法启动。

请在其他设备上访问此链接以了解详情:

g.co/ABH

ID:hex-number

power_settings_new 按电源按钮即可关机。

解锁确认

屏幕示例:

解锁设备警告屏幕

显示一个解锁确认屏幕,以响应通过 fastboot 接口执行的 fastboot flashing unlock 命令。初始选中的是“不解锁”选项。如果用户未在 30 秒内与警告屏幕互动,屏幕会消失并且该命令会失败。

建议采用的文本:

如果您解锁引导加载程序,则可以在此手机上安装自定义操作系统软件。自定义操作系统未经过与原始操作系统相同级别的测试,可能会导致您的手机和已安装的应用停止正常工作。使用自定义操作系统无法保证软件完整性,因此在引导加载程序处于解锁状态时存储在手机上的所有数据都可能面临风险。

为防止他人未经授权访问您的个人数据,解锁引导加载程序还将删除您手机上的所有个人数据。

按音量调高按钮/音量调低按钮可选择是否解锁引导加载程序,然后按电源按钮即可继续。

解锁

解锁引导加载程序。

不解锁

不解锁引导加载程序并重启手机。

锁定确认

显示一个锁定确认屏幕,以响应通过 fastboot 接口执行的 fastboot flashing lock 命令。初始选中的是“不锁定”选项。如果用户未在 30 秒内与警告屏幕互动,屏幕会消失并且该命令会失败。

文本:

如果您锁定引导加载程序,则无法在此手机上安装自定义操作系统软件。为防止他人未经授权访问您的个人数据,锁定引导加载程序还将删除您手机上的所有个人数据。

按音量调高按钮/音量调低按钮可选择是否锁定引导加载程序,然后按电源按钮即可继续。

锁定

锁定引导加载程序。

不锁定

不锁定引导加载程序并重启手机。

将启动时验证状态传达给 Android

屏幕示例:

锁定确认设备警告屏幕

引导加载程序通过内核命令参数或 bootconfig(从 Android 12 开始)将启动时验证状态传达给 Android。它会将 androidboot.verifiedstate 选项设置为以下其中一个值:

  • green:如果设备处于 LOCKED 状态且未使用可由用户设置的信任根
  • yellow:如果设备处于LOCKED状态且使用了可由用户设置的信任根
  • orange:如果设备处于UNLOCKED状态

androidboot.veritymode 选项设置为 eio 或 restart,具体取决于启动加载程序在处理 dm-verity 错误时所处的状态。如需了解详情,请参阅处理验证错误

 

设备状态  |  Android 开源项目  |  Android Open Source Project https://source.android.google.cn/docs/security/features/verifiedboot/device-state?hl=zh-cn

 

设备状态

设备状态指明了能够以多大的自由度将软件刷写到设备上,以及是否强制执行验证。设备状态为 LOCKED 和 UNLOCKED。状态为 LOCKED 的设备禁止您将新软件刷写到设备上,而状态为 UNLOCKED 的设备允许您进行修改。

当设备开机后,引导加载程序会先检查设备状态是 LOCKED 还是 UNLOCKED。如果设备状态为 UNLOCKED,引导加载程序会向用户显示警告,然后继续启动,即使加载的操作系统并非由信任根签名也是如此。

如果设备状态为 LOCKED,引导加载程序会完成验证启动中的步骤,以验证该设备的软件。只有加载的操作系统由信任根正确签名后,状态为 LOCKED 的设备才会启动。如需了解详情,请参阅启动流程

更改设备状态

如需更改设备状态,请使用 fastboot flashing [unlock | lock] 命令。为了保护用户数据,只要设备状态发生了变化,都会先擦除 data 分区中的数据,并会在删除数据之前要求用户确认。

用户购买二手开发设备后,应将设备状态从 UNLOCKED 改为 LOCKED。锁定设备后,只要没有警告,用户就应该确信设备所处的状态符合设备制造商的设计。如果开发者出于开发目的而希望停用设备上的验证功能,应将设备状态从 LOCKED 改为 UNLOCKED

信任根

信任根是用来为设备上存储的 Android 副本进行签名的加密密钥。信任根的不公开部分仅为设备制造商所知,用来为将要分发的每个 Android 版本进行签名。信任根的公开部分嵌入到设备中,并存储在一个不会被篡改的位置(通常是只读存储区)。

加载 Android 时,引导加载程序会使用信任根来验证真实性。如需详细了解此流程,请参阅验证启动。设备可能具有多个引导加载程序,因此可能有多个加密密钥。

可由用户设置的信任根

设备可根据需要选择允许用户配置信任根(例如公钥)。设备可以使用可由用户设置的信任根(而非内置信任根)来进行启动时验证。这样,用户既可以安装并使用自定义的 Android 版本,又不会牺牲启动时验证这一安全改进功能。

如果实现了可由用户设置的信任根,则应满足以下要求:

  • 需要进行物理确认才能设置/清除可由用户设置的信任根。
  • 可由用户设置的信任根只能由最终用户来设置,而不能在出厂时或从出厂到最终用户获得设备之间的任意时点进行设置。
  • 可由用户设置的信任根存储在防篡改的存储空间中。“防篡改”是指可以检测到 Android 数据是否遭到了篡改(例如,数据是否被覆盖或更改)。
  • 如果设置了可由用户设置的信任根,则设备应该允许启动使用内置信任根或可由用户设置的信任根签名的 Android 版本。
  • 设备每次使用可由用户设置的信任根启动时,系统都应通知用户,指出设备正在加载自定义的 Android 版本,例如警告屏幕;请参阅状态为 LOCKED 并已设置自定义密钥的设备

要实现可由用户设置的信任根,其中一种方法是将虚拟分区设置为仅当设备处于 UNLOCKED 状态时才能刷写或清除。Google Pixel 2 设备使用的便是此方法以及名为 avb_custom_key 的虚拟分区。avbtool extract_public_key 命令会输出此分区中数据的格式。以下示例展示了如何设置可由用户设置的信任根:

 
avbtool extract_public_key --key key.pem --output pkmd.bin
fastboot flash avb_custom_key pkmd.bin

可通过发出以下命令来清除可由用户设置的信任根:

 
fastboot erase avb_custom_key

启动时验证  |  Android 开源项目  |  Android Open Source Project https://source.android.google.cn/docs/security/features/verifiedboot?hl=zh-cn

启动时验证

启动时验证会尽力确保所有已执行代码均来自可信来源(通常是设备的原始设备制造商 [OEM]),以防受到攻击或损坏。它可建立一条从受硬件保护的信任根到引导加载程序,再到 boot 分区和其他已验证分区(包括 systemvendor 和可选的 oem 分区)的完整信任链。在设备启动过程中,无论是在哪个阶段,都会在进入下一个阶段之前先验证下一个阶段的完整性和真实性。

除了确保设备运行的是安全的 Android 版本外,启动时验证还会检查 Android 版本是否为具有回滚保护的正确版本。回滚保护可确保设备只会更新到更高的 Android 版本,从而帮助避免可能的漏洞持续存在。

除了验证操作系统外,启动时验证还允许 Android 设备将其完整性状态传达给用户。

 

Verified Boot  |  Android Open Source Project https://source.android.google.cn/docs/security/features/verifiedboot

Verified Boot

Verified Boot strives to ensure all executed code comes from a trusted source (usually device OEMs), rather than from an attacker or corruption. It establishes a full chain of trust, starting from a hardware-protected root of trust to the bootloader, to the boot partition and other verified partitions including systemvendor, and optionally oem partitions. During device boot up, each stage verifies the integrity and authenticity of the next stage before handing over execution.

In addition to ensuring that devices are running a safe version of Android, Verified Boot checks for the correct version of Android with rollback protection. Rollback protection helps to prevent a possible exploit from becoming persistent by ensuring devices only update to newer versions of Android.

In addition to verifying the OS, Verified Boot also allows Android devices to communicate their state of integrity to the user.

 

 

锁定/解锁引导加载程序  |  Android 开源项目  |  Android Open Source Project https://source.android.google.cn/docs/core/architecture/bootloader/locking_unlocking?hl=zh-cn

posted @ 2023-12-01 13:57  papering  阅读(493)  评论(0编辑  收藏  举报