锁定/解锁引导加载程序
默认情况下,大多数 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状态运送。 |