默认情况下,大多数 Android 设备都附带一个已锁定的引导加载程序,这意味着用户无法刷写引导加载程序或设备分区。如果需要,您(以及启用了开发者选项的设备用户)可以解锁引导加载程序以刷写新映像。
进入引导加载程序
若要发出 fastboot
命令,您必须处于引导加载程序模式。为了实现此目的,一种方法是发送 adb 命令 adb reboot bootloader
。在有些手机上,您还可以在启动设备时按组合键(通常是音量调低按钮)重新启动进入引导加载程序。
解锁引导加载程序
进入引导加载程序模式后,如需解锁引导加载程序并允许重新刷写分区,请在设备上运行 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
(如果已解锁)来指示锁定状态。在 Android 12 中,必须在 bootconfig(而非内核命令行)内设置此变量。
对于支持 dm-verity 的设备,请使用 ro.boot.verifiedbootstate
将 ro.boot.flash.locked
的值设置为 0
;如果启动时验证状态显示为橙色,此操作可解锁引导加载程序。
保护关键部分
设备应支持锁定和解锁关键部分(指将设备启动到引导加载程序所需的任何部分)。这些部分可能包括 fuse、传感器中枢的虚拟分区、第一阶段引导加载程序等。如需锁定关键部分,您必须采用一种机制,阻止设备上运行的代码(内核、恢复映像和 OTA 代码等)故意修改任何关键部分。如果设备处于锁定关键部分状态,OTA 应无法更新关键部分。
从锁定状态转换为解锁状态应需要与设备进行物理交互。此类交互的效果类似于运行 fastboot flashing unlock
命令,但要求用户按下设备上的实体按钮。设备不应允许在没有进行物理交互的情况下以程序化方式从 lock critical
状态转换为 unlock critical
状态,并且设备不应以 unlock critical
状态推出。