AppEnumGuard 是针对已安装应用枚举侧信道(跟踪编号为 CVE-2025-31207)的防御性调整。它支持 iOS 15.0–18.4.1 上的常规 rootless 和 rootHide 越狱环境。 该仓库还包含一个普通的沙盒化 iOS 测试应用,用于演示漏洞结果并验证缓解措施。
CVE-2025-31207 是 Apple FrontBoard 应用启动逻辑中的一个信息泄露漏洞。沙盒化应用可以通过私有的 SpringBoardServices 启动函数提交任意 bundle 标识符,并利用不同的返回码区分已安装应用和缺失应用。这可能会泄露用户已安装应用的隐私信息,包括银行、消息、安全、侧载和越狱相关应用。
Apple 将该问题描述为一个逻辑问题,可能允许应用枚举已安装应用。Apple 通过改进 iOS 和 iPadOS 18.5 中的检查来修复该问题。因此,早于 iOS 18.5 的系统在操作系统层面仍然受影响。
| 组件 | 支持目标 |
|---|---|
| iOS | 15.0–18.4.1 |
| 越狱 | 任何常规 rootless 或 rootHide 越狱环境 |
| Bootstrap/包架构 | rootless / iphoneos-arm64;rootHide / iphoneos-arm64e |
| 设备架构 | arm64 和 arm64e(rootless);arm64e(rootHide) |
| 包 | 安装与设备 bootstrap 匹配的包 |
默认构建使用常规 rootless Theos,并包含 arm64 和 arm64e 切片。rootHide 变体使用 rootHide Theos 构建,并包含所需的 rootHide .jbroot 加载器路径。两个包都声明了 firmware (>= 15.0) 和 firmware (<< 18.5):在 iOS 18.5 及更新版本上无需缓解措施,因为 Apple 已修复 CVE-2025-31207。
SpringBoard 端的 v1.1 调整和沙盒化测试器已在 iOS 17.3.1 build 21D61 上共同验证,测试器禁用了注入。测试器在移除调整后检测到泄露,并在安装调整后返回绿色通过。
已公开的原语调用私有 SpringBoardServices 函数 SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions。在易受攻击的系统上,它对已安装应用和缺失应用返回不同的错误:
9:目标存在,但启动被策略拒绝7:目标不存在AppEnumGuard 1.1 仅注入 SpringBoard,并挂钩常见的 FBSystemService 信任验证方法。当未经授权的启动请求会返回 FBSOpenApplicationErrorDomain 安全策略错误 3 时,该调整会将其更改为应用未找到错误 4。然后,外层的 SpringBoardServices API 对已安装和缺失目标都返回 7。
在安装挂钩之前,会验证私有方法的参数数量和 Objective-C 类型编码。如果 Apple 更改 ABI,AppEnumGuard 会以失败开放模式运行,而不是挂钩未知的 SpringBoard 方法。
版本 1.0 在每个 UIKit 应用内部挂钩 SpringBoardServices。它有效,但需要注入到每个受保护的应用中;禁用或检测注入的应用可以绕过缓解措施。版本 1.1 将强制实施移至 SpringBoard,因此一个中央挂钩即可保护调用者,而无需将 AppEnumGuard 注入其进程。
Release 1.2 可以针对任一 bootstrap 构建:
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb — 常规 rootless 调整AppEnumGuard_1.2_roothide_iphoneos-arm64e.deb — rootHide 调整AppEnumGuardTester_1.2_sandboxed.ipa — 带图标的沙盒化验证应用.deb 并 respring。所选目标已安装时的预期结果:
| 状态 | 目标 | 缺失 | 测试器结果 |
|---|---|---|---|
| 无调整 | 9 | 7 | 红色 / FAIL |
| 调整激活 | 7 | 7 | 绿色 / PASS |
当所选应用不可检测时,测试器报告绿色;可检测时报告红色。仅选择你已知已安装的应用:单独的 7 / 7 无法区分有效的缓解措施与不存在的目标。
设备测试在测试器注入禁用的情况下重现了两种状态:卸载调整产生红色 9 / 7 结果,而安装 v1.1 产生绿色 7 / 7 结果。
使用标准 Theos,默认构建为常规 rootless:
cd Tweak
make clean package FINALPACKAGE=1
对于 rootHide,安装 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