iOS 隐蔽注入两路线:TrollFools 和 Roothide
内容提要
文章对比了iOS隐蔽注入的两条技术路线。TrollStore+TrollFools无需越狱,仅对单个App原位注入dylib并可持久化,但进程内多出的动态库、Mach-O加载命令及页哈希差异均可被检出,且仅支持iOS 14.0–17.0。Dopamine+Roothide为半不完美越狱,通过随机化jbroot、沙箱隔离和黑名单式注入,使黑名单App进程内几乎无越狱特征,客户端检测基本失效,防线应转向服务端风控与系统升级。
延伸解读
两条路线的本质差异:改一个 App 还是改整个系统
TrollFools 依赖 TrollStore 的 CoreTrust 漏洞,只对单个 App 的二进制写入 LC_LOAD_DYLIB 并重新签名,作用范围被官方声明限定在目标 App 内,无法注入系统进程。Roothide 则是真正的半不完美越狱,通过 launchd 层 posix_spawn hook 和 systemhook 实现全局注入,再以黑名单豁免指定 App。前者是“点状修改”,后者是“面状改造”,这决定了二者的检测面与适用场景完全不同。
TrollFools 的检测面明确,防守成本低
文章指出,TrollFools 走的是 Mach-O 加载命令而非 DYLD_INSERT_LIBRARIES,因此环境变量检测无效;但进程内枚举已加载镜像即可看到多出的、位于 App bundle 内的 dylib,读磁盘 Mach-O 头也能发现官方版本没有的 LC_LOAD_DYLIB,页哈希与官方基线比对同样可判定篡改。三者任一即可检出,说明该路线对检测方并不隐蔽。
Roothide 黑名单机制从结构上消除检测客体
Roothide 将越狱根目录随机化为 .jbroot-<随机十六进制>,并利用 App 沙箱禁止 readdir 父目录的特性使其不可枚举;黑名单 App 在 posix_spawn 阶段直接走原始路径,没有 systemhook 注入、没有环境变量,csflags 与正常进程物理一致,mach 服务探测也按 audit token 排除。文章结论是黑名单 App 进程内目前没有可靠识别手段,这并非绕过检测,而是消除了可被检测的差异。
防守重心应转向服务端与系统版本
文章建议对 TrollFools 路线坚持进程内镜像枚举、Mach-O 检查与哈希基线比对;对 Roothide 黑名单场景则不宜再投入客户端进程内检测,残余痕迹多需 root 或物理接触才有意义。防线应上移到服务端风控,如设备指纹异常、行为序列、相机伪造的音视频与传感器一致性校验。同时系统版本本身是道防线:TrollStore 在 17.0.1 后失效,Dopamine 覆盖范围也有限,推动升级可让工具失去立足点。
Q&A
TrollFools 和 Roothide 两种 iOS 注入方案最本质的区别是什么?
TrollFools 是非越狱方案,只对单个 App 原位注入 dylib,进程内多出的动态库可被检出;Roothide 是真越狱方案,但对黑名单 App 进程内几乎无越狱特征,目前没有可靠检测手段。
TrollStore + TrollFools 支持哪些 iOS 版本?为什么 17.0.1 以上不能用?
支持 iOS 14.0–17.0(仅 17.0 及以下)。因为 TrollStore 依赖 CoreTrust 漏洞 CVE-2023-41991,该漏洞在 iOS 17.0.1 被修复,之后系统无法利用。
TrollFools 注入后,检测方可以通过哪些方式发现?
三种方式:1) 进程内枚举已加载镜像(_dyld_image_count/_dyld_get_image_name)看到多出的 dylib;2) 读取磁盘 Mach-O 头发现额外的 LC_LOAD_DYLIB;3) 对比页哈希与 App Store 官方基线不一致。
Roothide 是如何让黑名单 App 进程内检测不到越狱的?
通过三层防护:1) 随机化 jbroot 路径(/var/containers/Bundle/Application/.jbroot-<随机>/),每次越狱重新随机;2) 利用 App Sandbox 禁止 readdir 父目录,使 App 无法枚举;3) 黑名单 App 在 launchd 的 posix_spawn hook 中走原始路径,不注入 systemhook、不设 DYLD_INSERT_LIBRARIES,csflags 与正常进程一致,并隐藏 jb 相关 mach 服务。
对于 Roothide 越狱的黑名单 App,客户端检测还有用吗?防守方应该怎么做?
客户端进程内检测基本无效,不应再投入。防线应上移到服务端风控,如设备指纹异常、行为序列、多传感器一致性校验;同时推动系统升级,因为 TrollStore 在 17.0.1 后失效,Dopamine 也只覆盖到 18.7.1/26.0.1。
TrollFools 能注入哪些类型的 App?为什么不能注入 Xcode 调试包?
只能注入三类:可卸载的系统 App、TrollStore 安装的 App、加密的 App Store 应用(仅限裸 dylib)。不能注入开发签名/Ad-hoc 签名的 App,因为注入流程第 6 步需用 ct_bypass 重新签名,而 ct_bypass 依赖 CoreTrust 漏洞伪造 App Store 签名模板,开发签名没有模板可复用。