
AppEnumGuard v1.2
CVE-2025-31207 mitigation и песочница-тестер для джейлбрейков rootless и rootHide на iOS 15–18.4.1.
AppEnumGuard
AppEnumGuard — это защитный твик для побочного канала перечисления установленных приложений, отслеживаемого как CVE-2025-31207. Он поддерживает стандартные rootless- и rootHide-среды джейлбрейка на iOS 15.0–18.4.1. Репозиторий также содержит обычное тестовое iOS-приложение в песочнице, которое демонстрирует уязвимый результат и проверяет устранение уязвимости.
CVE-2025-31207
CVE-2025-31207 — это уязвимость раскрытия информации в логике запуска приложений FrontBoard от Apple. Приложение в песочнице может передавать произвольные идентификаторы пакетов через приватную функцию запуска SpringBoardServices и отличать установленные приложения от отсутствующих по разным кодам возврата. Это может раскрывать приватную информацию об установленных у пользователя приложениях, включая банковские, мессенджеры, приложения безопасности, сайдлоадинга и связанные с джейлбрейком.
Apple описывает проблему как логическую ошибку, которая могла позволить приложению перечислять установленные приложения. Apple исправила её с помощью улучшенных проверок в iOS и iPadOS 18.5. Следовательно, системы старше iOS 18.5 остаются уязвимыми на уровне ОС.
Совместимость
| Компонент | Поддерживаемая цель |
|---|---|
| iOS | 15.0–18.4.1 |
| Джейлбрейк | Любая стандартная rootless- или rootHide-среда джейлбрейка |
| Архитектура bootstrap/пакета | rootless / iphoneos-arm64; rootHide / iphoneos-arm64e |
| Архитектура устройства | arm64 и arm64e (rootless); arm64e (rootHide) |
| Пакет | Установите пакет, соответствующий bootstrap устройства |
Сборка по умолчанию использует стандартный rootless Theos и включает срезы arm64 и arm64e. Вариант rootHide собирается с помощью rootHide Theos и содержит необходимые пути загрузчика .jbroot rootHide. Оба пакета объявляют
firmware (>= 15.0) и
firmware (<< 18.5): на iOS 18.5 и новее устранение уязвимости не требуется, поскольку Apple исправила CVE-2025-31207.
Твик v1.1 для стороны SpringBoard и тестер в песочнице были проверены вместе на iOS 17.3.1 сборка 21D61 с отключённой инъекцией для тестера. Тестер обнаружил утечку при удалённом твике и вернул зелёный результат после установки твика.
Как это работает
Опубликованный примитив вызывает приватную функцию SpringBoardServices
SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions. На уязвимой
системе она возвращает разные ошибки для установленного приложения и отсутствующего
приложения:
9: цель существует, но запуск запрещён политикой7: цель не существует
AppEnumGuard 1.1 внедряется только в SpringBoard и перехватывает общий
метод проверки доверия FBSystemService. Когда неавторизованный запрос на запуск
вернул бы ошибку политики безопасности 3 в FBSOpenApplicationErrorDomain, твик
меняет её на ошибку «приложение не найдено» 4. Внешний API SpringBoardServices
затем возвращает 7 как для установленных, так и для отсутствующих целей.
Количество аргументов приватного метода и кодировка типов Objective-C проверяются перед установкой хука. Если Apple изменит ABI, AppEnumGuard завершится безопасно (fail open), вместо того чтобы перехватывать неизвестный метод SpringBoard.
Изменения по сравнению с 1.0
Версия 1.0 перехватывала SpringBoardServices внутри каждого UIKit-приложения. Это работало, но требовало инъекции в каждое защищаемое приложение; приложение, которое отключало или обнаруживало инъекцию, могло обойти защиту. Версия 1.1 переносит принудительное применение в SpringBoard, поэтому один центральный хук защищает вызывающие стороны без внедрения AppEnumGuard в их процессы.
Загрузки релиза
Релиз 1.2 может быть собран для любого bootstrap:
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb— стандартный rootless-твикAppEnumGuard_1.2_roothide_iphoneos-arm64e.deb— rootHide-твикAppEnumGuardTester_1.2_sandboxed.ipa— приложение для проверки в песочнице со значком
Установка и проверка
- Установите
.deb, соответствующий rootless- или rootHide-bootstrap, и выполните respring. - Установите тестовый IPA с обычной подписью разработчика/для sideloading.
- Оставьте инъекцию AppEnumGuard отключённой для AppEnum Test; v1.1 защищает его от SpringBoard.
- Нажмите на значок приложения, которое, как вы знаете, установлено. Доступны пресеты для WhatsApp, YouTube, Spotify, Dopamine, TrollStore и Reddit.
Ожидаемые результаты при установленной выбранной цели:
| Состояние | Цель | Отсутствует | Результат тестера |
|---|---|---|---|
| Твик отсутствует | 9 | 7 | Красный / FAIL |
| Твик активен | 7 | 7 | Зелёный / PASS |
Тестер сообщает красный только для известного уязвимого результата 9 / 7 и зелёный
для любого другого числового результата; красный результат означает, что AppEnumGuard не установлен.
Зелёные результаты помечаются как App not detected. Уязвимый результат 9 / 7
помечается как App detected и AppEnumGuard missing.
Выбирайте только приложение, которое, как вы знаете, установлено: только 7 / 7
не позволяет отличить работающую защиту от цели, которой не существует.
Тестер также содержит краткое описание проекта и кликабельную ссылку на этот репозиторий GitHub.
Тест на устройстве воспроизвёл оба состояния при отключённой инъекции тестера:
удаление твика дало красный результат 9 / 7, а установка v1.1
дала зелёный результат 7 / 7.
Сборка твика
При стандартном Theos сборка по умолчанию — обычный rootless:
cd Tweak
make clean package FINALPACKAGE=1
Для rootHide установите rootHide Theos и выполните:
cd Tweak
THEOS=/path/to/theos-roothide \
make clean package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=roothide
Сборка тестового IPA
Тестовое приложение компилируется с помощью iPhoneOS SDK из Xcode и не требует джейлбрейка или повышенных прав (entitlements):
./scripts/build-tester-ipa.sh
Полученный IPA-файл помещается в dist/. Он подписан ad-hoc, поэтому установщик может переподписать его обычным идентификатором разработки. Не предоставляйте ему platform-application или com.apple.private.security.no-sandbox, поскольку тест специально предназначен для запуска из обычной песочницы приложения.
Область применения и ограничения
- Это митигация в пользовательском пространстве для опубликованного примитива SpringBoardServices, а не полный патч FrontBoard от Apple.
- Версия 1.1 не требует инъекции в защищённые приложения. Отключение инъекции глобально или для самого SpringBoard отключит митигацию.
- Серверная реализация подтверждена на iOS 17.3.1 сборка 21D61. На других поддерживаемых версиях твик устанавливает свой хук только тогда, когда приватный селектор имеет ожидаемый ABI, проверенный во время выполнения.
- Результат
7 / 7в тесте имеет смысл только тогда, когда известно, что целевое приложение установлено. - Тестер намеренно вызывает недокументированный приватный API и не подходит для отправки в App Store.
Ссылки
- Apple iOS 18.5 security content
- NVD: CVE-2025-31207
- Original public SpringBoardServices proof of concept
- rootHide developer documentation
Лицензия
MIT