news 2026/10/4 9:57:37

TEESimulator Patch模式机制详解:真实硬件证明如何被重签为Keybox根(X.509与DER手术全解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TEESimulator Patch模式机制详解:真实硬件证明如何被重签为Keybox根(X.509与DER手术全解)

TEESimulator Patch模式机制详解:真实硬件证明如何被重签为Keybox根(X.509与DER手术全解)

【免费下载链接】TEESimulatorSoftware simulation for Android hardware-backed key pairs with key attestation项目地址: https://gitcode.com/gh_mirrors/te/TEESimulator

TEESimulator 的 Patch 模式是 Android 硬件密钥证明(Key Attestation)模拟方案中最接近真机的一种工作方式:它让真实硬件继续生成密钥,只把证明证书链的根换成你自己提供的 Keybox,并顺手把信任根(Root of Trust)改写为"已锁 + Verified"。本文带你完整看懂这条"重签"流水线背后的 X.509 与 DER 字节级手术。

Patch 模式与 Generation 模式:两种玩法怎么选

TEESimulator 的每个配置档案(profile)都有两种运行模式,定义见 schema.js:

对比项Patch 模式(默认)🩹Generation 模式
密钥由谁生成真实 TEE 硬件进程内软件 KeyMint(kmr-ta)
密钥 blob 是否保留✅ 原样保留,后续操作继续走真实 HAL❌ 软件生成,带 TEESIMkm 标记
证明内容(challenge、版本、TEE 强制授权)真实硬件写入,原样保留由 kmr-ta 现场生成
证书链根重签为 Keybox 根直接由 Keybox 签发
适用场景硬件证明可用的设备(检测点更少)硬件损坏/不可证明时的兜底

默认配置里就是"mode": "patch",见 config.default.json。一句话概括:Patch 模式 = 真硬件干活,只换"签名人"和"几个字段"。

重签流水线:generateKey 之后的四步走

路由逻辑在 keymint_router.cpp 中(PatchAttest路径),整体流程如下:

  1. 转发:命中目标应用的generateKey请求被原样转发给真实 KeyMint HAL,密钥是货真价实的硬件密钥;
  2. 保留 blob:真实的 key blob 一字不改交还应用,之后begin/finish等操作依旧转发给硬件(见 keymint/README.md);
  3. 重签叶子:把硬件签出的真实证明叶子(DER 格式 X.509 证书)交给 Rust 端的teesim_km_patch_attestation,即 resign.rs 里的patch_attestation;
  4. 换根输出:返回[重签后的叶子, Keybox 证书链]替换掉原有证明链。

若真实 HAL 拒绝或没有返回证明(比如某些解锁后的机型),会自动回退到 Generation 模式,保证目标应用总能拿到一把可用的密钥。

特殊场景兜底

  • 已有密钥补签:应用在纳管前已生成的密钥,守护进程会把其真实叶子通过控制通道重新走一遍同样的重签(teesim_cfg_resign),见 ReAttest.kt;
  • StrongBox 关卡:设备解锁后 StrongBox 可能无法证明,采集阶段的g_strongbox_ok决定 StrongBox 级别是走 Patch 还是强制 Generation(keymint_router.cpp);
  • 证明密钥(ATTEST_KEY):永远走 Generation——因为"签假叶子的钥匙也得是我们的",这样它日后签发的每个叶子都能被 Patch 信任根。

X.509 手术:重写叶子证书的三个字段

patch_attestation用x509-cert库解析真实叶子后,做了三处标准 X.509 层级的改动:

① 换签发者(issuer):新 issuer = Keybox 叶子证书的 subject,即把"谁签的这棵树"从真实 TEE 换成了你的 Keybox;

② 换签名算法:按被证明密钥的算法选择 Keybox 中对应的 RSA(1.2.840.113549.1.1.11)或 EC(1.2.840.10045.4.3.2)SHA-256 签名算法;Keybox 若只有单一算法则自动回退(resign.rs);

③ 重写 KeyMint 证明扩展:定位 OID1.3.6.1.4.1.11129.2.1.17的扩展,对其内部的KeyDescription执行下面的 DER 手术。

改完之后,用 Keybox 私钥对新的tbsCertificate重新签名(复用与生成模式相同的 BoringSSL 后端),重新打包为 DER 叶子。

DER 手术:高编号上下文标签下的字节替换

KeyDescription里的信任根和补丁级别藏在高编号[704]这类上下文标签下,通用证书库无法直接寻址,所以 resign.rs 手写了一小套 DER 读写器来"做手术"。重写对象一目了然:

标签字段处理方式
[704]RootOfTrust(信任根)替换;缺失则插入
[705]OS_VERSION替换;缺失则插入
[706]OS_PATCHLEVEL替换;缺失则插入
[718]VENDOR_PATCHLEVEL替换;缺失则插入
[719]BOOT_PATCHLEVEL替换;缺失则插入
[710]~[717]、[723]设备身份 ID(brand/serial/IMEI…)仅替换,绝不插入(应用没请求 ID 就不加,保持与真机行为一致)

手术规则(patch_key_description,resign.rs)很克制:

  • 字段存在 →就地替换(软件/TEE 两个授权列表都查,防止残留真实值);
  • 信任根/补丁级别缺失 → 按标签号升序插入 TEE 强制列表,保持列表有序;
  • 其余一切字段逐字节原样拷贝——被证明的公钥、challenge、KeyMint 版本、tee-enforced 授权统统不动。

新的信任根由build_root_of_trust(resign.rs)按 AOSPkmr-ta的格式构造:已锁定 + Verified 状态 + 采集自真机的 verified-boot 密钥——"内容是真的,状态是理想的"。补丁级别重写的原因也很实际:老设备的真实补丁级别往往过旧,会拖累 Play Integrity 的 STRONG 评级。

一句话总结 + 源码导读

Patch 模式的精髓:真硬件写内容,Keybox 负责盖章,手写 DER 只动该动的五个信任字段。想动手跟读,按这个顺序来:

模块文件看点
路由与模式切换keymint_router.cppPatchAttest转发+重签、失败回退
重签核心(X.509)resign.rspatch_attestation换根重签
DER 手术核心resign.rs上下文标签读写、就地替换
Keybox 解析attest.rsRSA/ECDSA 双钥与证书链校验
模式配置config.default.json"mode": "patch"与补丁级别配置
架构说明rust/teesim-km/README.md引擎级设计文档

上手只需:把keybox.xml放到/data/adb/teesim/,在 WebUI 里保持默认的 Operation mode = patch 即可(详见根目录 README.md 的 Installation 与 Configuration 章节)。若想从零构建源码,可执行:

git clone --recurse-submodules https://gitcode.com/gh_mirrors/te/TEESimulator cd TEESimulator ./gradlew zipRelease

【免费下载链接】TEESimulatorSoftware simulation for Android hardware-backed key pairs with key attestation项目地址: https://gitcode.com/gh_mirrors/te/TEESimulator

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 9:55:17

插件系统机制解析与插件加载失败排障实战

插件系统和插件生态,可能是前端、嵌入式、甚至普通软件用户最常遇到却又最容易忽视的一类工程问题。我见过不少从“插件崩了,怎么修”开始排查,最后一路追到插件协议设计缺陷的情况;也见过把 IAR 的调试插件、MusicFree 的音频插件…

作者头像 李华
网站建设 2026/10/4 9:50:11

Skills Manager:AI编程工具的可插拔技能调度协议

1. 这不是另一个“AI工具聚合器”,而是一套可插拔的技能调度协议你有没有试过同时开着 Cursor、Windsurf、Continue、Codium、Tabby、CodeWhisperer、GitHub Copilot、Amazon CodeWhisperer、Sourcegraph Cody、Replit Ghostwriter、Mutable AI、Sider、CodeGeeX、B…

作者头像 李华
网站建设 2026/10/4 9:48:36

插件加载失败?一文读懂 did not activate 机制与排查

最近在技术讨论区又看到了那张让人眼熟的报错截图:“failed to load plugins web boot: 2 entries did not activate linxin666/dsh-p”。后面通常跟着一串问题:“是不是软件坏了”“我要不要重装”“plugins 到底是干什么的”。这行英文看着唬人&#x…

作者头像 李华
网站建设 2026/10/4 9:47:04

OpenShell 使用指南:还原经典开始菜单,找回效率

用过 Windows 7 的人,应该都记得那种两列式的经典开始菜单:左边是软件列表和所有程序,右边是文档、图片、计算机这些常用入口,底部一个搜索框加电源按钮,干净利落,打开什么都是两三次点击的事。后来换了新电…

作者头像 李华
网站建设 2026/10/4 9:45:55

约克水生态中央空调值不值得装?杭州高端住宅实测告诉你

在杭州做高端住宅的暖通配套,这几年我经常被业主问到同一句话:约克水生态中央空调到底值不值得装。这个问题背后,是整个市场需求变了——以前大家问的是“你这空调够不够冷、吵不吵”,现在问的是“孩子睡觉能不能不开大风、卫生间…

作者头像 李华