
AppEnumGuard v1.2
CVE-2025-31207 : atténuation et testeur sandboxé pour les jailbreaks rootless et rootHide sur iOS 15–18.4.1.
AppEnumGuard
AppEnumGuard est un tweak défensif pour le canal latéral d'énumération des applications installées, suivi sous la référence CVE-2025-31207. Il prend en charge les environnements de jailbreak conventionnels rootless et rootHide sur iOS 15.0–18.4.1. Le dépôt contient également une application de test iOS normale et sandboxée qui démontre le résultat vulnérable et vérifie l'atténuation.
CVE-2025-31207
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 privée de lancement SpringBoardServices et distinguer les applications installées des applications absentes à 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, y compris 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 pouvant 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 de l'OS.
Compatibilité
| Composant | Cible prise en charge |
|---|---|
| iOS | 15.0–18.4.1 |
| Jailbreak | Tout environnement de jailbreak conventionnel rootless ou rootHide |
| Architecture du 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 compilation par défaut utilise Theos rootless conventionnel et inclut les tranches arm64 et
arm64e. La variante rootHide est compilée 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 versions ultérieures,
où Apple a corrigé CVE-2025-31207.
Le tweak 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 le tweak retiré et a renvoyé un succès (vert) après l'installation du tweak.
Fonctionnement
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
absente :
9: la cible existe, mais le lancement est refusé par la politique7: la cible n'existe pas
AppEnumGuard 1.1 s'injecte uniquement dans SpringBoard et intercepte 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, le tweak
la remplace par l'erreur 4 (application introuvable). L'API externe SpringBoardServices renvoie
alors 7 pour les cibles installées comme absentes.
Le nombre d'arguments de la méthode privée et l'encodage de type Objective-C sont validés avant l'installation du hook. Si Apple modifie l'ABI, AppEnumGuard échoue en mode ouvert (fail open) au lieu d'intercepter une méthode SpringBoard inconnue.
Changement par rapport à la 1.0
La version 1.0 interceptait SpringBoardServices dans chaque application UIKit. Elle 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 vers SpringBoard, de sorte qu'un seul hook central protège les appelants sans injecter AppEnumGuard dans leurs processus.
Téléchargements des versions
La version 1.2 peut être compilée pour l'un ou l'autre bootstrap :
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb— tweak rootless conventionnelAppEnumGuard_1.2_roothide_iphoneos-arm64e.deb— tweak rootHideAppEnumGuardTester_1.2_sandboxed.ipa— application de vérification sandboxée avec icône
Installation et vérification
- Installez le
.debcorrespondant au bootstrap rootless ou rootHide et respringuez. - Installez l'IPA de test à l'aide d'une signature développeur/sideloading normale.
- Laissez l'injection d'AppEnumGuard désactivée pour AppEnum Test ; la v1.1 le protège de SpringBoard.
- Appuyez sur l'icône d'une application que vous savez installée. Des préréglages sont disponibles pour WhatsApp, YouTube, Spotify, Dopamine, TrollStore et Reddit.
Résultats attendus avec la cible sélectionnée installée :
| État | Cible | Manquant | Résultat du testeur |
|---|---|---|---|
| Tweak absent | 9 | 7 | Rouge / ÉCHEC |
| Tweak actif | 7 | 7 | Vert / RÉUSSITE |
Le testeur n'affiche du rouge que pour le résultat vulnérable connu 9 / 7 et du vert
pour tout autre résultat numérique ; un résultat rouge indique qu'AppEnumGuard n'est pas installé.
Les résultats verts sont étiquetés App not detected. Le résultat vulnérable 9 / 7
est étiqueté App detected et AppEnumGuard missing.
Ne sélectionnez qu'une application que vous savez installée : 7 / 7 seul
ne permet pas de distinguer une atténuation fonctionnelle d'une cible inexistante.
Le testeur inclut également une brève description du projet et un lien cliquable vers ce dépôt GitHub.
Le test sur appareil a reproduit les deux états avec l'injection du testeur désactivée :
la désinstallation du tweak a produit le résultat rouge 9 / 7, tandis que l'installation de la v1.1
a produit le résultat vert 7 / 7.
Compiler le tweak
Avec Theos standard, la compilation 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
Compiler l'IPA de test
Le testeur est compilé avec le SDK iPhoneOS de Xcode et ne nécessite ni jailbreak ni entitlements élevés :
./scripts/build-tester-ipa.sh
L'IPA résultant est placé dans dist/. Il est signé ad-hoc afin qu'un installeur 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 bac à sable d'application normal.
Périmètre et limitations
- Il s'agit d'une atténuation en espace utilisateur pour la primitive SpringBoardServices publiée, et non du correctif FrontBoard complet d'Apple.
- La version 1.1 ne nécessite pas d'injection dans les applications protégées. Désactiver l'injection globalement ou pour SpringBoard lui-même désactivera l'atténuation.
- L'implémentation côté serveur est confirmée sur iOS 17.3.1 build 21D61. Sur les autres versions prises en charge, le tweak n'installe son hook que lorsque le sélecteur privé possède l'ABI attendue, validée à l'exécution.
- Un test
7 / 7n'a de sens que lorsque l'application cible est connue comme installée. - Le testeur appelle intentionnellement une API privée non documentée et ne convient pas à une soumission sur l'App Store.
Références
- Apple iOS 18.5 security content
- NVD: CVE-2025-31207
- Original public SpringBoardServices proof of concept
- rootHide developer documentation
Licence
MIT