
CVE-2025-31207 : atténuation et testeur sandboxé pour les jailbreaks rootless et rootHide sur iOS 15–18.4.1.
AppEnumGuard est un ajustement défensif contre le canal secondaire d'énumération des applications installées, suivi sous le nom de CVE-2025-31207. Il prend en charge les environnements de jailbreak rootless et rootHide conventionnels sur iOS 15.0–18.4.1. Le dépôt contient également une application de test iOS sandboxée normale qui démontre le résultat vulnérable et vérifie l'atténuation.
CVE-2025-31207 est une vulnérabilité de divulgation d'informations dans la logique de lancement d'applications FrontBoard d'Apple. Une application sandboxée peut soumettre des identifiants de bundle arbitraires via une fonction de lancement privée de SpringBoardServices et distinguer les applications installées des applications manquantes à l'aide de codes de retour différents. Cela peut révéler des informations privées sur les applications qu'un utilisateur a installées, notamment les applications bancaires, de messagerie, de sécurité, de sideloading et liées au jailbreak.
Apple décrit le problème comme un problème de logique qui pourrait permettre à une application d'énumérer les applications installées. Apple l'a corrigé avec des vérifications améliorées dans iOS et iPadOS 18.5. Par conséquent, les systèmes antérieurs à iOS 18.5 restent affectés au niveau du système d'exploitation.
| Composant | Cible prise en charge |
|---|
| iOS | 15.0–18.4.1 |
| Jailbreak | Tout environnement de jailbreak rootless ou rootHide conventionnel |
| Architecture bootstrap/paquet | rootless / iphoneos-arm64 ; rootHide / iphoneos-arm64e |
| Architecture de l'appareil | arm64 et arm64e (rootless) ; arm64e (rootHide) |
| Paquet | Installer le paquet correspondant au bootstrap de l'appareil |
La construction par défaut utilise Theos rootless conventionnel et inclut les tranches arm64 et arm64e. La variante rootHide est construite avec rootHide Theos et contient les chemins de chargeur .jbroot rootHide requis. Les deux paquets déclarent
firmware (>= 15.0) et
firmware (<< 18.5) : l'atténuation est inutile sur iOS 18.5 et plus récent, où Apple a corrigé CVE-2025-31207.
L'ajustement v1.1 côté SpringBoard et le testeur sandboxé ont été vérifiés ensemble sur iOS 17.3.1 build 21D61 avec l'injection désactivée pour le testeur. Le testeur a détecté la fuite avec l'ajustement supprimé et a renvoyé un résultat vert après l'installation de l'ajustement.
La primitive publiée appelle la fonction privée SpringBoardServices SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions. Sur un système vulnérable, elle renvoie des erreurs différentes pour une application installée et une application manquante :
9 : la cible existe, mais le lancement est refusé par la politique7 : la cible n'existe pasAppEnumGuard 1.1 s'injecte uniquement dans SpringBoard et accroche la méthode commune de validation de confiance FBSystemService. Lorsqu'une demande de lancement non autorisée renverrait l'erreur de politique de sécurité 3 de FBSOpenApplicationErrorDomain, l'ajustement la change en erreur 4 d'application introuvable. L'API externe SpringBoardServices renvoie alors 7 pour les cibles installées et manquantes.
Le nombre d'arguments et l'encodage de type Objective-C de la méthode privée sont validés avant l'installation du hook. Si Apple modifie l'ABI, AppEnumGuard échoue ouvertement au lieu d'accrocher une méthode SpringBoard inconnue.
La version 1.0 accrochait SpringBoardServices dans chaque application UIKit. Cela fonctionnait, mais nécessitait une injection dans chaque application protégée ; une application qui désactivait ou détectait l'injection pouvait contourner l'atténuation. La version 1.1 déplace l'application de la règle vers SpringBoard, de sorte qu'un seul hook central protège les appelants sans injecter AppEnumGuard dans leurs processus.
La version 1.2 peut être construite pour l'un ou l'autre bootstrap :
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb — ajustement rootless conventionnelAppEnumGuard_1.2_roothide_iphoneos-arm64e.deb — ajustement rootHideAppEnumGuardTester_1.2_sandboxed.ipa — application de vérification sandboxée avec icône.deb correspondant au bootstrap rootless ou rootHide et respring.Résultats attendus avec la cible sélectionnée installée :
| État | Cible | Manquante | Résultat du testeur |
|---|---|---|---|
| Ajustement absent | 9 | 7 | Rouge / ÉCHEC |
| Ajustement actif | 7 | 7 | Vert / RÉUSSITE |
Le testeur signale un résultat vert lorsque l'application sélectionnée n'est pas détectable et un résultat rouge lorsqu'elle est détectable. Sélectionnez uniquement une application que vous savez installée : 7 / 7 seul ne peut pas distinguer une atténuation fonctionnelle d'une cible qui n'existe pas.
Le test sur appareil a reproduit les deux états avec l'injection du testeur désactivée : la désinstallation de l'ajustement a produit le résultat rouge 9 / 7, tandis que l'installation de la v1.1 a produit le résultat vert 7 / 7.
Avec Theos standard, la construction par défaut est rootless conventionnelle :
cd Tweak
make clean package FINALPACKAGE=1
Pour rootHide, installez rootHide Theos et exécutez :
cd Tweak
THEOS=/path/to/theos-roothide \
make clean package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=roothide
Le testeur est compilé avec le SDK iPhoneOS de Xcode et ne possède aucun jailbreak ni entitlement élevé :
./scripts/build-tester-ipa.sh
L'IPA résultant est placé dans dist/. Il est signé ad-hoc afin qu'un installateur puisse le re-signer avec une identité de développement normale. Ne lui accordez pas platform-application ni com.apple.private.security.no-sandbox, car le test est spécifiquement destiné à s'exécuter depuis un sandbox d'application normal.
7 / 7 n'est significatif que lorsque l'application cible est connue pour être installée.MIT