设备状态用于指明能够以多大的自由度将软件刷写到设备上,以及是否强制执行验证。设备状态为 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