MTK安全启动链全解析:从芯片到avb系统级验证

📅 2026/7/8 0:17:14 👁️ 阅读次数 📝 编程学习
MTK安全启动链全解析:从芯片到avb系统级验证
结合具体厂商,MTK的安全启动分为MTK芯片级安全启动链Android AVB系统级验证链两大类。

一、整体信任链总览

MT8766采用两级嵌套链式信任,信任根锚定硬件eFuse,每一级验签通过后才会获得信任,进而验证下一级:
硬件eFuse(根公钥哈希)→ BROM验签 → Preloader → Preloader验签 → LK → LK执行AVB验签 → vbmeta.img → 链式验签 → vbmeta_system.img / vbmeta_vendor.img → 校验各业务分区

二、芯片级安全启动链(MTK私有签名体系)

这一级是MTK平台原生的硬件级安全启动,使用私有镜像格式,不遵循AVB规范,信任根为芯片eFuse中一次性烧录的根公钥哈希。

1. Boot ROM(BROM,片上固化固件)

  • 镜像内公钥/哈希:不存储完整公钥,仅在芯片eFuse/OTP区烧录根公钥的SHA-256哈希(硬件信任根RoT Hash),不可篡改。
  • 自身签名:无,代码固化在芯片硅片内,是整个系统的信任起点,不接受任何软件验证。
  • 签名产生方:无。
  • 验签执行者:自身,为平台第一级验签主体。
  • 被验签对象:Preloader镜像。MT8766 平台的 Boot ROM(BROM)对 Preloader 的验签,核心分为「公钥哈希锚定」和「镜像签名校验」两步:先提取 Preloader 镜像中携带的完整公钥,计算其 SHA-256 哈希值,与芯片 eFuse(OTP 一次性可编程区)中预先烧录的根公钥哈希做比对;比对通过后,再用这把经过可信锚定的公钥,验证 Preloader 镜像主体的数字签名,最终确认镜像合法。
  • 信任关系:作为硬件信任根,主动校验下一级Preloader的合法性,是整条信任链的起点。

2. Preloader 镜像

  • 镜像内公钥/哈希:镜像头部携带完整的根公钥,用于自身签名校验。
  • 自身签名:镜像头部附带MTK私有格式数字签名,签名覆盖Preloader全部有效代码与数据段。
  • 签名产生方:设备厂商/方案商持有的根私钥(与eFuse中的根公钥哈希一一对应),量产阶段完成签名。
  • 验签执行者:BROM。
  • 验签逻辑BROM先计算镜像中根公钥的哈希,与eFuse中的预置哈希比对;匹配后,再用该公钥验证Preloader的数字签名。
  • 被验签对象:LK(Little Kernel)镜像。
  • 信任关系:自身被BROM验证通过后获得信任,继续向下验证LK镜像,传递信任链。

3. LK(Little Kernel / Bootloader)镜像

  • 镜像内公钥/哈希
  1. 镜像头部携带芯片级签名公钥(可与根公钥为同一对,或为派生的子公钥,由厂商配置);
  2. 代码内部预置AVB可信公钥哈希,用于后续系统级AVB验签。
  • 自身签名:镜像头部附带MTK私有格式数字签名,覆盖LK核心代码与数据区。
  • 签名产生方:设备厂商持有的芯片级签名私钥
  • 验签执行者:Preloader。
  • 验签逻辑:Preloader使用已被信任的公钥,校验LK镜像的签名完整性。
  • 被验签对象:vbmeta.img(AVB顶级元数据镜像)。
  • 信任关系:承接芯片级信任链,自身验证通过后,成为Android AVB验证的执行主体,完成从芯片级到系统级的信任传递。

三、Android AVB 系统级验证链(标准AVB 2.0规范)

这一级遵循Google AVB 2.0标准,所有vbmeta镜像采用统一格式,信任锚点为LK中预置的AVB可信公钥哈希。

4. vbmeta.img(顶级主元数据镜像)

  • 镜像内公钥/哈希
  1. 镜像自身携带AVB根公钥(完整公钥),用于验证自身签名;
  2. 描述符区包含:boot、dtbo、recovery等分区的全量哈希(Hash描述符);vbmeta_system、vbmeta_vendor的授权公钥哈希+镜像预期哈希(Chain链式描述符);全局回滚版本号。
  • 自身签名:镜像尾部的签名块(AVB Footer),签名覆盖「镜像头部 + 所有描述符数据」,算法为RSA 2048/4096 + SHA-256。
  • 签名产生方:设备厂商持有的AVB根私钥,系统编译/OTA打包时完成签名。
  • 验签执行者:LK中的libavb库。
  • 验签逻辑
  1. LK提取vbmeta中的AVB根公钥,计算其哈希,与LK内置的可信公钥哈希比对;
  2. 哈希匹配后,用该公钥验证vbmeta自身的数字签名;
  3. 校验回滚版本号,防止降级攻击。
  • 被验签对象
  1. boot、dtbo、recovery等小分区(全量哈希校验);
  2. vbmeta_system.img、vbmeta_vendor.img(链式授权校验)。
  • 信任关系:承接芯片级信任链,是系统分区验证的根节点,自身合法性由LK担保。

5. vbmeta_system.img(System分区元数据镜像)

  • 镜像内公钥/哈希
  1. 镜像自身携带System专属签名公钥
  2. 描述符区包含system、system_ext分区的dm-verity哈希树根哈希(Hashtree描述符)、哈希树参数、数据块大小。
  • 自身签名:镜像尾部签名块,签名覆盖自身头部+全部描述符数据。
  • 签名产生方:设备厂商System团队持有的System签名私钥(独立于AVB根私钥)。
  • 验签执行者:LK中的libavb库(基于主vbmeta的授权)。
  • 验签逻辑(两步校验)
  1. 完整性校验:计算vbmeta_system镜像的全量哈希,与主vbmeta.img中Chain描述符记录的预期哈希比对;
  2. 授权校验:提取vbmeta_system的签名公钥,计算哈希,与主vbmeta的Chain描述符中预置的授权公钥哈希比对;匹配后用该公钥验证自身签名。
  • 被验签对象:system、system_ext分区(通过哈希树根哈希做运行时完整性校验)。
  • 信任关系:由主vbmeta.img授权信任,独立负责System分区的验证,支持System分区单独OTA更新,无需修改主vbmeta。

6. vbmeta_vendor.img(Vendor分区元数据镜像)

  • 镜像内公钥/哈希
  1. 镜像自身携带Vendor专属签名公钥
  2. 描述符区包含vendor、odm分区的dm-verity哈希树根哈希、哈希树参数。
  • 自身签名:镜像尾部签名块,签名覆盖自身头部+全部描述符数据。
  • 签名产生方:芯片厂商(MTK)或设备厂商Vendor团队持有的Vendor签名私钥
  • 验签执行者:LK中的libavb库(基于主vbmeta的授权)。
  • 验签逻辑:与vbmeta_system完全一致,基于主vbmeta的Chain描述符完成授权与签名校验。
  • 被验签对象:vendor、odm分区。
  • 信任关系:由主vbmeta.img授权信任,独立负责Vendor分区验证,适配Project Treble的分区解耦更新。

补充:业务分区(boot.img / system.img / vendor.img)

  • 自身不携带独立公钥与数字签名
  • boot等小分区的完整性由vbmeta.img中的Hash描述符担保;
  • system/vendor等大分区的完整性由对应子vbmeta中的Hashtree描述符(根哈希)担保,运行时由内核dm-verity模块按需校验。

四、签名-验签关系汇总表

镜像名称
签名由谁签发(私钥持有方)
由谁执行验签
验签的信任依据
验签通过后验证谁
Preloader
设备厂商根私钥
BROM
eFuse根公钥哈希
LK镜像
LK
设备厂商芯片级签名私钥
Preloader
芯片级根公钥
vbmeta.img
vbmeta.img
设备厂商AVB根私钥
LK
LK内置AVB公钥哈希
boot等小分区 + 子vbmeta镜像
vbmeta_system.img
设备厂商System签名私钥
LK(libavb)
主vbmeta的Chain授权
system/system_ext分区
vbmeta_vendor.img
MTK/厂商Vendor签名私钥
LK(libavb)
主vbmeta的Chain授权
vendor/odm分区

五、关键设计说明

  1. 硬件只存哈希,不存完整公钥:eFuse中仅烧录公钥哈希,避免攻击者直接替换镜像中的公钥绕过验证,确保信任根不可篡改。
  2. 公私钥分层隔离:芯片级密钥、AVB根密钥、System/Vendor子密钥分层管理,不同团队持有不同密钥,降低密钥泄露风险。
  3. 链式解耦适配OTA:子vbmeta独立签名的设计,让System、Vendor分区可以单独更新、单独签名,完美匹配Project Treble的分区解耦架构,也是MT8766这类入门平台支持独立厂商定制的核心基础。