iOS 27 kernelcache: карта диспетчеризации SEP, diff AMFI, рабочий процесс Ghidra
Кросскомпилятор для Linux + PoC для активации режима разработчика AMFI на iOS (arm64/arm64e)
Инструментарий исследовательского уровня. Сравните прошивки iOS 27.0.1 и 27.2, проведите обратную разработку таблицы диспетчеризации
IOUserClientв AMFI, скомпилируйте bare-metal PoC для IOKit с Linux — без необходимости в Xcode — и включите режим разработчика на iOS 27.0.1 через штатный протокол lockdown от Apple (подтверждена устойчивость на уровне ядра). Главная находка на данный момент: скрытое усиление защиты от переполнения ASTC/DDS в ImageIO, структурно достижимое из общего пути декодирования — цепочка MediaAnalysis прослежена доASTCReadPlugin::initialize(сессии 28–31).
IOExternalMethodDispatch, идентифицирован selector 11 = armSecurityBootMode.poc/poc.c открывает AppleMobileFileIntegrity/AppleCredentialManager, вызывает armSecurityBootMode и логирует результат. Без раздувания Foundation/UIKit — чистый C + IOKit.poc/build_ipa.sh создаёт подписанный .ipa на CachyOS/Arch с использованием clang + ld64.lld + ldid. Ноль зависимостей от Apple/Xcode.Цепочку переключения режима разработчика iOS можно провести полностью через штатный протокол lockdown от Apple (com.apple.amfi.lockdown). Без джейлбрейка, без IPA, без подделки entitlements — только pymobiledevice3 на Linux.
Проверено: после цепочки ниже mounter query-developer-mode-status → true, а DeveloperDiskImage был смонтирован в /System/Developer — и оба результата сохранились после независимой перезагрузки (те же проверки ранее возвращались к false, так что устойчивость — это реальное доказательство; см. FINDINGS_LOCK.md).
Удалите код-пароль (Настройки → Face ID и код-пароль → Отключить код-пароль).
Если код-пароль установлен, AMFI отвечает на action=1/action=2 сообщением Device has a passcode set.
# 1) enable → action=1 → REBOOT #1
flatpak-spawn --host python3 -m pymobiledevice3 amfi enable-developer-mode
# 2) after the device boots: post-restart accept → action=2 → REBOOT #2
# (the CLI has no separate accept command — call the service method directly,
# e.g. via poc/verify_now2.py)
# 3) reveal the Settings toggle → action=0
flatpak-spawn --host python3 -m pymobiledevice3 amfi reveal-developer-mode
flatpak-spawn --host python3 -m pymobiledevice3 mounter query-developer-mode-status # → true
flatpak-spawn --host python3 -m pymobiledevice3 mounter list # → IsMounted: true, /System/Developer
flatpak-spawn --host python3 -m pymobiledevice3 mounter auto-mount # → DeveloperDiskImage mounted successfully
| действие | Значение | Эффект |
|---|---|---|
0 | reveal | Показывает переключатель режима разработчика в настройках |
1 | enable | Устанавливает флаг, перезагружает устройство |
2 | accept | Подтверждение после перезагрузки, перезагружает снова |
⚠️
pymobiledevice3замыкает цепочку: если статус ужеtrue,enable-developer-modeпросто записывает в лог "Developer mode is already enabled" и ничего не отправляет. Две перезагрузки — часть протокола Apple, а не случайность.
sudo pacman -S clang lld zip # compiler + Mach-O linker
yay -S ldid # entitlement injector (AUR)
# iOS SDK:
mkdir -p poc/SDK
git clone https://github.com/theos/sdks poc/tmp && mv poc/tmp/iPhoneOS*.sdk poc/SDK/iPhoneOS.sdk
cd poc
IOS_SDK=/path/to/iPhoneOS.sdk ./build_ipa.sh
# Output: EnableAMFIDevMode.ipa
# Via ideviceinstaller (libimobiledevice):
ideviceinstaller --install EnableAMFIDevMode.ipa
# Via TrollStore (if jailbroken/CT-bypass device):
# → TrollStore app → "+" → pick EnableAMFIDevMode.ipa
# Via SideStore/AltStore:
# → Add to SideStore → sign with your Apple ID
# On device (SSH / NewTerm):
./EnableAMFIDevMode 1
cat /tmp/amfi_devmode_poc.log
# Then REBOOT to activate Developer Mode
run_dvt.sh)Существует второй путь, без IPA: кросс-компилировать автономный бинарник IOKit в Linux и
отправить его на устройство через туннель CoreDevice / RSD iOS 17+, затем запустить его с помощью
службы управления процессами DVT (вне App Sandbox — без installd, без бесплатно подписанного IPA).
./run_dvt.sh enable # build (clang + ld64.lld) → deploy → `dvt launch --stream`
run_dvt.sh автоматизирует всю цепочку:
usbmuxd, проверяет устройство через ideviceinfo (libimobiledevice);poc/poc.c в чистый arm64 Mach-O (без Apple toolchain):
clang -c → ld64.lld -platform_version ios … -syslibroot … -undefined dynamic_lookup;
версия SDK читается из бинарного SDKSettings.plist через plistlib;dvt launch --stream.Статус: кросс-компиляция под Linux работает (создаётся настоящий
arm64Mach-O). Шаг развёртывания на устройстве всё ещё WIP — см.HANDOFF.md«Сессия 12». Также обратите внимание, что путь PoC через IOKit (AppleMobileFileIntegrity, селектор 11) требует платформенно-ограниченного entitlementcom.apple.private.amfi.developer-mode-control, поэтому бинарник без подписи Apple будет отклонён userclient даже при запуске через DVT — поддерживаемый способ включить Developer Mode — это протокол lockdown, описанный выше.
Два чистых шага на каждый срез архитектуры (позволяет избежать того, что драйвер clang проглатывает -arch/-platform_version при делегировании в ld64.lld):
-arch arm64 -platform_version ios <min> <sdk>Автоматически определяет clang-20...15, ld64.lld/lld, llvm-lipo, ldid. Изящный откат: arm64e → arm64, если в toolchain нет поддержки ptrauth.