AVB2.0(Android Verified Boot2.0)是google新设计的verified boot流程用于保护boot/recovery/system/vendor等一些受保护分区的完整性。MTK平台中dtbo不使用AVB2.0保护,build出来的dtbo是avb2.0签名方式,会在调用签名脚本时将dtbo改为正常签名方式(dtbo用于初始化lcm等,如果dtbo校验失败了,无法显示yellow/orange/red state),而其他的image(preloader,lk,logo,tee等)仍然是使用MTK的verify flow。在Android P版本,如果平台使用的kernel版本大于等于4.9的话,AVB2.0是必须要开启的。
vbmeta分区
AVB2.0增加了一个vbmeta分区,对应的vbmeta.img由make_vbmeta_image工具编译生成的,其主要包含如下三大部分:
- vbmeta image header(256 Bytes)
- authentication data
- hash
- signature
- auxiliary data
- public key
- public key metadata
- descriptors
- hash descriptors
- hashtree descriptors
- chain partition descriptors
vbmeta分区保存了受保护分区的所有信息,每个被avb2.0保护的分区后面都有一个vbmeta结构。vbmeta结构中包含多个描述符(和其他元数据),并且所有这些数据都被加密签名
受保护的分区可以配置为hash分区或者chain(链式)分区:
- hash分区:hash校验,用hash描述符中hash(保存在vbmeta分区的vbmeta结构里)验证目标分区
- chain分区:key校验,用chain分区描述符中的public key(保存在vbmeta分区的vbmeta结构里)验证目标分区vbmeta结构的完整性(vbmeta被private key签名)
vbmeta.img中vbmeta结构
循环遍历主vbmeta中所有描述符
- chain分区描述符
- 保存了用于验证目标分区vbmeta结构的public key
- 如果目标分区vbmeta结构验证失败,将无法启动
- hash表描述符
- 目标分区vbmeta结构没有被使用,忽略
- hash描述符
- 除非它在“requested_partitions”中,被输入到avb2.0的入口函数:avb_slot_verify(),否则忽略目标分支vbmeta结构
vbmeta与boot/recovery/system/vendor绑定
- 配置为hash分区:必须与主vbmeta一起更新
- 配置为chain分区:假如目标分区vbmeta结构发生异常,就算此分区在当前启动模式不被使用,设备也将无法启动。
- 比如,假如recovery分区配置为chain分区,一旦recovery发生异常,normal boot也将无法启动
- 一旦recovery分区配置为hash分区,不能通过OTA改为chain分区配置
使能AVB2.0功能
- lk:vendor/mediatek/proprietary/bootable/bootloader/lk/project/<project.mk>
1 |
MTK_AVB20_SUPPORT = yes |
- kernel:<project>_debug_defconfig & <project>_defconfig
1 |
CONFIG_MTK_AVB20_SUPPORT = y |
配置avb分区
kernel-4.9\arch\arm64\boot\dts\mediatek\xxxx.dts
配置vbmeta.img的公钥与私钥
- 公钥: /vendor/mediatek/proprietary/bootable/bootloader/lk/target/${project}/inc/avbkey.h
- 私钥: device/mediatek/common/oem_prvk.pem
- 在device/mediatek/common/device.mk中配置:BOARD_AVB_KEY_PATH := device/mediatek/common/oem_prvk.pem
vbmeta.img被oem_prvk.pem进行私钥签名,在启动阶段lk使用avbkey.h中的公钥对vbmeta.img进行验证,所以avbkey.h配置的公钥与oem_prvk.pem的私钥必须是一对,且此key与secure boot校验其他分区的key不是同一个,配置文件也不是同一个,但是可以配置成同一组key。
配置受保护分区
默认不配置情况下,受保护分区采用hash分区方式,如需配置成chain分区方式,采用如下方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#settings for main vbmeta BOARD_AVB_ALGORITHM := SHA256_RSA2048 BOARD_AVB_KEY_PATH := device/mediatek/common/oem_prvk.pem ifeq ($(strip $(MAIN_VBMETA_IN_BOOT)),no) #settings for recovery, which is configured as chain partition BOARD_AVB_RECOVERY_KEY_PATH := device/mediatek/common/recovery_prvk.pem BOARD_AVB_RECOVERY_ALGORITHM := SHA256_RSA2048 BOARD_AVB_RECOVERY_ROLLBACK_INDEX := 0 # Always assign "1" to BOARD_AVB_RECOVERY_ROLLBACK_INDEX_LOCATION # if MTK_OTP_FRAMEWORK_V2 is turned on in LK. In other words, # rollback_index_location "1" can only be assigned to # recovery partition. BOARD_AVB_RECOVERY_ROLLBACK_INDEX_LOCATION := 1 endif #settings for system, which is configured as chain partition BOARD_AVB_SYSTEM_KEY_PATH := device/mediatek/common/system_prvk.pem BOARD_AVB_SYSTEM_ALGORITHM := SHA256_RSA2048 BOARD_AVB_SYSTEM_ROLLBACK_INDEX := 0 BOARD_AVB_SYSTEM_ROLLBACK_INDEX_LOCATION := 2 |
- 配置了system分区为chain分区方式
- 算法为SHA256_RSA2048
- private key为device/mediatek/common/system_prvk.pem
- 当MAIN_VBMETA_IN_BOOT宏为no时,配置recovery分区为chain分区方式
MTK平台AVB2.0、Secure boot与Dm-verity
当AVB2.0、Secure boot与Dm-verity同时开启,系统启动时preloader采用secure boot方式验证tee/lk等分区的可靠性,在lk阶段采用secure boot方式验证dtbo/logo等分区的可靠性,同时采用AVB方式验证vbmeta分区的可靠性和boot分区(或recovery分区)的可靠性。在init进程阶段,如果vendor或者system镜像配置为hash partition方式,则采用原先Dm-verity方式验证vendor或system分区的可靠性(在采用AVB方式验证时,发现其分区配置为hash partition方式,会bypass掉,采用dm-verify方式),如果配置为chain partition方式,则采用AVB方式验证其可靠性。