默认情况下,大多数 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.verifiedbootstate
将 ro.boot.flash.locked
的值设置为 0
; 如果已验证的启动状态为橙色,这将解锁 bootloader。
保护关键部分
设备应支持锁定和解锁关键部分,这些关键部分定义为将设备启动到 bootloader 所需的任何内容。 这些部分可能包括熔丝、传感器 hub 的虚拟分区、第一阶段 bootloader 等。 要锁定关键部分,您必须使用一种机制来防止设备上运行的代码(内核、恢复映像、OTA 代码等)故意修改任何关键部分。 如果设备处于锁定关键状态,OTA 应无法更新关键部分。
从锁定状态转换为解锁状态应需要与设备进行物理交互。 这种交互类似于运行 fastboot flashing unlock
命令的效果,但需要用户按下设备上的物理按钮。 设备不应允许在没有物理交互的情况下以编程方式从 lock critical
转换为 unlock critical
,并且设备不应以 unlock critical
状态发货。