Android Verified Boot 2.0 | thanksgining

AVB2.0简要说明

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(链式)分区:

  1. hash分区:hash校验,用hash描述符中hash(保存在vbmeta分区的vbmeta结构里)验证目标分区
  2. 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>

  • kernel:<project>_debug_defconfig & <project>_defconfig

配置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分区方式,采用如下方式:


 

  • 配置了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方式验证其可靠性。

微信扫码打赏,获取更多精彩内容...

作者: RESSRC

个人资源站

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.