
CVE-2025-31207 mitigación y probador en sandbox para jailbreaks rootless y rootHide en iOS 15–18.4.1.
AppEnumGuard es un ajuste defensivo para el canal lateral de enumeración de aplicaciones instaladas, rastreado como CVE-2025-31207. Es compatible con entornos de jailbreak convencionales sin root (rootless) y rootHide en iOS 15.0–18.4.1. El repositorio también contiene una aplicación de prueba iOS normal en sandbox que demuestra el resultado vulnerable y verifica la mitigación.
CVE-2025-31207 es una vulnerabilidad de divulgación de información en la lógica de lanzamiento de aplicaciones FrontBoard de Apple. Una aplicación en sandbox puede enviar identificadores de paquete arbitrarios a través de una función privada de lanzamiento de SpringBoardServices y distinguir aplicaciones instaladas de aplicaciones inexistentes utilizando diferentes códigos de retorno. Esto puede revelar información privada sobre las aplicaciones que un usuario tiene instaladas, incluyendo aplicaciones bancarias, de mensajería, de seguridad, de sideloading y relacionadas con jailbreak.
Apple describe el problema como un problema de lógica que podría permitir a una aplicación enumerar aplicaciones instaladas. Apple lo corrigió con comprobaciones mejoradas en iOS y iPadOS 18.5. En consecuencia, los sistemas anteriores a iOS 18.5 siguen afectados a nivel del sistema operativo.
| Componente | Objetivo compatible |
|---|
| iOS | 15.0–18.4.1 |
| Jailbreak | Cualquier entorno de jailbreak convencional rootless o rootHide |
| Arquitectura de bootstrap/paquete | rootless / iphoneos-arm64; rootHide / iphoneos-arm64e |
| Arquitectura del dispositivo | arm64 y arm64e (rootless); arm64e (rootHide) |
| Paquete | Instalar el paquete que coincida con el bootstrap del dispositivo |
La compilación predeterminada utiliza Theos rootless convencional e incluye slices arm64 y arm64e. La variante rootHide se compila con Theos rootHide y contiene las rutas de loader .jbroot requeridas por rootHide. Ambos paquetes declaran
firmware (>= 15.0) y
firmware (<< 18.5): la mitigación es innecesaria en iOS 18.5 y versiones posteriores, donde Apple corrigió CVE-2025-31207.
El ajuste v1.1 del lado de SpringBoard y el probador en sandbox se verificaron juntos en iOS 17.3.1 build 21D61 con inyección deshabilitada para el probador. El probador detectó la fuga con el ajuste eliminado y devolvió un pase verde después de instalar el ajuste.
La primitiva publicada llama a la función privada de SpringBoardServices SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions. En un sistema vulnerable devuelve diferentes errores para una aplicación instalada y una aplicación inexistente:
9: el objetivo existe, pero el lanzamiento está denegado por política7: el objetivo no existeAppEnumGuard 1.1 se inyecta solo en SpringBoard y engancha el método común de validación de confianza FBSystemService. Cuando una solicitud de lanzamiento no autorizada devolvería el error 3 de política de seguridad FBSOpenApplicationErrorDomain, el ajuste lo cambia al error 4 de aplicación no encontrada. La API externa de SpringBoardServices devuelve entonces 7 tanto para objetivos instalados como inexistentes.
El número de argumentos del método privado y la codificación de tipo Objective-C se validan antes de instalar el hook. Si Apple cambia la ABI, AppEnumGuard falla abierto en lugar de enganchar un método desconocido de SpringBoard.
La versión 1.0 enganchaba SpringBoardServices dentro de cada aplicación UIKit. Funcionaba, pero requería inyección en cada aplicación protegida; una aplicación que deshabilitara o detectara la inyección podía omitir la mitigación. La versión 1.1 mueve la aplicación de la medida a SpringBoard, por lo que un único hook central protege a los llamadores sin inyectar AppEnumGuard en sus procesos.
El lanzamiento 1.2 se puede compilar para cualquiera de los dos bootstraps:
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb — ajuste rootless convencionalAppEnumGuard_1.2_roothide_iphoneos-arm64e.deb — ajuste rootHideAppEnumGuardTester_1.2_sandboxed.ipa — aplicación de verificación en sandbox con icono.deb que coincida con el bootstrap rootless o rootHide y haga respring.Resultados esperados con el objetivo seleccionado instalado:
| Estado | Objetivo | Inexistente | Resultado del probador |
|---|---|---|---|
| Ajuste ausente | 9 | 7 | Rojo / FALLO |
| Ajuste activo | 7 | 7 | Verde / PASE |
El probador informa verde cuando la aplicación seleccionada no es detectable y rojo cuando es detectable. Seleccione solo una aplicación que sepa que está instalada: 7 / 7 por sí solo no puede distinguir una mitigación funcional de un objetivo que no existe.
La prueba en dispositivo reprodujo ambos estados con la inyección del probador deshabilitada: desinstalar el ajuste produjo el resultado rojo 9 / 7, mientras que instalar v1.1 produjo el resultado verde 7 / 7.
Con Theos estándar, la compilación predeterminada es rootless convencional:
cd Tweak
make clean package FINALPACKAGE=1
Para rootHide, instale rootHide Theos y ejecute:
cd Tweak
THEOS=/path/to/theos-roothide \
make clean package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=roothide
El probador se compila con el SDK de iPhoneOS de Xcode y no tiene jailbreak ni entitlements elevados:
./scripts/build-tester-ipa.sh
El IPA resultante se coloca en dist/. Está firmado ad-hoc para que un instalador pueda volver a firmarlo con una identidad de desarrollo normal. No le conceda
platform-application ni com.apple.private.security.no-sandbox, ya que la prueba está específicamente diseñada para ejecutarse desde un sandbox de aplicación normal.
7 / 7 solo es significativa cuando se sabe que la aplicación objetivo está instalada.MIT