Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4Mobile wallpaper 5Mobile wallpaper 6
2732 字
14 分钟
我对安卓设备启动信任链的理解
2025-12-25
统计加载中...
TIP

如果您使用电脑阅读此文章,建议开启“网格视图”(位于顶栏右上角)以获得较好的阅读体验。

content完全复制于我的obsidian,损坏的文章/标题链接 请不要在意它。

你这个设备值不值得被信任? ^0923e9

Boot ROM <- SoC 固化,不可改
AVB (vbmeta) <- 启动完整性(你启动的是不是官方系统)
Bootloader / Kernel
TEE / StrongBox <- 设备是否“硬件可信”,真正裁判
├Keymaster Attestation
SafetyNet Hardware Attestation <- 我要不要相信你
App / Server 信任判断

这个流程图太重要了我上来就要放

AVB 2.0#

核心机制#

AVB(Android Verified Boot)是 Google 强制推行的启动链完整性验证框架(Android 8.0+),用于验证从 BootROM 到 System 分区的每一级启动镜像是否被修改,包括 boot.img vendor_boot.img system/vendor/product vbmeta 本身

graph LR A[BootROM] -->|验证签名| B(Bootloader) B -->|验证 vbmeta 哈希| C(Boot 镜像) C -->|验证 System 镜像哈希| D(System 分区) D -->|验证 Vendor 镜像| E(Vendor 分区)

关键文件:vbmeta.img 存储所有以上受保护分区的哈希树、公钥和签名
验证失败:触发 verifiedbootstate=red,等死吧

verifiedbootstate btw

green:官方签名,完整信任链 -> 释放 FBE 密钥 / KDK
orange:用户解锁 bl -> 销毁 KDK,仅允许基础功能
red:监测到篡改 -> 永久禁用安全服务(包括 Widevine L1 密钥),机都别想开

AVB 根本就他吗不关心你能不能用 TEE 密钥,要么绿要么橘要么红,红灯直接死,就算绿灯也不代表你设备安全

AVB 与 TEE 的致命关联#

TEE(如 [[#^Keymaster TA]])在初始化时会读取内核参数 androidboot.verifiedbootstate


TEE(已炸毁)和他的动物朋友们#

核心概念#

TEE(Trust Execution Environment 可信执行环境),是 SoC 中独立于系统的硬件级安全隔离环境(如 ARM Trust Zone)。
保护:指纹支付,DRM 高清内容解密(如 Netflix),存储加密密钥。即便设备被 root 也无法读取 TEE 数据。

Root 会破坏 TEE 的完整性。
获取 Root 权限需解锁 Bootloader(触发 [[#^AVB 2.0]] 验证失败),导致:

  • Verified Boot 失败:系统分区被修改,TEE 监测到非官方签名,拒绝提供安全服务(如指纹支付)
  • 密钥吊销:部分厂商(如三星)在检测到 root 后永久熔断 e-fuse,使 TEE 拒绝生成新密钥

支付宝 / 微信指纹支付,银行 app,DRM L1 视频播放(如 4K Netflix)通常失效,根源在于 TEE 拒绝向被篡改的系统提供高密钥。

指纹支付依赖 TEE#

graph LR A[用户按压指纹] --> B(TEE 验证生物特性) B --> C{TEE 生成临时密钥} C --> D[加密支付指令] D --> E[安全传输至服务器]

绕过尝试:伪装认证状态但无法恢复 TEE 内部数据

data 分区加密依赖 TEE#

FBE(File-Based-Encryption)的密钥由 TEE 保护。FBE 专门用于加密 /data 分区。FBE 并非全盘加密,不加密 /system/vendor 等系统分区(这些分区通过 [[#^AVB 2.0]] 校验完整性,但不加密)
FBE 采用分层密钥结构,人话就是锁屏密码不直接作为加密密钥,而是作为密钥派生凭证

graph LR A[锁屏密码] --> B(Tee 内部执行 KDF) B --> C[生成 KDK<br/>Key Derivation Key] C --> D[加密 UserKey<br/>存储在 /data/vold/] D --> E[UserKey 解密 DEK<br/>Device Encryption Key] E --> F[DEK 直接加密文件]

图看不懂?让我们说中文:

TEE 在解密 data 时干的活

1.密钥永不暴露:
KDK 在 TEE 内部生并永久存储,操作系统无法读取。锁屏密码只作为输入,在 TEE 内通过 KDF(如 script 或 SHA-256)派生临时密钥
2.解密流程:
用户输入密码 -> 密码哈希值传入 TEE -> TEE 用 KDK 验证哈希 -> 验证成功则释放解密 User Key 所需的密钥 -> User Key 解密 DEK -> DEK 解密文件
3.总结:
FBE 的加密密钥不是锁屏密码,厂商也不允许导出 KDK

TEE 硬件熔断#

WARNING

如果你去问 AI “关于硬件熔断各大手机厂商的做法”,你很有可能得不到正确的答案。
例如,解锁 bl = 熔断硬件保险丝(如高通 frp 分区),即使重锁也无法恢复 green 状态(e-fuse 物理熔断不可逆) 这句话中包含两个严重的错误!
TEE 熔断的具体机制远比想象中和 AIGC 回答的复杂得多!

具体请见 [[硬件熔断]]

Keymaster TA#

TA(Trusted Application,可信应用)运行在 TEE 内部,不在 Android/Linux 世界。

SoC
└─ Secure World (TEE)
├─ TEE OS (QSEE / OP-TEE / Trustonic)
├─ Keymaster TA ← 现在正在谈的
├─ Gatekeeper TA ← 生物识别
├─ Widevine TA ← DRM L1(显存给大,上下文放长,一会儿会考)
├─ OEM Security TA ← 厂商自定义(熔断逻辑常在这里)
└─ Other Trusted Apps

TA 是他吗“硬件级验证”的执行者。

以下这些都是Ta干的活:

  • 生成 RSA/ECC Attestation Key
  • 保存密钥(TEE 内或 StrongBox)
  • 校验启动状态(verifiedBootState)
  • 决定是否允许 Hardware-backed Attestation
  • 对 SafetyNet/Play Integrity 请求进行签名

TA 读取 verifiedBootState,一旦 orange/red,TA 降级 key 权限,禁用 Attestation Key,返回 non-hardware-backed 等一系列硬件不可信信息。

StrongBox#

StrongBox 是 Keymaster 的一个实现后端。

Keymaster API
├─ TEE-backed Keymaster
└─ StrongBox-backed Keymaster
└─ 独立安全芯片 / Secure Element

DRM 和 Widevine#

Widevine / DRM 与 Keymaster TA 并列,同属 TEE 内的 Trusted Application

TEE / Secure World
├─ Keymaster TA ← 身份 / Attestation
├─ Widevine TA ← DRM / 内容解密
├─ Gatekeeper TA ← 生物识别
└─ OEM Security TA ← 熔断 / 状态机
QUESTION

猜猜 DRM 去哪里了?

DRM(Digital Rights Management)#

只做三件事:

  1. 密钥不泄漏
  2. 内容不被随意拷贝
  3. 播放环境可控

回答的是“我愿不愿意把内容解密给你?”,而不是“你这个设备值不值得被信任 [[#^0923e9]]”

如果你无法理解以上 从“回答问题”角度的解释,那么我再从“安全边界”角度解释一次。
安全边界有两条:

  • 身份边界(Attestation)
    AVB → TEE → Keymaster → SafetyNet / Integrity
    用于支付,银行,反作弊。
  • 内容边界(DRM)
    AVB → TEE → Widevine TA → Secure Video Path
    用于一坨流媒体软件的 hIdH dEfiNiTiOn 支援。
    注意到 DRM 不依赖 Keymaster,也就是说 StrongBox 不是 DRM 的必须组件。

Widevine#

是 Google 的 DRM 方案,被 Netflix / YouTube / Amazon / Disney+ 等采用。
它是一套密钥管理 + 加解密 + 授权协议,一套与 TEE 深度绑定的安全架构。

Widevine 的三个等级

  • L1
    密钥和解密都在 TEE 内。它依赖 TEE 状态、OEM 标志和 DRM 私钥 ^a844e0
  • L2
    密钥在 TEE 内,解密在 Android 世界,理论存在但很少见
  • L3
    密钥和解密都在 Android 世界,完全不信任硬件,不依赖 TEE

一旦 Widevine L1 掉了(Widevine TA 被永久降级)就回不来了,不是“丢了”而是“被吊销”。
因为 L1 所依赖的 [[#^a844e0]] 这些不在 AVB,不可刷回,不可恢复出厂。

钥匙盒子 Keybox#

Keybox 是一份设备出厂时注入的、与硬件绑定的 DRM 身份凭据。
它包含(概念层面):

  • 设备 DRM 私钥材料
  • OEM / Google 签名
  • 设备型号、厂商信息
  • 绑定 SoC / TEE 的信息

它不在 system/vendor,不在 vbmeta,普通刷机永远接触不到。

谷歌吊销 Revoke 机制:

  • 触发条件:
    • 设备密钥泄漏:如维修点非法提取 Keybox 并公开售卖
    • 安全漏洞利用:攻击者通过漏洞批量提取 Keybox(如旧版高通漏洞)
    • 谷歌检测异常:同一 Keybox 在多设备激活
  • 吊销后果:
    • Widevine 等级降至 L3,视频 APP 限制分辨率
    • 谷歌通过 CRL(证书吊销列表)远程推送,设备联网后自动生效

Tricky Store 的概念级解释#

它不是恢复 L1 的工具,而是试图影响 Android 世界中的 DRM Info 和 APP 对 DRM 能力的初步判断,属于“上层个信息伪装 / 接口层干预”类模块。

  • Zygisk:在进程注入层隐藏 Magisk 痕迹
  • 系统属性欺骗:伪造 ro.build.tags=release-keys 等安全属性
  • API 钩子:拦截 SafetyNetPlay Integrity 的检测窗口,返回合法响应

我是低调的黑客#

你所能接触到的 keybox.xml 文件,只是某些模块 / 工具使用的“伪身份材料”。
让我们随机挑选一个 2024 年 11 月在 tg 流传并高价售卖的 keybox.xml 文件:

<AndroidAttestation>
<NumberOfKeyboxes>1</NumberOfKeyboxes>
<Keybox DeviceID="Telegram @BDovo_Channel">
<Key algorithm="ecdsa">
<PrivateKey>-----BEGIN EC PRIVATE KEY-----</PrivateKey>
<CertificateChain>
<Certificate>-----BEGIN CERTIFICATE-----</Certificate>
...
</CertificateChain>
</Key>
</Keybox>
</AndroidAttestation>

一眼盯真鉴定为死刑

出现了明文的 EC PRIVATE

这是他吗人类、root、内核、fastboot 理论上都拿不到的东西(暂时不谈记忆里怎么有人提取的)

这份文件刻意模仿了 Keybox 的外形,包括

  • ECDSA Key
  • CertificateChain
  • Android Attestation 结构
  • 看起来像是设备身份

所以这份文件是给 Android 世界看的。Tricky Store 使用伪造 Attestaion / Keybox 描述 伪装上层,影响了 Android API 返回和大部分 APP 的判断

那 Google 吊销的 KeyBox 到底是什么就可以精确定义了:被吊销的是 Google DRM Server 不再信任某个“真实、TEE 内生成的 KeyBox 身份”,而不是这种 XML,这种模块都能替换的东西。


SafetyNet 和 Play Integrity API#

核心概念#

远程设备完整性与可信状态证明服务,不验证启动,只验证 TA 是否能给出硬件签名(已逐步被 Play Integrity API 取代)
Google 在 SafetyNet 中首次把 TEE/StrongBox 的 Attestation 能力强制暴露给 APP

他不是本地安全机制,而是:

  • 设备向 Google 服务请求“证明”
  • Google 返回一个签名的 Attestation 结果
  • APP 验证结果,决定是否允许允许

SafetyNet 的两种验证模式#

Basic Attestation软件级无 TEE 密钥,基于系统属性 已知特征
Hardware Attestation硬件级基于 TEE/StrongBox 的密钥

Widevine 与 SafetyNet / Integrity 的关系#

项目SafetyNet / IntegrityWidevine
是否远程 是否使用 TEE 是否共享熔断状态
结果表现BASIC / STRONGL1 / L3
它们是并行的。

Google Play Integrity API#

来都来了,再看看占上风的 Play Integrity API 吧

这是给开发者 / 服务器用的 设备与应用完整性证明接口,是 SafetyNet 的继任者。
(请区别于 Play Protect/Play 保护机制,那是给用户用的本地恶意软件防护与应用扫描机制)

它的作用是让 APP 判断:这个请求是不是来自一个“未被篡改、未被滥用、可信的 Android 设备与 APP 实例”
它检查的维度包括设备完整性、应用完整性和账号 / 环境。

为什么 Google 要换掉 SafetyNet?

  • 返回字段太多、太透明
  • 易被针对性绕过(Magisk 时代)
  • 客户端可验证(被 Hook)
  • OEM 策略暴露过多

改进方向:

  • 强制服务端校验
  • 策略黑盒化
  • 与 Play 服务账号、分发强绑定
  • 降低“字段级伪造”空间
我对安卓设备启动信任链的理解
https://blog.y11han.icu/posts/android-device-boot-trust-chain/
作者
Y11Han
发布于
2025-12-25
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时