TEESimulator核心原理三:内嵌AOSP参考KeyMint TA(kmr-ta)为何让证明证书逐字段可信
TEESimulator核心原理三内嵌AOSP参考KeyMint TAkmr-ta为何让证明证书逐字段可信【免费下载链接】TEESimulatorSoftware simulation for Android hardware-backed key pairs with key attestation项目地址: https://gitcode.com/gh_mirrors/te/TEESimulatorTEESimulator是一款 Android 硬件密钥证明Key Attestation模拟器——它不伪造证书而是把 AOSP 官方的参考 KeyMint 可信应用kmr-ta直接搬进 keystore 守护进程里运行再用自己的密钥keybox来签名。正因如此它生成的软件 KeyMint 证明证书每一个字段都与真实安全环境内部一致不是我们手工把上百个字段一个个调对而是按构造by construction天然可信。一、手工伪造证明证书为什么总是差一点要理解这个设计的价值得先看清楚一张 KeyMint 证明证书里到底装了多少东西。证书的核心是一条证明扩展OID 为1.3.6.1.4.1.11129.2.1.17里面塞着一份KeyDescription足足8 个字段其中最关键的是两份授权列表软件强制列表software-enforced应用请求的用途、算法、限制等TEE 强制列表tee-enforcedroot of trust信任根、OS 版本、OS/厂商/启动补丁级别、密钥安全级别……每一个字段都有一个数字标签tag信任根是[704]、OS 版本是[705]、OS 补丁级别是[706]、厂商补丁级别是[718]、启动补丁级别是[719]。这些值不但要对它们的DER 编码、标签顺序、签名算法、版本字段也必须相互咬合。手工伪造的困境在于你必须在没有真机的情况下同时把几十个字段调成自洽的一整套。任何一处对不上——标签号错一位、整数编码多一个字节、版本与标签不匹配——服务端如 Play Integrity做交叉校验时矛盾立刻暴露。证书不是看起来像就行而是内部必须自洽才行。这正是逐字段可信这四个字的分量。二、解法不伪造而是直接运行 AOSP 官方的 kmr-taTEESimulator 的破题思路是别去复刻证书直接运行生成证书的原始机器。项目内嵌了 AOSP 的参考 KeyMint TA也就是kmr-ta——正是 Cuttlefish 官方模拟器在跑的那个软件 KeyMint见 third_party/README.md。它被驱动成一台真正的 KeyMint 状态机generateKey、begin/update/finish、密钥特性查询全流程照跑。一句话概括架构一个引擎两个前端。加密引擎Rust 静态库负责造钥匙、跑运算、签证明而 Android 12 的keymint/拦截器与 Android 10/11 的keystore/拦截器只是把它包在里面的管道详见 rust/teesim-km/README.md。三、逐字段可信从何而来3.1 同一个状态机产出全部字段证明扩展怎么组装、密钥使用授权怎么排、记录里标签的顺序怎么走——全部由真实 TEE 也在运行的那同一份代码产生。这不是我们努力把它做对了而是它本来就是这么生成的。字段之间的自洽关系是官方状态机天然保证的而不是靠人肉核对一百处。这就是 README.md 反复强调的那句话internally consistent by construction。3.2 标签号必须等于 KeyMint 的编码更隐蔽的一致性藏在参数序列化里。KeyMint 的请求/响应走 CBOR参数按标签号分派——解码器是靠 tag 来决定值类型的。一旦编号错一点错误不会报错而是静默地变成错误类型。TEESimulator 在这里吸取了真实教训源码注释点名的USER_SECURE_ID符号位 bug见 rust/teesim-km/src/lib.rs不手工拼 CBOR。参数与kmr_wire::KeyParam的来回转换一律走kmr_wire自带的AsCborValue编解码器见 rust/teesim-km/src/capi.rs。好处是标签号天然等于 KeyMint 的官方编号因为用的是同一套编解码逻辑——错不了也不必记住那张数字表。四、我们只动了窄窄的一片 嵌入官方 TA 后改动被刻意压到最小。真正被替换的只有四处替换项替换为作用加密后端BoringSSLkmr-crypto-boring所有原语改由 BoringSSL 提供签名来源keybox 批次密钥证明用用户提供的密钥签名而非硬件密钥安全级别 / 版本按请求到达的 HAL 级别固定让双级别设备各自诚实补丁模式重签真实硬件叶保留真机密钥只换证明的根keybox 的解析在 rust/teesim-km/src/attest.rs它从keybox.xml里取出 RSA 与 ECNIST P-256两把批次签名密钥及各自证书链每条链至少两张证书。没有内置兜底密钥——keybox 缺失或格式不对TA 直接报错、拦截器拒绝挂钩让配置错误的模块变成无害的哑弹而不是隐患。五、补丁让参考 TA 在进程内诚实运行官方 TA 原本为 Soong 构建、且假定运行在真机安全世界里。要让它在一个普通进程里诚实跑起来需要几处不碰加密的适配补丁记录在 rust/patches/。5.1 安全级别与版本补丁一台真设备对每个安全级别都跑独立的 KeyMint 实例。kmr-ta-seclevel.patch 让单个 TA 能按其请求到达的 HAL 级别来签名并精确处理版本对应关系把原始attestationVersion映射到正确的keyMintVersion——Keymaster 3.0 是 3、4.0 是 4、4.1 是 41KeyMint 版本则直接相等MODULE_HASH标签724只在版本 ≥ 400 时才写入这样一台TEE 报 v4、StrongBox 报 v3的双级别设备在两个级别上都能保持诚实不会越级冒领。5.2 认证 token 与重定时间戳kmr-ta-authtoken.patch 处理生物识别 token它由真机 Gatekeeper 用ISharedSecret密钥做 MAC而进程内 TA 从不参与那次协商、没有密钥可验证——于是无密钥可验时信任 token 的存在其余绑定项照常强制。kmr-ta-restamp则允许密钥 blob 的补丁时间戳双向重定真实硬件只会往前走而模拟器的级别可被用户调低。六、信任根为何必须冻结 最微妙的一处证书里的root of trust信任根不可配置。守护进程启动时从真机硬件密钥里收割一次真实的 verified-boot 密钥、状态、锁定标志然后冻结它。原因有二让证明可信信任根用设备真值证明里那个字段才是真实锁定/已验证设备该有的样子让密钥能用这些字段同时是 KeyMint密钥加密密钥KEK派生的输入见 rust/teesim-km/src/device.rs。冻结它们跨重启、跨 profile 派生出同一个 KEK之前会话里创建的密钥才不会解不开。换句话说信任根既要对又要稳。真实 冻结两全其美。七、两种工作模式生成 vs 补丁拦截器按 profile 决定每个请求走哪条路路由逻辑见 keymint/keymint_router.cpp生成模式整个密钥连同证明都在这里铸造完全出自 TA 之手补丁模式保留真实的硬件密钥 blob所以密钥仍硬件支持只把证明叶交给 rust/teesim-km/src/resign.rs重签到 keybox 之下——把 root of trust 改成 profile 的 locked/Verified把补丁级别换成 profile 的新鲜值其余真实内容challenge、版本字段、TEE 强制授权原样保留。最终链 [改过的叶, keybox 证书链…]。小结逐字段可信的秘诀一句话就能说完不去对齐一百个字段而是让官方的 KeyMint 状态机自己跑。TEESimulator 只替换了三样东西——加密后端、签名来源、少数身份字段——而让attestation extension、标签顺序、DER 编码、版本对应这些最难人工对齐的部分全部交给 AOSP 自己的代码按构造产出。这就是内嵌kmr-ta的价值它让一张软件签发的证明证书在内部一致性上与真机 TEE 的产物无从区分。【免费下载链接】TEESimulatorSoftware simulation for Android hardware-backed key pairs with key attestation项目地址: https://gitcode.com/gh_mirrors/te/TEESimulator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →