4. AVB核心概念

Android Verified Boot 2.0(AVB)并不是“给 boot 分区加个签名”这么简单,它是一套以 vbmeta 镜像为中心、以哈希描述符和哈希树描述符为链条、以公钥与签名算法为信任根、以回滚索引与版本绑定为防降级机制的完整校验体系。理解这些核心概念,是后续编译、签名、烧录与排障的基础。

一、vbmeta:AVB 的“信任清单”

vbmeta.img 是 AVB 的核心元数据镜像,通常烧录到独立的 vbmeta 分区。它本身不存放 boot、system 等分区的完整数据,而是存放“这些分区应当长什么样”的声明。设备启动时,bootloader 先验证 vbmeta 的签名,再依据 vbmeta 中的描述符去验证各个目标分区。

vbmeta 镜像由三部分组成:

  • Header(头部):记录魔数、版本、所需验证标志、算法类型、公钥偏移、描述符偏移与大小等。
  • Authentication Data(认证数据):包含签名算法标识与签名值,供 bootloader 用内置公钥验签。
  • Auxiliary Data(辅助数据):即描述符集合,描述每个被校验分区的哈希、哈希树根或链式 vbmeta 关系。
关键点:vbmeta 是“被签名的清单”,它把信任从 bootloader 内置公钥传递到各个分区。只要 vbmeta 验签通过,其中的描述符就被认为是可信的。

二、AVB 元数据与描述符结构

AVB 元数据采用固定头部加可变描述符的二进制布局。头部中的 algorithm_type 决定签名算法,rollback_index 参与防降级,flags 控制是否允许禁用验证等行为。描述符则按类型区分,最常见的是哈希描述符与哈希树描述符。

概念 作用 典型对象 校验方式
vbmeta 存放签名与描述符的元数据镜像 vbmeta 分区 公钥验签
哈希描述符 声明某分区整体哈希 boot、dtbo、init_boot 整区哈希比对
哈希树描述符 声明大分区的哈希树根 system、vendor、product dm-verity 逐块校验
公钥 信任根,内置或写入 vbmeta bootloader 内置 RSA/EC 验签
回滚索引 防止降级到旧版本 vbmeta 头部 与设备存储值比较

三、哈希描述符与哈希树描述符

哈希描述符(Hash Descriptor)适用于体量较小、可一次性读取的分区,例如 boot、dtbo、init_boot。它记录分区名、哈希算法、盐值以及分区内容的哈希值。bootloader 读取整个分区后计算哈希,与描述符中的值比对,一致则通过。

哈希树描述符(Hashtree Descriptor)适用于 system、vendor 等大分区。它不直接存整区哈希,而是记录哈希树根、盐值、树高度、块大小等参数。运行时由 dm-verity 按块读取并逐级校验,只有被访问的块才需要验证,兼顾安全与性能。

# 查看 vbmeta 中的描述符(示意)
avbtool info_image --image vbmeta.img

# 输出中可见:
#   Hash descriptor: boot
#   Hashtree descriptor: system
#   Public key: avb_pkmd.bin
#   Rollback index: 202401

四、公钥、签名算法与信任链

AVB 使用非对称签名。私钥由厂商在安全环境中保管,用于对 vbmeta 签名;公钥则被编译进 bootloader 或写入设备信任存储。启动时 bootloader 用公钥验证 vbmeta 的签名,验证通过后才信任其中的描述符。

常见签名算法包括 SHA256_RSA2048、SHA256_RSA4096、SHA512_RSA8192 等。算法强度越高,签名与验签开销越大,需在安全与启动速度之间权衡。公钥通常以 avb_pkmd.bin 形式提供,其元数据包含密钥哈希,便于 bootloader 快速匹配。

信任链方向:bootloader 内置公钥 → 验证 vbmeta 签名 → 信任描述符 → 验证 boot/system 等分区。任何一环断裂,验证即失败。

五、回滚索引与版本绑定

回滚索引(Rollback Index)是 AVB 防降级的关键参数。每个 vbmeta 头部携带一个单调递增的整数,设备在安全存储中保存已见过的最大值。若新镜像的回滚索引小于设备记录值,bootloader 拒绝启动,从而防止攻击者刷入存在已知漏洞的旧版本。

版本绑定则通过 --rollback_index 与系统版本、安全补丁级别关联。每次发布新版本时递增该值,并在设备端持久化。这样即使攻击者拥有旧版签名镜像,也无法通过验证。

# 签名时指定回滚索引
avbtool make_vbmeta_image \
  --key rsa4096.pem \
  --algorithm SHA256_RSA4096 \
  --rollback_index 202406 \
  --include_descriptors_from_image boot.img \
  --include_descriptors_from_image system.img \
  --output vbmeta.img

六、案例场景:一次启动验证的完整路径

设备上电后,bootloader 读取 vbmeta 分区,用内置公钥验证其签名。签名通过后,解析描述符:对 boot 分区计算哈希并与哈希描述符比对;对 system 分区读取哈希树根并启动 dm-verity。同时检查回滚索引是否不小于设备记录值。全部通过后,内核与系统继续启动;任一失败则进入红色警告或恢复模式。

七、常见误区与复盘

  • 误区一:只签 boot 不签 vbmeta。vbmeta 未签名时,描述符可被篡改,信任链断裂。
  • 误区二:哈希描述符用于大分区。大分区应使用哈希树描述符,否则启动时需整区读取,耗时且占用内存。
  • 误区三:忽略回滚索引。不递增回滚索引会导致防降级失效,旧版漏洞镜像仍可启动。
  • 误区四:公钥与私钥混用。设备端只应内置公钥,私钥必须离线保管,泄露即失去信任根。
排障提示:若启动报“vbmeta verification failed”,优先检查公钥是否匹配、签名算法是否一致、回滚索引是否被设备拒绝。若报“hashtree verification failed”,则检查哈希树参数、盐值与分区内容是否被修改。
AVB 核心概念与信任链 Bootloader 内置公钥 · 验签入口 公钥 RSA / EC 验签 vbmeta 镜像 Header · 算法 · 标志 Authentication Data · 签名 Auxiliary Data · 描述符集合 被签名的“信任清单” rollback_index · flags 哈希描述符 boot · dtbo · init_boot 整区哈希比对 哈希树描述符 system · vendor · product dm-verity 逐块校验 回滚索引与版本绑定 单调递增 · 防降级 与设备安全存储比较 验签 描述符 描述符 版本绑定 信任链:Bootloader 公钥 → vbmeta 签名 → 描述符 → 分区校验 → 回滚索引检查 小分区用哈希描述符整区比对;大分区用哈希树描述符配合 dm-verity 逐块校验 任一环节失败即拒绝启动,确保设备只运行经过授权且未被降级的系统

掌握 vbmeta、描述符、公钥、签名算法与回滚索引之间的关系,就能在编译、签名、烧录和排障中快速定位问题。AVB 的本质不是单点校验,而是一条从硬件信任根到系统分区的完整信任链。