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 关系。
二、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 快速匹配。
五、回滚索引与版本绑定
回滚索引(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、描述符、公钥、签名算法与回滚索引之间的关系,就能在编译、签名、烧录和排障中快速定位问题。AVB 的本质不是单点校验,而是一条从硬件信任根到系统分区的完整信任链。