iOS 27 kernelcache RE : carte de répartition SEP, diff AMFI, workflow Ghidra
Compilateur croisé natif Linux + PoC pour l'activation du mode développeur AMFI sur iOS (arm64/arm64e)
Boîte à outils de niveau recherche. Différez les firmwares iOS 27.0.1 et 27.2, rétro-ingénieriez la table de dispatch
IOUserClientd'AMFI, compilez de manière croisée un PoC IOKit bare-metal depuis Linux — sans Xcode — et activez le mode développeur sur iOS 27.0.1 via le protocole lockdown standard d'Apple (persistance vérifiée au niveau du noyau).
IOExternalMethodDispatch, identification de selector 11 = armSecurityBootMode.poc/poc.c ouvre AppleMobileFileIntegrity/AppleCredentialManager, appelle armSecurityBootMode et journalise le résultat. Pas de surcharge Foundation/UIKit — pur C + IOKit.poc/build_ipa.sh produit un .ipa signé sur CachyOS/Arch en utilisant clang + ld64.lld + ldid. Zéro dépendance Apple/Xcode.La chaîne de bascule du mode développeur iOS peut être pilotée entièrement via le protocole
lockdown standard d'Apple (com.apple.amfi.lockdown). Pas de jailbreak, pas d'IPA, pas de
falsification d'entitlement — juste pymobiledevice3 sous Linux.
Vérifié : après la chaîne ci-dessous, mounter query-developer-mode-status → true et le
DeveloperDiskImage a été monté sur /System/Developer — et les deux ont survécu à un
redémarrage indépendant (les mêmes vérifications revenaient auparavant à false, donc la
persistance est la véritable preuve ; voir FINDINGS_LOCK.md).
Supprimez le code d'accès (Réglages → Face ID et code d'accès → Désactiver le code d'accès).
Avec un code d'accès défini, AMFI répond à action=1/action=2 par 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 | Signification | Effet |
|---|---|---|
0 | reveal | Affiche la bascule du mode développeur dans Réglages |
1 | enable | Définit le drapeau, redémarre l'appareil |
2 | accept | Confirmation après redémarrage, redémarre à nouveau |
⚠️
pymobiledevice3court-circuite : si le statut est déjàtrue,enable-developer-modese contente de journaliser "Developer mode is already enabled" et n'envoie rien. Les deux redémarrages font partie du protocole Apple, ils ne sont pas accessoires.
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)Une seconde voie, sans IPA, existe : compilez de manière croisée le binaire IOKit autonome sous Linux et
poussez-le vers l'appareil via le tunnel CoreDevice / RSD d'iOS 17+, puis exécutez-le avec le
service de contrôle de processus DVT (hors du bac à sable de l'App — pas d'installd, pas d'IPA signé gratuitement).
./run_dvt.sh enable # build (clang + ld64.lld) → deploy → `dvt launch --stream`
run_dvt.sh automatise toute la chaîne :
usbmuxd, contrôle l'appareil avec ideviceinfo (libimobiledevice) ;poc/poc.c en un Mach-O arm64 nu (sans chaîne d'outils Apple) :
clang -c → ld64.lld -platform_version ios … -syslibroot … -undefined dynamic_lookup ;
la version du SDK est lue depuis le SDKSettings.plist binaire via plistlib ;dvt launch --stream.Statut : la compilation croisée sous Linux fonctionne (un véritable Mach-O
arm64est produit). L'étape de déploiement sur l'appareil est encore en cours — voirHANDOFF.md«Сессия 12». Notez aussi que le chemin IOKit du PoC (AppleMobileFileIntegrityselector 11) nécessite l'entitlement restreint à la plateformecom.apple.private.amfi.developer-mode-control, donc un binaire non signé par Apple sera refusé par le userclient même lorsqu'il est lancé via DVT — la manière prise en charge d'activer le mode développeur est le protocole lockdown documenté ci-dessus.
Deux étapes propres par tranche d'architecture (évite que le pilote clang n'avale -arch/-platform_version lors de la délégation à ld64.lld) :
-arch arm64 -platform_version ios <min> <sdk> explicitesDétecte automatiquement clang-20...15, ld64.lld/lld, llvm-lipo, ldid. Repli gracieux : arm64e → arm64 si la chaîne d'outils ne prend pas en charge ptrauth.