
AppEnumGuard v1.2
CVE-2025-31207 缓解措施及沙盒测试工具,适用于 iOS 15–18.4.1 上的 rootless 和 rootHide 越狱。
AppEnumGuard
AppEnumGuard 是针对已安装应用枚举侧信道(跟踪编号为 CVE-2025-31207)的防御性调整。它支持 iOS 15.0–18.4.1 上的常规 rootless 和 rootHide 越狱环境。 该仓库还包含一个普通的沙盒化 iOS 测试应用,用于演示漏洞结果并验证缓解措施。
CVE-2025-31207
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 以来的变化
版本 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— 带图标的沙盒化验证应用
安装与验证
- 安装与 rootless 或 rootHide bootstrap 匹配的
.deb并 respring。 - 使用正常的开发者/侧载签名安装测试器 IPA。
- 为 AppEnum Test 保持 AppEnumGuard 注入禁用;v1.1 从 SpringBoard 保护它。
- 点击你已知已安装应用的 WhatsApp、YouTube 或 Spotify 图标。
所选目标已安装时的预期结果:
| 状态 | 目标 | 缺失 | 测试器结果 |
|---|---|---|---|
| 无调整 | 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
构建测试器 IPA
测试器使用 Xcode 的 iPhoneOS SDK 编译,没有越狱或提升权限:
./scripts/build-tester-ipa.sh
生成的 IPA 放置在 dist/ 中。它是 ad-hoc 签名的,因此安装程序可以使用正常的开发身份重新签名。不要授予它 platform-application 或 com.apple.private.security.no-sandbox,因为该测试专门设计为在普通应用沙盒中运行。
范围与限制
- 这是针对已公开 SpringBoardServices 原语的用户空间缓解措施,而非 Apple 完整的 FrontBoard 补丁。
- 版本 1.1 不需要注入受保护的应用。全局禁用注入或对 SpringBoard 本身禁用注入将禁用缓解措施。
- 服务端实现已在 iOS 17.3.1 build 21D61 上确认。在其他受支持版本上,仅当私有选择器具有预期的运行时验证 ABI 时,该调整才会安装其挂钩。
- 仅当目标应用已知已安装时,
7 / 7测试才有意义。 - 测试器有意调用未记录的私有 API,不适合提交 App Store。
参考
许可证
MIT