ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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/TEESimulatorTEESimulator 的 Patch 模式是 Android 硬件密钥证明Key Attestation模拟方案中最接近真机的一种工作方式它让真实硬件继续生成密钥只把证明证书链的根换成你自己提供的 Keybox并顺手把信任根Root of Trust改写为已锁 Verified。本文带你完整看懂这条重签流水线背后的 X.509 与 DER 字节级手术。Patch 模式与 Generation 模式两种玩法怎么选TEESimulator 的每个配置档案profile都有两种运行模式定义见 schema.js对比项Patch 模式默认Generation 模式密钥由谁生成真实 TEE 硬件进程内软件 KeyMintkmr-ta密钥 blob 是否保留✅ 原样保留后续操作继续走真实 HAL❌ 软件生成带 TEESIMkm 标记证明内容challenge、版本、TEE 强制授权真实硬件写入原样保留由 kmr-ta 现场生成证书链根重签为 Keybox 根直接由 Keybox 签发适用场景硬件证明可用的设备检测点更少硬件损坏/不可证明时的兜底默认配置里就是mode: patch见 config.default.json。一句话概括Patch 模式 真硬件干活只换签名人和几个字段。重签流水线generateKey 之后的四步走路由逻辑在 keymint_router.cpp 中PatchAttest路径整体流程如下转发命中目标应用的generateKey请求被原样转发给真实 KeyMint HAL密钥是货真价实的硬件密钥保留 blob真实的 key blob 一字不改交还应用之后begin/finish等操作依旧转发给硬件见 keymint/README.md重签叶子把硬件签出的真实证明叶子DER 格式 X.509 证书交给 Rust 端的teesim_km_patch_attestation即 resign.rs 里的patch_attestation换根输出返回[重签后的叶子, Keybox 证书链]替换掉原有证明链。若真实 HAL 拒绝或没有返回证明比如某些解锁后的机型会自动回退到 Generation 模式保证目标应用总能拿到一把可用的密钥。特殊场景兜底已有密钥补签应用在纳管前已生成的密钥守护进程会把其真实叶子通过控制通道重新走一遍同样的重签teesim_cfg_resign见 ReAttest.ktStrongBox 关卡设备解锁后 StrongBox 可能无法证明采集阶段的g_strongbox_ok决定 StrongBox 级别是走 Patch 还是强制 Generationkeymint_router.cpp证明密钥ATTEST_KEY永远走 Generation——因为签假叶子的钥匙也得是我们的这样它日后签发的每个叶子都能被 Patch 信任根。X.509 手术重写叶子证书的三个字段patch_attestation用x509-cert库解析真实叶子后做了三处标准 X.509 层级的改动① 换签发者issuer新 issuer Keybox 叶子证书的 subject即把谁签的这棵树从真实 TEE 换成了你的 Keybox② 换签名算法按被证明密钥的算法选择 Keybox 中对应的 RSA1.2.840.113549.1.1.11或 EC1.2.840.10045.4.3.2SHA-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]设备身份 IDbrand/serial/IMEI…仅替换绝不插入应用没请求 ID 就不加保持与真机行为一致手术规则patch_key_descriptionresign.rs很克制字段存在 →就地替换软件/TEE 两个授权列表都查防止残留真实值信任根/补丁级别缺失 → 按标签号升序插入 TEE 强制列表保持列表有序其余一切字段逐字节原样拷贝——被证明的公钥、challenge、KeyMint 版本、tee-enforced 授权统统不动。新的信任根由build_root_of_trustresign.rs按 AOSPkmr-ta的格式构造已锁定 Verified 状态 采集自真机的 verified-boot 密钥——内容是真的状态是理想的。补丁级别重写的原因也很实际老设备的真实补丁级别往往过旧会拖累 Play Integrity 的 STRONG 评级。一句话总结 源码导读Patch 模式的精髓真硬件写内容Keybox 负责盖章手写 DER 只动该动的五个信任字段。想动手跟读按这个顺序来模块文件看点路由与模式切换keymint_router.cppPatchAttest转发重签、失败回退重签核心X.509resign.rspatch_attestation换根重签DER 手术核心resign.rs上下文标签读写、就地替换Keybox 解析attest.rsRSA/ECDSA 双钥与证书链校验模式配置config.default.jsonmode: 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),仅供参考
返回列表