
AppEnumGuard v1.2
CVE-2025-31207 mitigação e testador em sandbox para jailbreaks rootless e rootHide no iOS 15–18.4.1.
AppEnumGuard
AppEnumGuard é um tweak defensivo para o canal lateral de enumeração de aplicações instaladas registrado como CVE-2025-31207. Ele suporta ambientes convencionais de jailbreak rootless e rootHide no iOS 15.0–18.4.1. O repositório também contém uma aplicação de teste iOS normal em sandbox que demonstra o resultado vulnerável e verifica a mitigação.
CVE-2025-31207
CVE-2025-31207 é uma vulnerabilidade de divulgação de informações na lógica de lançamento de aplicações FrontBoard da Apple. Uma aplicação em sandbox pode enviar identificadores de bundle arbitrários através de uma função privada de lançamento do SpringBoardServices e distinguir aplicações instaladas de aplicações ausentes usando diferentes códigos de retorno. Isso pode revelar informações privadas sobre as aplicações que um usuário tem instaladas, incluindo aplicações bancárias, de mensagens, de segurança, de sideloading e relacionadas a jailbreak.
A Apple descreve o problema como um problema de lógica que poderia permitir que uma aplicação enumerasse as aplicações instaladas. A Apple corrigiu-o com verificações aprimoradas no iOS e iPadOS 18.5. Consequentemente, sistemas anteriores ao iOS 18.5 permanecem afetados no nível do SO.
Compatibilidade
| Componente | Alvo suportado |
|---|---|
| iOS | 15.0–18.4.1 |
| Jailbreak | Qualquer ambiente convencional de jailbreak 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 rootless convencional e inclui slices 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 mais recente, onde a Apple corrigiu o CVE-2025-31207.
O tweak v1.1 do lado do SpringBoard e o testador em sandbox foram verificados juntos no iOS 17.3.1 build 21D61 com a injeção desativada para o testador. O testador detectou o vazamento com o tweak removido e retornou um resultado positivo (verde) após a instalação do tweak.
Como funciona
A primitiva publicada chama a função privada do SpringBoardServices
SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions. Em um sistema vulnerável, ela retorna erros diferentes para uma aplicação instalada e uma aplicação ausente:
9: o alvo existe, mas o lançamento é negado por política7: o alvo não existe
O AppEnumGuard 1.1 injeta apenas no SpringBoard e faz hook do método comum de validação de confiança FBSystemService. Quando uma solicitação de lançamento não autorizada retornaria o erro de política de segurança 3 do FBSOpenApplicationErrorDomain, o tweak o altera para o erro 4 de aplicação não encontrada. A API externa do SpringBoardServices então retorna 7 tanto para alvos instalados quanto para alvos ausentes.
A contagem de argumentos do método privado e a codificação de tipos Objective-C são validadas antes da instalação do hook. Se a Apple alterar a ABI, o AppEnumGuard falha aberto em vez de fazer hook de um método desconhecido do SpringBoard.
Mudança em relação à 1.0
A versão 1.0 fazia hook do SpringBoardServices dentro de cada aplicação UIKit. Funcionava, mas exigia injeção em cada aplicação a ser protegida; uma aplicação que desativasse ou detectasse a injeção poderia contornar a mitigação. A versão 1.1 move a aplicação da política para o SpringBoard, de modo que um único hook central protege os chamadores sem injetar o AppEnumGuard em seus processos.
Downloads de lançamento
A versão 1.2 pode ser compilada para qualquer um dos bootstraps:
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb— tweak rootless convencionalAppEnumGuard_1.2_roothide_iphoneos-arm64e.deb— tweak rootHideAppEnumGuardTester_1.2_sandboxed.ipa— aplicação de verificação em sandbox com ícone
Instalar e verificar
- Instale o
.debcorrespondente ao bootstrap rootless ou rootHide e faça respring. - Instale o IPA do testador usando uma assinatura normal de desenvolvedor/sideloading.
- Deixe a injeção do AppEnumGuard desativada para o AppEnum Test; a v1.1 o protege do SpringBoard.
- Toque no ícone de um app que você sabe estar instalado. Há presets disponíveis para WhatsApp, YouTube, Spotify, Dopamine, TrollStore e Reddit.
Resultados esperados com o alvo selecionado instalado:
| Estado | Alvo | Ausente | Resultado do testador |
|---|---|---|---|
| Tweak ausente | 9 | 7 | Vermelho / FAIL |
| Tweak ativo | 7 | 7 | Verde / PASS |
O testador reporta vermelho apenas para o resultado vulnerável conhecido 9 / 7 e verde
para qualquer outro resultado numérico; um resultado vermelho indica que o AppEnumGuard não está instalado.
Resultados verdes são rotulados como App not detected. O resultado vulnerável 9 / 7
é rotulado como App detected e AppEnumGuard missing.
Selecione apenas um app que você sabe estar instalado: 7 / 7 sozinho
não consegue distinguir uma mitigação funcional de um alvo que não existe.
O testador também inclui uma breve descrição do projeto e um link clicável para este repositório do GitHub.
O teste no dispositivo reproduziu ambos os estados com a injeção do testador desativada:
desinstalar o tweak produziu o resultado vermelho 9 / 7, enquanto instalar a v1.1
produziu o resultado verde 7 / 7.
Compilar o tweak
Com o Theos padrão, a compilação padrão é rootless convencional:
cd Tweak
make clean package FINALPACKAGE=1
Para o rootHide, instale o rootHide Theos e execute:
cd Tweak
THEOS=/path/to/theos-roothide \
make clean package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=roothide
Compilar o IPA de teste
O testador é compilado com o SDK iPhoneOS do Xcode e não possui jailbreak nem entitlements elevados:
./scripts/build-tester-ipa.sh
O IPA resultante é colocado em dist/. Ele é assinado ad-hoc para que um instalador possa reassiná-lo com uma identidade de desenvolvimento normal. Não lhe conceda platform-application nem com.apple.private.security.no-sandbox, pois o teste destina-se especificamente a ser executado a partir de um sandbox de aplicação normal.
Escopo e limitações
- Esta é uma mitigação em espaço de usuário para a primitiva publicada do SpringBoardServices, não o patch completo do FrontBoard da Apple.
- A versão 1.1 não requer injeção em aplicações protegidas. Desativar a injeção globalmente ou para o próprio SpringBoard desativará a mitigação.
- A implementação do lado do servidor está confirmada no iOS 17.3.1 build 21D61. Em outras versões suportadas, o tweak instala seu hook apenas quando o seletor privado possui a ABI esperada, validada em tempo de execução.
- Um teste
7 / 7só é significativo quando se sabe que a aplicação alvo está instalada. - O testador chama intencionalmente uma API privada não documentada e não é adequado para submissão à App Store.
Referências
- Conteúdo de segurança do Apple iOS 18.5
- NVD: CVE-2025-31207
- Prova de conceito pública original do SpringBoardServices
- Documentação para desenvolvedores do rootHide
Licença
MIT