设备状态指明了能够以多大的自由度将软件刷写到设备上,以及是否强制执行验证。设备状态为 LOCKED
和 UNLOCKED
。状态为 LOCKED
的设备禁止您将新软件刷写到设备上,而状态为 UNLOCKED
的设备允许您进行修改。
当设备开机后,引导加载程序会先检查设备状态是 LOCKED
还是 UNLOCKED
。如果设备状态为 UNLOCKED
,引导加载程序会向用户显示警告,然后继续启动,即使加载的操作系统并非由信任根签名也是如此。
如果设备状态为 LOCKED
,引导加载程序会完成验证启动中的步骤,以验证该设备的软件。只有加载的操作系统由信任根正确签名后,状态为 LOCKED
的设备才会启动。如需了解详情,请参阅启动流程。
更改设备状态
如需更改设备状态,请使用 fastboot flashing [unlock | lock]
命令。为了保护用户数据,只要设备状态发生了变化,都会先擦除 data 分区中的数据,并会在删除数据之前要求用户确认。
用户购买二手开发设备后,应将设备状态从 UNLOCKED
改为 LOCKED
。锁定设备后,只要没有警告,用户就应该确信设备所处的状态符合设备制造商的设计。如果开发者出于开发目的而希望停用设备上的验证功能,应将设备状态从 LOCKED
改为 UNLOCKED
。
信任根
信任根是用来为设备上存储的 Android 副本进行签名的加密密钥。信任根的不公开部分仅为设备制造商所知,用来为将要分发的每个 Android 版本进行签名。信任根的公开部分嵌入到设备中,并存储在一个不会被篡改的位置(通常是只读存储区)。
加载 Android 时,引导加载程序会使用信任根来验证真实性。如需详细了解此流程,请参阅验证启动。设备可能具有多个引导加载程序,因此可能有多个加密密钥。
可由用户设置的信任根
设备可根据需要选择允许用户配置信任根(例如公钥)。设备可以使用可由用户设置的信任根(而非内置信任根)来进行启动时验证。这样,用户既可以安装并使用自定义的 Android 版本,又不会牺牲启动时验证这一安全改进功能。
如果实现了可由用户设置的信任根,则应满足以下要求:
- 需要进行物理确认才能设置/清除可由用户设置的信任根。
- 可由用户设置的信任根只能由最终用户来设置,而不能在出厂时或从出厂到最终用户获得设备之间的任意时点进行设置。
- 可由用户设置的信任根存储在防篡改的存储空间中。“防篡改”是指可以检测到 Android 数据是否遭到了篡改(例如,数据是否被覆盖或更改)。
- 如果设置了可由用户设置的信任根,则设备应该允许启动使用内置信任根或可由用户设置的信任根签名的 Android 版本。
- 设备每次使用可由用户设置的信任根启动时,系统都应通知用户,指出设备正在加载自定义的 Android 版本,例如警告屏幕;请参阅状态为
LOCKED
并已设置自定义密钥的设备。
要实现可由用户设置的信任根,其中一种方法是将虚拟分区设置为仅当设备处于 UNLOCKED
状态时才能刷写或清除。Google Pixel 2 设备使用的便是此方法以及名为 avb_custom_key
的虚拟分区。avbtool extract_public_key
命令会输出此分区中数据的格式。以下示例展示了如何设置可由用户设置的信任根:
avbtool extract_public_key --key key.pem --output pkmd.bin
fastboot flash avb_custom_key pkmd.bin
可通过发出以下命令来清除可由用户设置的信任根:
fastboot erase avb_custom_key