
iOS 27 kernelcache RE: mapa de despacho de SEP, diff de AMFI, flujo de trabajo en Ghidra
Compilador cruzado nativo de Linux + PoC para la activación del Modo Desarrollador de AMFI en iOS (arm64/arm64e)
Kit de herramientas de nivel investigación. Compara el firmware de iOS 27.0.1 vs 27.2, realiza ingeniería inversa de la tabla de despacho de
IOUserClientde AMFI, compila de forma cruzada un PoC de IOKit bare-metal desde Linux — sin necesidad de Xcode — y habilita el Modo Desarrollador en iOS 27.0.1 a través del protocolo lockdown estándar de Apple (verificado como persistente a nivel de kernel).
IOExternalMethodDispatch, se identificó selector 11 = armSecurityBootMode.poc/poc.c abre AppleMobileFileIntegrity/AppleCredentialManager, llama a armSecurityBootMode y registra el resultado. Sin el lastre de Foundation/UIKit — C puro + IOKit.poc/build_ipa.sh produce un .ipa firmado en CachyOS/Arch usando clang + ld64.lld + ldid. Cero dependencias de Apple/Xcode.La cadena de activación del Modo Desarrollador de iOS puede controlarse enteramente a través del protocolo lockdown estándar de Apple (com.apple.amfi.lockdown). Sin jailbreak, sin IPA, sin falsificación de entitlements — solo pymobiledevice3 en Linux.
Verificado: tras la cadena que se muestra a continuación, mounter query-developer-mode-status → true y el DeveloperDiskImage se montó en /System/Developer — y ambos sobrevivieron a un reinicio independiente (las mismas comprobaciones antes volvían a false, por lo que la persistencia es la prueba real; véase FINDINGS_LOCK.md).
Elimina el código de acceso (Ajustes → Face ID y código → Desactivar código). Con un código de acceso establecido, AMFI responde a action=1/action=2 con 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
| action | Significado | Efecto |
|---|---|---|
0 | reveal | Muestra el interruptor del Modo Desarrollador en Ajustes |
1 | enable | Establece el flag, reinicia el dispositivo |
2 | accept | Confirmación tras el reinicio, reinicia de nuevo |
⚠️
pymobiledevice3cortocircuita: si el estado ya estrue,enable-developer-modesolo registra "Developer mode is already enabled" y no envía nada. Los dos reinicios son parte del protocolo de Apple, no algo incidental.
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)Existe una segunda vía, sin IPA: compilar de forma cruzada el binario IOKit autónomo en Linux y enviarlo al dispositivo a través del túnel CoreDevice / RSD de iOS 17+, para luego ejecutarlo con el servicio de control de procesos DVT (fuera del App Sandbox — sin installd, sin IPA de firma gratuita).
./run_dvt.sh enable # build (clang + ld64.lld) → deploy → `dvt launch --stream`
run_dvt.sh automatiza toda la cadena:
usbmuxd, comprueba el dispositivo con ideviceinfo (libimobiledevice);poc/poc.c a un Mach-O arm64 puro (sin toolchain de Apple):
clang -c → ld64.lld -platform_version ios … -syslibroot … -undefined dynamic_lookup;
la versión del SDK se lee del SDKSettings.plist binario mediante plistlib;dvt launch --stream.Estado: la compilación cruzada en Linux funciona (se produce un Mach-O
arm64real). El paso de despliegue en el dispositivo sigue en desarrollo — véaseHANDOFF.md«Сессия 12». Nótese también que la ruta IOKit del PoC (AppleMobileFileIntegrityselector 11) requiere el entitlement restringido a la plataformacom.apple.private.amfi.developer-mode-control, por lo que un binario no firmado por Apple será rechazado por el userclient incluso cuando se lance vía DVT — la forma soportada de habilitar el Modo Desarrollador es el protocolo lockdown documentado arriba.
Dos pasos limpios por cada slice de arquitectura (evita que el driver de clang se trague -arch/-platform_version al delegar en ld64.lld):
-arch arm64 -platform_version ios <min> <sdk> explícitosAutodetecta clang-20...15, ld64.lld/lld, llvm-lipo, ldid. Fallback elegante: arm64e → arm64 si la toolchain carece de soporte ptrauth.