- Projet décrivant en détail le processus technique permettant de faire fonctionner iOS 6 sur un iPod touch de 3e génération, officiellement non pris en charge
- Exécution d’une version plus récente sur du matériel ancien en modifiant et en reconstruisant des composants essentiels d’iOS comme le DeviceTree, iBoot, le Kernelcache, le Restore Ramdisk et le Root Filesystem
- Utilisation d’un script Python pour comparer et appliquer automatiquement les différences de DeviceTree entre l’iPhone 3GS et l’iPod touch 3, avec un patch iBoot pour contourner la vérification de signature du code
- Pour la recréation du Kernelcache, usage de l’outil
kcgen de macOS afin d’intégrer le noyau et les kext armv7, de supprimer les symboles inutiles et d’appliquer la compression
- Forte portée technique par l’extension du potentiel d’un ancien matériel et le partage de techniques d’analyse de la structure interne d’iOS et de création de firmware personnalisé
Vue d’ensemble des composants d’iOS
- iOS se compose notamment de iBoot, du Kernelcache, du DeviceTree, du système de fichiers en espace utilisateur et du firmware destiné aux processeurs auxiliaires
- iBoot est le chargeur de démarrage, décliné en quatre formes : iBSS, iBEC, LLB et iBoot
- Le Kernelcache est un fichier regroupant le noyau et les extensions du noyau (kext) dans un seul binaire
- Le DeviceTree définit la configuration matérielle et les paramètres de fonctionnement logiciel, et il est modifié par iBoot pendant l’exécution
- Le système de fichiers est séparé entre le restore ramdisk pour l’installation et le root filesystem pour le stockage permanent
Test sur iPhone 3GS
- L’iPhone 3GS et l’iPod touch 3 utilisent des SoC S5L8920X / S5L8922X similaires
- Comme l’iPhone 3GS prend officiellement en charge iOS 6, un test de démarrage d’iOS 6.0 a été effectué avec l’iBoot et le DeviceTree d’iOS 5.1.1
- Le principal problème venait d’une incompatibilité du DeviceTree, iOS 6 exigeant de nouveaux nœuds et propriétés, dont
nvram-proxy-data
Modification du DeviceTree
- Un script Python a été écrit pour calculer et appliquer les différences entre les deux DeviceTree
- Le script est publié dans le dépôt SundanceInH2A
- La propriété
nvram-proxy-data doit contenir un dump de la NVRAM ; si elle est laissée vide, le noyau se bloque à une étape précoce
- Pour l’application à l’iPod touch 3, les éléments spécifiques à l’iPhone ont été supprimés avant l’application du diff
Patch iBoot
- Les opérations de base consistent à contourner la vérification de signature Image3, injecter des boot-args et appliquer un patch debug-enabled
nvram-proxy-data doit être rempli dynamiquement ; l’usage d’une valeur statique risquerait d’écraser la NVRAM réelle
- L’appel à
UpdateDeviceTree() est remplacé afin d’insérer nvram-proxy-data et random-seed
- L’argument
amfi=0xff est ajouté pour désactiver la signature du code
- Avec d’autres combinaisons iBoot+noyau, il faut vérifier les différences de DeviceTree et la structure
boot_args
Génération du Kernelcache
- Un noyau iOS 6 et des kext pour l’iPod touch 3 existaient dans une build interne, mais leur chargement simultané nécessitait la création d’un prelinked kernelcache
- L’outil
kcgen de macOS est utilisé pour générer un kernelcache armv7
- Options principales :
-arch armv7, -all-personalities, -strip-symbols, -uncompressed
- Après suppression des symboles inutiles, conversion en slice unique avec
lipo -thin armv7
- Le kernelcache généré est ensuite compressé puis empaqueté dans un conteneur Image3
- La liste des kext a été établie en comparant iOS 5.1.1 et 6.0 sur l’iPhone 3GS, avec nécessité de modifier l’Info.plist du kext Wi-Fi
Modification du Restore Ramdisk
- Patch de
asr et remplacement de options.n88.plist par options.n18.plist pour ajuster le partitionnement
- Réimplémentation du binaire
rc.boot afin d’installer l’exploit iBoot
- Remontage du ramdisk et définition de
umask
- Appel à
restored_external -server pour éviter un redémarrage après la restauration
- Une fois la restauration terminée, création de la troisième partition, écriture de l’exploit, définition de
boot-partition sur 2 puis redémarrage
Modification du Root Filesystem
- Ajout de
/System/Library/CoreServices/SpringBoard.app/N18AP.plist et prise en compte des fonctionnalités d’iOS 6
- Fusion de la configuration de l’écran d’accueil d’iOS 5.1.1 avec celle de l’iPod touch 4
- Ajout des firmwares Multitouch, Wi-Fi et Bluetooth
- Pour le Bluetooth, le hardcoding de
/usr/sbin/BlueTool est surchargé via /etc/bluetool
- Suppression de la clé
LimitLoadToHardware du daemon FairPlay afin de l’activer aussi sur l’iPod touch 3
- À partir d’iOS 6.1, des patchs supplémentaires sont nécessaires en raison du cache de signature des LaunchDaemon
- Modification de la map des Product ID : remplacement du
0x2714 de l’iPhone 3GS par le 0x2715 de l’iPod touch 3
- Modification de
getDeviceVariant() dans MobileGestalt pour qu’il renvoie toujours "A"
- Lors de la modification du cache partagé DYLD, le recalcul du hash SHA-1 permet de rétablir la signature du code
Exploit iBoot
- Réécriture d’un exploit utilisant un bug du pilote HFS+ d’iOS 5
- L’exploit a été amélioré pour devenir plus déterministe que les versions précédentes
Conclusion et suite
- L’ensemble du travail s’est révélé moins difficile que prévu, et la publication des outils a suscité de nombreuses questions liées au jailbreak
- Un jailbreak simple semble possible via des patchs noyau et l’installation de Cydia
- Prochain objectif : tester l’exécution d’iOS 6 sur iPad 1
- Le projet fournit une ressource concrète pour l’analyse de la structure interne d’iOS et la réutilisation d’appareils anciens
1 commentaires
Commentaires sur Hacker News
Je pense qu’il faut absolument ce genre de chose aussi pour les iDevices
C’est absurde qu’un iPad Air de 1re génération, ancien mais encore utilisable, finisse en déchet électronique
Le problème, c’est qu’Apple ne le prend plus en charge et applique une politique qui bloque même l’installation d’autres systèmes d’exploitation
Sur Mac, il y a OpenCore Legacy Patcher, qui permet de faire tourner les dernières versions de macOS sur d’anciens Mac
Ce n’est pas tant « ancien mais encore utilisable » que simplement « un vieil appareil »
Le rythme du progrès technologique est si rapide qu’un appareil comme l’iPad Air de 2013 peine désormais même à naviguer sur le web
J’ai essayé d’utiliser un Mac mini 2012 avec OpenCore Legacy Patcher, mais à cause de la baisse de performances et des kernel panics, je suis finalement passé à Linux
Au fond, il faut voir ce type d’appareil comme une sorte de bien de consommation temporaire
Le droit à la réparation est important, mais la plupart des utilisateurs ne continuent pas à se servir d’un vieil appareil
Pour prendre une analogie automobile, même si une Corolla de 1999 devenait entièrement open source, la plupart des gens achèteraient quand même une voiture plus récente
L’équipe de Dortania a aussi dit que la prise en charge d’Apple Silicon était en pratique impossible, et les Mac Intel équipés de la puce T2 risquent eux aussi de perdre bientôt le support
Au final, le jour viendra sans doute où les anciens Mac connaîtront eux aussi les mêmes débats sur la fin de support que les iPhone et iPad
Il gère bien les EPUB et les PDF, mais WebKit est tellement ancien que naviguer sur le web est presque impossible
Le kernel semble dater de 2021, mais WebKit paraît figé depuis 2018
C’est un peu hors sujet, mais j’ai plusieurs iPhone 5/5s/SE
Je les utilise hors ligne pour l’enregistrement de la fréquence cardiaque, le contrôle d’action cams et l’enregistrement vocal
Ils restent compacts, rapides, et tout à fait utilisables en 2025
Je ne sais pas si c’est possible sur iPhone, mais c’était une expérience intéressante
Au début de mon passage chez Apple, j’ai travaillé sur iOS 6 et Snow Leopard
Cet article m’a fait plaisir, car il m’a rappelé l’ancienne structure fermée de l’OS et son vocabulaire
J’adore toujours mon iPad Air de 2014
iOS 12.5 est la dernière version, mais la plupart des apps fonctionnent encore bien
Je l’utilise 6 à 7 heures par jour, et il me suffirait d’un navigateur un peu plus récent
Apple interdit sur iOS les navigateurs qui utilisent leur propre moteur de rendu
Donc quand les mises à jour d’iOS s’arrêtent, non seulement Safari mais aussi tous les navigateurs et les apps basées sur WebView deviennent obsolètes en même temps
C’est intéressant, mais si cette méthode permettait de rétrograder d’iOS 26 vers iOS 18, ce serait vraiment de la magie
Sur MacBook comme sur iPhone, la qualité n’est plus ce qu’elle était
Moi aussi, j’aimerais remettre un ancien téléphone sous iOS 16 pour le jailbreaker
J’aimerais bien qu’il existe aussi sur les appareils Apple un OS alternatif comme Lineage OS
Tant qu’Apple ne l’assouplit pas, l’installation libre d’autres OS restera impossible
Je me demande si cette méthode permettrait de démarrer iPhone OS 1.0 sur un iPhone 2G
Sur mon appareil, seul le 1.1.4 démarre ; le 1.1.1 bloque sur un échec d’initialisation du FTL
J’aimerais bien refaire l’ancien hack d’activation via appel d’urgence, mais j’ai perdu le 2G que j’utilisais à l’époque
Article intéressant
En revanche, dans l’exemple de code,
--bundle-idse met au début de chaque ligne ; prepend est donc le bon termeJ’ai un vieil iPad Air 1, et je me demande s’il est possible de le mettre à niveau depuis iOS 12
J’aimerais qu’on légifère pour obliger les entreprises à ouvrir de force les appareils qu’elles ne prennent plus en charge