
CVE-2025-31207 mitigação e testador em sandbox para jailbreaks rootless e rootHide no iOS 15–18.4.1.
AppEnumGuard é um ajuste defensivo para o canal lateral de enumeração de aplicativos instalados, rastreado como CVE-2025-31207. Ele suporta ambientes de jailbreak convencionais sem root (rootless) e rootHide no iOS 15.0–18.4.1. O repositório também contém um aplicativo de teste iOS normal em sandbox que demonstra o resultado vulnerável e verifica a mitigação.
CVE-2025-31207 é uma vulnerabilidade de divulgação de informações na lógica de inicialização de aplicativos do FrontBoard da Apple. Um aplicativo em sandbox pode enviar identificadores de pacote arbitrários por meio de uma função privada de inicialização do SpringBoardServices e distinguir aplicativos instalados de aplicativos ausentes usando diferentes códigos de retorno. Isso pode revelar informações privadas sobre os aplicativos que um usuário instalou, incluindo aplicativos bancários, de mensagens, de segurança, de sideloading e relacionados a jailbreak.
A Apple descreve o problema como um problema de lógica que poderia permitir que um aplicativo enumerasse aplicativos instalados. A Apple corrigiu isso com verificações aprimoradas no iOS e iPadOS 18.5. Consequentemente, sistemas anteriores ao iOS 18.5 permanecem afetados no nível do sistema operacional.
| Componente | Alvo suportado |
|---|
| iOS | 15.0–18.4.1 |
| Jailbreak | Qualquer ambiente de jailbreak convencional sem root (rootless) ou rootHide |
| Arquitetura de bootstrap/pacote | rootless / iphoneos-arm64; rootHide / iphoneos-arm64e |
| Arquitetura do dispositivo | arm64 e arm64e (rootless); arm64e (rootHide) |
| Pacote | Instale o pacote correspondente ao bootstrap do dispositivo |
A compilação padrão usa Theos convencional sem root e inclui fatias arm64 e arm64e. A variante rootHide é compilada com rootHide Theos e contém os caminhos de loader .jbroot necessários do rootHide. Ambos os pacotes declaram firmware (>= 15.0) e firmware (<< 18.5): a mitigação é desnecessária no iOS 18.5 e versões mais recentes, onde a Apple corrigiu o CVE-2025-31207.
O ajuste v1.1 do lado do SpringBoard e o testador em sandbox foram verificados juntos no iOS 17.3.1 build 21D61 com injeção desabilitada para o testador. O testador detectou o vazamento com o ajuste removido e retornou um resultado verde (pass) após o ajuste ser instalado.
A primitiva publicada chama a função privada do SpringBoardServices SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions. Em um sistema vulnerável, ela retorna erros diferentes para um aplicativo instalado e um aplicativo ausente:
9: o alvo existe, mas a inicialização é negada pela política7: o alvo não existeO AppEnumGuard 1.1 injeta apenas no SpringBoard e faz hook no método comum de validação de confiança do FBSystemService. Quando uma solicitação de inicialização não autorizada retornaria o erro 3 de política de segurança do FBSOpenApplicationErrorDomain, o ajuste o altera para o erro 4 de aplicativo não encontrado. A API externa do SpringBoardServices então retorna 7 tanto para alvos instalados quanto ausentes.
A contagem de argumentos e a codificação de tipo Objective-C do método privado são validadas antes que o hook seja instalado. Se a Apple alterar a ABI, o AppEnumGuard falha de forma aberta (fail open) em vez de fazer hook em um método desconhecido do SpringBoard.
A versão 1.0 fazia hook no SpringBoardServices dentro de todos os aplicativos UIKit. Funcionava, mas exigia injeção em todos os aplicativos protegidos; um aplicativo que desabilitasse ou detectasse a injeção poderia contornar a mitigação. A versão 1.1 move a aplicação para o SpringBoard, de modo que um único hook central protege os chamadores sem injetar o AppEnumGuard em seus processos.
A versão 1.2 pode ser compilada para qualquer um dos bootstraps:
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb — ajuste convencional sem root (rootless)AppEnumGuard_1.2_roothide_iphoneos-arm64e.deb — ajuste rootHideAppEnumGuardTester_1.2_sandboxed.ipa — aplicativo de verificação em sandbox com ícone.deb correspondente ao bootstrap rootless ou rootHide e faça respring.Resultados esperados com o alvo selecionado instalado:
| Estado | Alvo | Ausente | Resultado do testador |
|---|---|---|---|
| Ajuste ausente | 9 | 7 | Vermelho / FALHA |
| Ajuste ativo | 7 | 7 | Verde / PASSOU |
O testador reporta verde quando o aplicativo selecionado não é detectável e vermelho quando é detectável. Selecione apenas um aplicativo que você sabe que está instalado: 7 / 7 sozinho não pode distinguir uma mitigação funcional de um alvo que não existe.
O teste no dispositivo reproduziu ambos os estados com a injeção do testador desabilitada: desinstalar o ajuste produziu o resultado vermelho 9 / 7, enquanto instalar a v1.1 produziu o resultado verde 7 / 7.
Com o Theos padrão, a compilação padrão é convencional sem root (rootless):
cd Tweak
make clean package FINALPACKAGE=1
Para rootHide, instale o rootHide Theos e execute:
cd Tweak
THEOS=/path/to/theos-roothide \
make clean package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=roothide
O testador é compilado com o SDK iPhoneOS do Xcode e não possui jailbreak ou entitlements elevados:
./scripts/build-tester-ipa.sh
O IPA resultante é colocado em dist/. Ele é assinado ad-hoc, portanto um instalador pode re-assiná-lo com uma identidade de desenvolvimento normal. Não conceda a ele platform-application ou com.apple.private.security.no-sandbox, pois o teste é especificamente destinado a ser executado a partir de um sandbox de aplicativo normal.
7 / 7 é significativo apenas quando o aplicativo alvo é conhecido por estar instalado.MIT