
Смягчение CVE-2025-31207 и изолированный тестер для iOS 17 Relaxin/rootHide
AppEnumGuard — это защитный rootHide-твик для побочного канала перечисления установленных приложений, отслеживаемого как CVE-2025-31207. Он предназначен для джейлбрейка Relaxin на iOS 17.0–17.3.1 и использует архитектуру rootHide от Relaxin. Репозиторий также содержит обычное песочное тестовое iOS-приложение, которое демонстрирует уязвимый результат и проверяет меру смягчения.
CVE-2025-31207 — это уязвимость раскрытия информации в логике запуска приложений FrontBoard от Apple. Песочное приложение может передавать произвольные bundle-идентификаторы через приватную функцию запуска SpringBoardServices и различать установленные и отсутствующие приложения по разным кодам возврата. Это может раскрыть приватную информацию о приложениях, установленных пользователем, включая банковские приложения, мессенджеры, приложения для обеспечения безопасности, боковой загрузки и связанные с джейлбрейком.
Apple описывает проблему как логическую ошибку, которая могла позволить приложению перечислять установленные приложения. Apple исправила её с помощью улучшенных проверок в iOS и iPadOS 18.5. Следовательно, iOS 17.0–17.3.1 по-прежнему уязвимы на уровне ОС.
| Компонент | Поддерживаемая цель |
|---|---|
| iOS | 17.0–17.3.1 |
| Джейлбрейк | Relaxin |
| Архитектура bootstrap/пакетов | rootHide / iphoneos-arm64e |
| Архитектура устройства | arm64e; бинарник твика содержит только срез arm64e |
| Пакет | Устанавливайте rootHide .deb, а не обычную rootless-сборку |
Relaxin использует архитектуру bootstrap/пакетов rootHide, поэтому AppEnumGuard собран с rootHide Theos и содержит пути загрузчика rootHide .jbroot. Пакет объявляет firmware (>= 17.0) и firmware (<< 17.4), что соответствует поддерживаемому диапазону Relaxin 17.0–17.3.1.
Твик и тестер были совместно проверены на реальном устройстве с Relaxin/rootHide: тестер обнаруживал утечку при удалённом твике и показывал зелёный результат PASS после установки твика.
Опубликованный примитив вызывает приватную функцию SpringBoardServices SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions. На уязвимой системе она возвращает разные ошибки для установленного и отсутствующего приложения:
9: цель существует, но запуск запрещён политикой7: цель не существуетТвик внедряется в процессы приложений UIKit. Для обычного приложения, установленного в контейнер, он возвращает 7, не отправляя приватный запрос запуска. Процессы Apple и другие системные процессы вне контейнера приложения сохраняют исходное поведение.
Каждый релиз на GitHub содержит оба устанавливаемых артефакта:
AppEnumGuard_1.0.0_roothide_iphoneos-arm64e.deb — rootHide-твикAppEnumGuardTester_1.0.0_sandboxed.ipa — песочное проверочное приложение.deb и сделайте респринг.Ожидаемые результаты при установленном WhatsApp:
| Состояние | Цель | Отсутствует | Результат тестера |
|---|---|---|---|
| Твик не установлен | 9 | 7 | Красный / FAIL |
| Твик активен | 7 | 7 | Зелёный / PASS |
Исходный тест на устройстве воспроизвёл оба состояния: удаление твика давало красный результат 9 / 7, а установка — зелёный 7 / 7.
Установите 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, поэтому установщик может переподписать его обычным development-идентификатором. Не выдавайте ему энтайтлменты platform-application или com.apple.private.security.no-sandbox, поскольку тест специально предназначен для запуска из обычной песочницы приложения.
7 / 7 имеет смысл только тогда, когда целевое приложение заведомо установлено.MIT