
CVE-2025-31207 완화 및 iOS 15–18.4.1의 rootless 및 rootHide 탈옥용 샌드박스 테스터.
AppEnumGuard는 CVE-2025-31207로 추적되는 설치 앱 열거 사이드 채널에 대한 방어용 트윅입니다. iOS 15.0–18.4.1에서 기존의 rootless 및 rootHide 탈옥 환경을 지원합니다. 이 저장소에는 취약한 결과를 시연하고 완화 조치를 검증하는 일반 샌드박스 iOS 테스트 애플리케이션도 포함되어 있습니다.
CVE-2025-31207은 Apple의 FrontBoard 애플리케이션 실행 로직에서 발생하는 정보 노출 취약점입니다. 샌드박스 애플리케이션이 비공개 SpringBoardServices 실행 함수를 통해 임의의 번들 식별자를 제출하고, 서로 다른 반환 코드를 사용하여 설치된 앱과 누락된 앱을 구분할 수 있습니다. 이를 통해 사용자가 설치한 앱(은행, 메신저, 보안, 사이드로딩, 탈옥 관련 앱 포함)에 대한 개인 정보가 노출될 수 있습니다.
Apple은 이 문제를 앱이 설치된 앱을 열거할 수 있는 로직 문제로 설명합니다. Apple은 iOS 및 iPadOS 18.5에서 개선된 검사를 통해 이를 수정했습니다. 결과적으로 iOS 18.5 이전 시스템은 OS 수준에서 여전히 영향을 받습니다.
| 구성 요소 | 지원 대상 |
|---|---|
| iOS | 15.0–18.4.1 |
| 탈옥 | 모든 기존 rootless 또는 rootHide 탈옥 환경 |
| 부트스트랩/패키지 아키텍처 | rootless / iphoneos-arm64; rootHide / iphoneos-arm64e |
| 기기 아키텍처 | arm64 및 arm64e (rootless); arm64e (rootHide) |
| 패키지 | 기기의 부트스트랩과 일치하는 패키지 설치 |
기본 빌드는 기존 rootless Theos를 사용하며 arm64 및 arm64e 슬라이스를 포함합니다. rootHide 변형은 rootHide Theos로 빌드되며 필요한 rootHide .jbroot 로더 경로를 포함합니다. 두 패키지 모두 firmware (>= 15.0) 및 firmware (<< 18.5)를 선언합니다. Apple이 CVE-2025-31207을 수정한 iOS 18.5 이상에서는 완화 조치가 필요하지 않습니다.
SpringBoard 측 v1.1 트윅과 샌드박스 테스터는 테스터에 대한 주입을 비활성화한 상태에서 iOS 17.3.1 빌드 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를 해당 프로세스에 주입하지 않고도 호출자를 보호합니다.
릴리스 1.2는 두 부트스트랩 모두에 대해 빌드할 수 있습니다:
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/에 배치됩니다. 임시 서명되어 있으므로 설치 프로그램이 일반 개발 ID로 다시 서명할 수 있습니다. 테스트가 일반 애플리케이션 샌드박스에서 실행되도록 설계되었으므로 platform-application 또는 com.apple.private.security.no-sandbox를 부여하지 마세요.
7 / 7 테스트는 대상 애플리케이션이 설치된 것으로 알려진 경우에만 의미가 있습니다.MIT