
CVE-2025-31207 mitigazione e tester in sandbox per jailbreak rootless e rootHide su iOS 15–18.4.1.
AppEnumGuard è una modifica difensiva per il canale laterale di enumerazione delle applicazioni installate, tracciato come CVE-2025-31207. Supporta ambienti jailbreak convenzionali rootless e rootHide su iOS 15.0–18.4.1. Il repository contiene anche una normale applicazione di test iOS in sandbox che dimostra il risultato vulnerabile e verifica la mitigazione.
CVE-2025-31207 è una vulnerabilità di divulgazione di informazioni nella logica di avvio delle applicazioni FrontBoard di Apple. Un'applicazione in sandbox può inviare identificatori di bundle arbitrari tramite una funzione privata di avvio SpringBoardServices e distinguere le applicazioni installate da quelle mancanti utilizzando codici di ritorno diversi. Questo può rivelare informazioni private sulle applicazioni installate da un utente, incluse app bancarie, di messaggistica, di sicurezza, di sideloading e legate al jailbreak.
Apple descrive il problema come un difetto logico che potrebbe consentire a un'applicazione di enumerare le app installate. Apple lo ha corretto con controlli migliorati in iOS e iPadOS 18.5. Di conseguenza, i sistemi precedenti a iOS 18.5 rimangono vulnerabili a livello di sistema operativo.
| Componente | Target supportato |
|---|---|
| iOS | 15.0–18.4.1 |
| Jailbreak | Qualsiasi ambiente jailbreak convenzionale rootless o rootHide |
| Architettura bootstrap/pacchetti | rootless / iphoneos-arm64; rootHide / iphoneos-arm64e |
| Architettura dispositivo | arm64 e arm64e (rootless); arm64e (rootHide) |
| Pacchetto | Installare il pacchetto corrispondente al bootstrap del dispositivo |
La build predefinita utilizza Theos convenzionale rootless e include slice arm64 e arm64e. La variante rootHide è compilata con rootHide Theos e contiene i percorsi di loader .jbroot richiesti per rootHide. Entrambi i pacchetti dichiarano firmware (>= 15.0) e firmware (<< 18.5): la mitigazione non è necessaria su iOS 18.5 e versioni successive, dove Apple ha corretto CVE-2025-31207.
La modifica v1.1 lato SpringBoard e il tester in sandbox sono stati verificati insieme su iOS 17.3.1 build 21D61 con l'iniezione disabilitata per il tester. Il tester ha rilevato la perdita con la modifica rimossa e ha restituito un esito verde dopo l'installazione della modifica.
La primitiva pubblicata chiama la funzione privata SpringBoardServices SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions. Su un sistema vulnerabile restituisce errori diversi per un'applicazione installata e una mancante:
9: il target esiste, ma l'avvio è negato dalla policy7: il target non esisteAppEnumGuard 1.1 si inietta solo in SpringBoard e aggancia il metodo comune di validazione della fiducia FBSystemService. Quando una richiesta di avvio non autorizzata restituirebbe l'errore 3 della policy di sicurezza FBSOpenApplicationErrorDomain, la modifica lo cambia nell'errore 4 di applicazione non trovata. L'API esterna SpringBoardServices restituisce quindi 7 sia per i target installati che per quelli mancanti.
Il numero di argomenti del metodo privato e la codifica del tipo Objective-C vengono validati prima dell'installazione dell'hook. Se Apple modifica l'ABI, AppEnumGuard fallisce in modalità aperta invece di agganciare un metodo SpringBoard sconosciuto.
La versione 1.0 agganciava SpringBoardServices all'interno di ogni applicazione UIKit. Funzionava, ma richiedeva l'iniezione in ogni app protetta; un'app che disabilitava o rilevava l'iniezione poteva bypassare la mitigazione. La versione 1.1 sposta l'applicazione a SpringBoard, quindi un singolo hook centrale protegge i chiamanti senza iniettare AppEnumGuard nei loro processi.
La release 1.2 può essere compilata per entrambi i bootstrap:
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb — modifica convenzionale rootlessAppEnumGuard_1.2_roothide_iphoneos-arm64e.deb — modifica rootHideAppEnumGuardTester_1.2_sandboxed.ipa — app di verifica in sandbox con icona.deb corrispondente al bootstrap rootless o rootHide e fare respring.Risultati attesi con il target selezionato installato:
| Stato | Target | Mancante | Risultato tester |
|---|---|---|---|
| Modifica assente | 9 | 7 | Rosso / FAIL |
| Modifica attiva | 7 | 7 | Verde / PASS |
Il tester riporta verde quando l'app selezionata non è rilevabile e rosso quando è rilevabile. Selezionare solo un'app che si sa essere installata: 7 / 7 da solo non può distinguere una mitigazione funzionante da un target che non esiste.
Il test sul dispositivo ha riprodotto entrambi gli stati con l'iniezione del tester disabilitata: la disinstallazione della modifica ha prodotto il risultato rosso 9 / 7, mentre l'installazione della v1.1 ha prodotto il risultato verde 7 / 7.
Con Theos standard, la build predefinita è convenzionale rootless:
cd Tweak
make clean package FINALPACKAGE=1
Per rootHide, installare rootHide Theos ed eseguire:
cd Tweak
THEOS=/path/to/theos-roothide \
make clean package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=roothide
Il tester è compilato con l'SDK iPhoneOS di Xcode e non ha entitlements di jailbreak o elevati:
./scripts/build-tester-ipa.sh
L'IPA risultante viene inserito in dist/. È firmato ad-hoc, quindi un installatore può ri-firmarlo con un'identità di sviluppo normale. Non concedergli platform-application o com.apple.private.security.no-sandbox, poiché il test è specificamente pensato per essere eseguito da una sandbox applicativa normale.
7 / 7 è significativo solo quando l'applicazione target è nota per essere installata.MIT