
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 메서드를 후킹하는 대신 fail open 방식으로 동작합니다.
버전 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 |
테스터는 알려진 취약한 9 / 7 결과에 대해서만 빨강을 보고하고, 그 외의 모든 숫자 결과에 대해서는 초록을 보고합니다. 빨강 결과는 AppEnumGuard가 설치되지 않았음을 나타냅니다.
초록 결과는 App not detected로 표시됩니다. 취약한 9 / 7 결과는 App detected 및 AppEnumGuard missing으로 표시됩니다.
설치된 것으로 알고 있는 앱만 선택하십시오. 7 / 7만으로는 작동하는 완화 조치와 존재하지 않는 대상을 구별할 수 없습니다.
테스터에는 간단한 프로젝트 설명과 이 GitHub 저장소로의 클릭 가능한 링크도 포함되어 있습니다.
기기 테스트에서는 테스터 주입이 비활성화된 상태로 두 상태를 모두 재현했습니다. 트윅을 제거하면 빨강 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 서명되어 있으므로 설치 프로그램이 일반 개발 ID로 다시 서명할 수 있습니다. 테스트는 특히 일반 애플리케이션 샌드박스에서 실행되도록 의도되었으므로 platform-application 또는 com.apple.private.security.no-sandbox 권한을 부여하지 마십시오.
7 / 7 테스트는 대상 애플리케이션이 설치되어 있는 것으로 알려진 경우에만 의미가 있습니다.MIT