默认情况下,大多数 Android 设备都附带锁定的引导加载程序,这意味着用户无法刷新引导加载程序或设备分区。如果需要,您(和启用了开发人员选项的设备用户)可以解锁引导加载程序以刷新新映像。
解锁引导加载程序
要解锁引导加载程序并启用要刷新的分区,请在设备上运行fastboot flashing unlock
命令。设置后,解锁模式在重新启动后仍然存在。
除非get_unlock_ability
设置为1
,否则设备应拒绝fastboot flashing unlock
命令。如果设置为0
,用户需要启动到主屏幕,打开设置 > 系统 > 开发人员选项菜单并启用OEM 解锁选项(将get_unlock_ability
设置为1
)。设置后,此模式会在重启和恢复出厂设置后持续存在。
当发送fastboot flashing unlock
命令时,设备应提示用户警告他们可能会遇到非官方图像的问题。用户确认警告后,设备应执行出厂数据重置以防止未经授权的数据访问。即使无法正确重新格式化,引导加载程序也应重置设备。只有在重置后才能设置持久标志,以便重新刷新设备。
所有尚未被覆盖的 RAM 都应在快速启动fastboot flashing unlock
过程中重置。此措施可防止读取上次启动时剩余的 RAM 内容的攻击。同样,未锁定的设备应在每次启动时清除 RAM(除非这会造成不可接受的延迟),但应保留用于内核ramoops
的区域。
锁定引导加载程序
要锁定引导加载程序并重置设备,请在设备上运行fastboot flashing lock
命令。用于零售的设备应在锁定状态下发货( get_unlock_ability
返回0
),以确保攻击者无法通过安装新系统或启动映像来破坏设备。
设置锁定/解锁属性
ro.oem_unlock_supported
属性应在构建时根据设备是否支持闪烁解锁进行设置。
- 如果设备支持刷机解锁,将
ro.oem_unlock_supported
设置为1
。 - 如果设备不支持刷机解锁,将
ro.oem_unlock_supported
设置为0
。
如果设备支持闪存解锁,则引导加载程序应通过将内核命令行变量androidboot.flash.locked
设置为1
(如果锁定)或设置为0
(如果解锁)来指示锁定状态。此变量必须在 bootconfig 中设置,而不是在 Android 12 中的内核命令行中设置。
对于支持dm-verity 的设备,使用ro.boot.verifiedbootstate
将ro.boot.flash.locked
的值设置为0
;如果已验证的引导状态为橙色,这将解锁引导加载程序。
保护关键部分
设备应该支持关键部分的锁定和解锁,关键部分被定义为将设备引导到引导加载程序所需的任何内容。这些部分可能包括保险丝、传感器集线器的虚拟分区、第一阶段引导加载程序等。要锁定关键部分,您必须使用一种机制来防止在设备上运行的代码(内核、恢复映像、OTA 代码等)故意修改任何关键部分。如果设备处于锁定临界状态,OTA 应该无法更新临界区。
从锁定状态转换到解锁状态应该需要与设备进行物理交互。这种交互类似于运行fastboot flashing unlock
命令的效果,但需要用户按下设备上的物理按钮。设备不应允许在没有物理交互的情况下以编程方式从lock critical
状态转换为unlock critical
关键状态,并且设备不应以unlock critical
状态运送。