锁定和解锁引导加载程序

默认情况下,大多数 Android 设备都出厂时都带有锁定的引导加载程序,这意味着用户无法刷写引导加载程序或设备分区。如果需要,您(以及启用了开发者选项的设备用户)可以解锁引导加载程序以刷写新映像。

进入引导加载程序

要发出 fastboot 命令,您必须处于引导加载程序模式。一种方法是发送 adb 命令 adb reboot bootloader。某些手机还允许您通过在设备启动时按住组合键(通常是音量调低)来重启进入引导加载程序。

解锁引导加载程序

一旦进入bootloader模式,要解锁bootloader并允许重新刷写分区,请在设备上运行 fastboot flashing unlock 命令。 设置完成后,解锁模式会在重启后保持不变。

除非 get_unlock_ability 设置为 1,否则设备应拒绝 fastboot flashing unlock 命令。 如果设置为 0,则用户需要启动到主屏幕,打开设置 > 系统 > 开发者选项菜单,然后启用 OEM 解锁 选项(这将 get_unlock_ability 设置为 1)。 设置完成后,此模式会在重启和恢复出厂设置后保持不变。

当发送 fastboot flashing unlock 命令时,设备应提示用户并警告他们,使用非官方映像可能会遇到问题。 在用户确认警告后,设备应执行恢复出厂设置以防止未经授权的数据访问。 即使无法正确重新格式化,bootloader也应重置设备。 只有在重置后才能设置持久性标志,以便可以重新刷写设备。

fastboot flashing unlock 过程中,应重置所有尚未被覆盖的RAM。 此措施可防止攻击者读取上次启动时遗留的RAM内容。 同样,解锁的设备应在每次启动时清除RAM(除非这会造成无法接受的延迟),但应保留用于内核的 ramoops 的区域。

锁定 bootloader

要锁定 bootloader 并重置设备,请在设备上运行 fastboot flashing lock 命令。 计划用于零售的设备应以锁定状态(get_unlock_ability 返回 0)发货,以确保攻击者无法通过安装新的系统或启动映像来危害设备。

设置锁定和解锁属性

应在构建时设置 ro.oem_unlock_supported 属性,具体取决于设备是否支持 flashing unlock。

  • 如果设备支持 flashing unlock,请将 ro.oem_unlock_supported 设置为 1
  • 如果设备不支持 flashing unlock,请将 ro.oem_unlock_supported 设置为 0

如果设备支持 flashing unlock,则 bootloader 应通过设置内核命令行变量 androidboot.flash.locked 来指示锁定状态,如果已锁定,则设置为 1,如果已解锁,则设置为 0。 在 Android 12 中,此变量必须在 bootconfig 中设置,而不是在内核命令行中设置。

对于支持 dm-verity 的设备,请使用 ro.boot.verifiedbootstatero.boot.flash.locked 的值设置为 0; 如果已验证的启动状态为橙色,这将解锁 bootloader。

保护关键部分

设备应支持锁定和解锁关键部分,这些关键部分定义为将设备启动到 bootloader 所需的任何内容。 这些部分可能包括熔丝、传感器 hub 的虚拟分区、第一阶段 bootloader 等。 要锁定关键部分,您必须使用一种机制来防止设备上运行的代码(内核、恢复映像、OTA 代码等)故意修改任何关键部分。 如果设备处于锁定关键状态,OTA 应无法更新关键部分。

从锁定状态转换为解锁状态应需要与设备进行物理交互。 这种交互类似于运行 fastboot flashing unlock 命令的效果,但需要用户按下设备上的物理按钮。 设备不应允许在没有物理交互的情况下以编程方式从 lock critical 转换为 unlock critical,并且设备不应以 unlock critical 状态发货。