AppEnumGuard 是一款防御性的 rootHide 插件,用于修复被跟踪为 CVE-2025-31207 的已安装应用枚举侧信道。它专为 iOS 17.0–17.3.1 上的 Relaxin 越狱 设计,使用 Relaxin 的 rootHide 架构。该仓库还包含一个普通的沙盒 iOS 测试应用,用于演示漏洞结果并验证缓解措施。
CVE-2025-31207 是 Apple FrontBoard 应用启动逻辑中的一个信息泄露漏洞。沙盒应用可以通过私有的 SpringBoardServices 启动函数提交任意 bundle 标识符,并利用不同的返回码来区分已安装应用与缺失应用。这可能会泄露有关用户已安装应用的隐私信息,包括银行、即时通讯、安全、侧载和越狱相关应用。
Apple 将该问题描述为一个逻辑问题,可能让应用枚举已安装应用。Apple 在 iOS 和 iPadOS 18.5 中通过改进检查修复了该问题。因此,iOS 17.0–17.3.1 在操作系统层面仍然受影响。
| 组件 | 支持目标 |
|---|---|
| iOS | 17.0–17.3.1 |
| 越狱 | Relaxin |
| Bootstrap/包架构 | rootHide / iphoneos-arm64e |
| 设备架构 | arm64e;插件二进制仅包含 arm64e 分片 |
| 包 | 安装 rootHide .deb,而非常规 rootless 构建 |
Relaxin 使用 rootHide bootstrap/包架构,因此 AppEnumGuard 使用 rootHide Theos 构建,并包含 rootHide .jbroot 加载器路径。该包声明了 firmware (>= 17.0) 和 firmware (<< 17.4),与支持的 Relaxin 范围为 17.0–17.3.1 相匹配。
该插件和测试应用已在真实的 Relaxin/rootHide 设备上共同验证:移除插件后测试应用检测到泄露,安装插件后返回绿色通过。
公开的原语调用了私有 SpringBoardServices 函数 SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions。在易受攻击的系统上,它对已安装应用和缺失应用返回不同的错误:
9:目标存在,但启动被策略拒绝7:目标不存在该插件被注入到 UIKit 应用进程中。对于普通容器安装的应用,它会在不提交私有启动请求的情况下返回 7。Apple 和其他应用容器之外的系统进程保留原始行为。
每个 GitHub Release 都包含两个可安装的构件:
AppEnumGuard_1.0.0_roothide_iphoneos-arm64e.deb — rootHide 插件AppEnumGuardTester_1.0.0_sandboxed.ipa — 沙盒验证应用.deb 并重启桌面(respring)。安装 WhatsApp 后的预期结果:
| 状态 | 目标 | 缺失 | 测试结果 |
|---|---|---|---|
| 未安装插件 | 9 | 7 | 红色 / 失败 |
| 插件已启用 | 7 | 7 | 绿色 / 通过 |
原始设备测试复现了两种状态:卸载插件产生红色 9 / 7 结果,安装插件产生绿色 7 / 7 结果。
安装 rootHide Theos,然后运行:
cd Tweak
THEOS=/path/to/theos-roothide \
make clean package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=roothide
测试应用使用 Xcode 的 iPhoneOS SDK 编译,没有越狱或提权权限:
./scripts/build-tester-ipa.sh
生成的 IPA 位于 dist/ 目录。它是 ad-hoc 签名的,因此安装工具可以用普通的开发证书重新签名。不要授予它 platform-application 或 com.apple.private.security.no-sandbox,因为该测试明确设计为在普通应用沙盒中运行。
7 / 7 测试才有意义。MIT