AMFI绕过全解析:vphone-cli 如何破解 iOS 代码签名信任机制
【免费下载链接】vphone-cli项目地址: https://gitcode.com/GitHub_Trending/vp/vphone-cli
AMFI 绕过是 vphone-cli 能在 Mac 上启动虚拟 iPhone 并运行未签名代码的核心。本文带你从 iOS 代码签名信任机制讲起,逐层拆解 vphone-cli 对 AMFI 的三重绕过:信任缓存强制放行、execve 杀死路径改写、SHA256 哈希类型门禁解除。全文面向新手,无需汇编基础,读完即可理解这套"虚拟 iPhone 越狱链"是如何让自签名 App 顺利运行的。
AMFI 是什么:iOS 代码签名的守门人
在 macOS 的世界里,AMFI 指Apple Mobile File Integrity——内核中的一个 MACF 策略组件,职责只有一件事:任何二进制在 exec 之前,必须通过代码签名验证。它检查的内容包括:
- 代码签名是否存在(完全无签名的二进制直接被杀);
- CDHash 是否在信任缓存(Trust Cache)里(Apple 官方发布的二进制白名单);
- 哈希类型是否符合要求(例如是否 SHA256);
- entitlements(权限)是否一致。
任何一项失败,内核都会记录类似AMFI: code signature validation failed的日志并终止该进程——这就是你平时看到自签名 App 闪退的真正原因。
vphone-cli 用 Apple 的 Virtualization.framework 在 Mac 上启动"研究用虚拟机 iPhone"(PCC 研究 VM 基础设施)。要让越狱生态(Sileo、TrollStore、注入 dylib)在虚拟机里工作,就必须让 AMFI 放行非 Apple 签名的代码。这正是 sources/FirmwarePatcher/Kernel/JBPatches/ 目录下一批内核补丁要做的事。
先搞清信任机制:一个二进制是如何被"信任"的
iOS 的代码签名信任链可以简化为三步:
| 步骤 | 组件 | 做什么 |
|---|---|---|
| 1 | TXM(Trusted Execution Monitor) | 在安全异常级别验证代码签名哈希(selector 24 验证链) |
| 2 | AMFI 信任缓存查询 | 调用AMFIIsCDHashInTrustCache检查二进制的 CDHash 是否在信任缓存中 |
| 3 | AMFI execve 回调 | 综合判断签名/entitlements/受限执行模式,决定是否杀死进程 |
只有三步全部通过,进程才能运行。vphone-cli 的jb(越狱)变体共对内核打了113 个补丁,其中 AMFI 相关的三道补丁恰好分别卡在这三个关键点。五档固件变体的补丁规模对比可见 research/0_binary_patch_comparison.md。
绕过一:JB-01 信任缓存恒真补丁(最关键)
这是整个 AMFI 绕过的心脏,对应内核方法patch_amfi_cdhash_in_trustcache。
原始行为:AMFIIsCDHashInTrustCache会把二进制的 CDHash 交给 TXM 的 selector 14 路径做信任缓存成员查询,返回"在/不在"。
补丁后行为:vphone-cli 直接重写了这个函数的入口——恒返回"存在",并把结果写入输出参数。效果是:任何 CDHash 都"在"信任缓存里,包括你用自己证书重签的 App 和 dylib。
// 补丁前:int ok = txm_query_cdhash(hash, type, out); return ok == 0; // 补丁后:if (out) *out = 1; return 1;为什么它如此关键?因为 AMFI 的 vnode 签名回调(vnode_check_signature)里有三个验证分支——信任缓存分支、can-execute-cdhash 分支、动态/amfid 分支——都会汇入这个"信任缓存在不在"的判断。强制放行后,非 Apple 签名代码走的是"受信任"路径,内核会给它打上信任标记位(csflags |= 0x04000000)。
实现细节(适合进阶读者):补丁器 KernelJBPatchAmfiTrustcache.swift 并不硬编码地址(每个 iOS 版本地址都不同),而是语义匹配:在 AMFI 代码区扫描函数边界(PACIBSP),寻找"保存 x2 → 栈清零 → 传栈槽 → 调用查询 → 保存结果 → 快路径判断 → 空指针保护"这一独特指令形状,全局唯一命中后才改写前 4 条指令。完整分析文档见 research/kernel_patch_jb/patch_amfi_cdhash_in_trustcache.md。
绕过二:JB-02 execve 杀死路径改写(一条指令翻转生死)
信任缓存只是第一道门。AMFI 还注册了 execve 回调(_cred_label_update_execve),综合检查完全无签名代码、受限执行模式拒绝、dyld 签名不可验证、entitlements 不匹配等情况——所有失败分支最终都汇入同一个"杀死出口",返回 1(拒绝)。
vphone-cli 的做法极其优雅(JB-02patch_amfi_execve_kill_path):
- 把共享出口处的
MOV W0, #1(拒绝)改为MOV W0, #0(放行); - 前面所有的日志、断言、预检查原样保留,只翻转最终决策。
💡 这就是逆向补丁的精髓:找到所有拒绝路径的"漏斗口",改一个字节,胜过逐个绕过十几个检查分支。详细追踪见 research/kernel_patch_jb/patch_amfi_execve_kill_path.md。
⚠️ 需要说明:该补丁针对的是完全未签名/深验证失败的兜底路径。实践中越狱场景多是"有签名但不在 Apple 信任缓存"的自签代码,主要靠 JB-01 放行;JB-02 在新版本调度中已默认由 C21 类补丁在相同位置接替(详见 research/0_binary_patch_comparison.md 中的 JB 补丁表)。
绕过三:JB-06 解除 SHA256-only 哈希类型门禁
即使前面都通过了,AMFI 还埋了一个"迟到的拒绝":在签名验证的后期,如果哈希类型不是 SHA256(值不为 2),就记录Hash type is not SHA256并强制拒绝。这会让前面好不容易被接受的自签代码在最后一步又被杀。
JB-06(patch_post_validation_additional)把判断指令cmp w0, #2改为cmp w0, w0(恒相等),彻底解除这个哈希类型门禁。这个补丁对 launchd 注入 dylib 的工作流尤其重要——因为动态加载的 dylib 也会走同一条验证路径。分析文档:research/kernel_patch_jb/patch_post_validation_additional.md。
上游还有一关:TXM 的信任缓存二分查找
细心的读者会问:AMFI 查询信任缓存最终不是要问 TXM 吗?没错。在更底层的 TXM(运行于 SPTM 监督下的安全监控器)中,regular变体就已经打了一个补丁:把信任缓存二分查找的比较调用bl hash_cmp改为mov x0, #0(恒匹配),让 TXM 层面的哈希比对直接命中。
dev/jb变体更进一步,对 TXM 的 selector 24(代码签名验证链)、selector 41(get-task-allow 调试权限)等做了 12 个补丁。一个有趣的工程细节:TXM 不能像普通函数那样ret返回(调用者是更高安全级别的 SPTM,直接返回会触发取指权限异常),只能通过svc #0陷回 SPTM——所以补丁必须走完整的正常返回链。这部分完整分析在 research/txm_jb_patches.md。
补丁如何落地:一条命令搞定
理解机制后,实际使用非常省心。五档固件变体的安全放行程度递增:
| 变体 | 启动链补丁数 | 说明 |
|---|---|---|
less | 4 | 无 AMFI 绕过,保持全部缓解措施 |
regular | 42 | AMFI/SSV/Img4/TXM 基础绕过 |
dev | 53 | + TXM entitlement/调试绕过 |
jb | 113 | 完整越狱(Sileo、TrollStore 首启自动安装) |
exp | 141 | JB 超集 + 反虚拟机检测研究补丁 |
一条命令走完整条流水线(下载 → 打补丁 → DFU 恢复 → 安装 CFW → 首次启动):
vphone-cli vm create myphone -V jb # 选择越狱变体 vphone-cli vm launch myphone补丁器用 Swift 实现,位于 sources/FirmwarePatcher/,通过 Keystone 编码器生成替换指令、Capstone 校验往返一致性,保证同一变体输出字节级可复现。所有 JB 补丁的运行时验证记录(含逐条补丁的命中地址与 IDA 映射结果)保存在 research/kernel_patch_jb/runtime_verification/。
风险与安全影响:务必了解
- JB-01 是全局信任决策绕过:CDHash 来源区分被彻底移除,"不在信任缓存"的策略分支不再正常运作。这是设计使然,安全影响高。
- JB-02 削弱了内核策略闸门:诊断保真度下降,特权面扩大。
- 整套机制仅面向本地研究虚拟机(需要 Apple Silicon + macOS 15+ + SIP/AMFI 放宽),请勿将其移植到真实设备——在真机上破坏签名信任会直接导致设备不可用。
小结
vphone-cli 对 AMFI 的破解是一次教科书式的分层拆解:TXM 层让信任缓存查找恒命中,内核 AMFI 层用"恒真函数 + 共享杀死出口翻转 + 哈希门禁解除"三板斧放行自签代码,再配合 CFW 安装阶段对 dylib 注入链的支撑,最终让虚拟 iPhone 完整跑起越狱生态。配合首图那样的 root SSH 终端(ssh -p 22222 mobile@<vm-ip>,密码alpine),你就能在一台 Mac 上拥有一个可自由折腾的 iOS 沙盒了。
【免费下载链接】vphone-cli项目地址: https://gitcode.com/GitHub_Trending/vp/vphone-cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考