
CVE-2025-31207 mitigation и песочница-тестер для джейлбрейков rootless и rootHide на iOS 15–18.4.1.
AppEnumGuard — это защитная настройка (tweak) для побочного канала перечисления установленных приложений, отслеживаемого как CVE-2025-31207. Она поддерживает обычные среды джейлбрейка rootless и rootHide на iOS 15.0–18.4.1. Репозиторий также содержит обычное песочное тестовое приложение iOS, которое демонстрирует уязвимый результат и проверяет действие смягчения.
CVE-2025-31207 — это уязвимость раскрытия информации в логике запуска приложений FrontBoard от Apple. Песочное приложение может отправлять произвольные идентификаторы пакетов через приватную функцию запуска SpringBoardServices и различать установленные приложения и отсутствующие по разным кодам возврата. Это может раскрыть приватную информацию о приложениях, установленных пользователем, включая банковские, мессенджеры, приложения безопасности, приложения для сайдлоадинга и связанные с джейлбрейком.
Apple описывает проблему как логическую ошибку, которая может позволить приложению перечислять установленные приложения. Apple исправила её улучшенными проверками в iOS и iPadOS 18.5. Следовательно, системы старше iOS 18.5 остаются затронутыми на уровне ОС.
| Компонент | Поддерживаемая цель |
|---|---|
| iOS | 15.0–18.4.1 |
| Джейлбрейк | Любая обычная среда rootless или rootHide |
| Архитектура бутстрапа/пакета | rootless / iphoneos-arm64; rootHide / iphoneos-arm64e |
| Архитектура устройства | arm64 и arm64e (rootless); arm64e (rootHide) |
| Пакет | Установите пакет, соответствующий бутстрапу устройства |
Сборка по умолчанию использует обычный 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 безопасно откажется от перехвата неизвестного метода SpringBoard, а не вызовет сбой.
Версия 1.0 перехватывала SpringBoardServices внутри каждого приложения UIKit. Это работало, но требовало инъекции в каждое защищаемое приложение; приложение, отключающее или обнаруживающее инъекцию, могло обойти смягчение. Версия 1.1 переносит контроль в SpringBoard, поэтому один центральный хук защищает вызывающих без внедрения AppEnumGuard в их процессы.
Релиз 1.2 можно собрать для любого бутстрапа:
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb — обычный твик rootlessAppEnumGuard_1.2_roothide_iphoneos-arm64e.deb — твик rootHideAppEnumGuardTester_1.2_sandboxed.ipa — песочное проверочное приложение с иконкой.deb, соответствующий бутстрапу rootless или rootHide, и выполните респринг.Ожидаемые результаты при установленной выбранной цели:
| Состояние | Цель | Отсутствует | Результат тестера |
|---|---|---|---|
| Твик отсутствует | 9 | 7 | Красный / FAIL |
| Твик активен | 7 | 7 | Зелёный / PASS |
Тестер сообщает зелёный результат, когда выбранное приложение не обнаруживается, и красный, когда оно обнаруживается. Выбирайте только приложение, которое, как вы знаете, установлено: одно 7 / 7 не может отличить работающее смягчение от несуществующей цели.
Тест на устройстве воспроизвёл оба состояния с отключённой инъекцией тестера: удаление твика дало красный результат 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
Тестер компилируется с iPhoneOS SDK от Xcode и не имеет джейлбрейка или повышенных привилегий:
./scripts/build-tester-ipa.sh
Полученный IPA помещается в dist/. Он подписан ad-hoc, поэтому установщик может переподписать его обычной идентичностью разработчика. Не предоставляйте ему platform-application или com.apple.private.security.no-sandbox, поскольку тест специально предназначен для запуска из обычной песочницы приложения.
7 / 7 значим только тогда, когда целевое приложение заведомо установлено.MIT