Comment la DevTeam a conquis l’iPhone
(fabiensanglard.net)- En 2007, le premier iPhone ne pouvait pas être activé sans souscrire chez AT&T aux États-Unis, et l’iPhone Dev Team a publiquement cherché un moyen de l’utiliser chez d’autres opérateurs uniquement par logiciel
- Le travail s’est structuré en 6 jalons : déchiffrement du firmware, contournement de l’activation, obtention des droits en écriture, construction d’une toolchain ARM/Mach-O, exécution d’apps tierces et déverrouillage opérateur
- Les premières percées ont été l’analyse du ramdisk et du DMG chiffré contenus dans
.ipsw, ainsi que l’accès à l’écran d’accueil via une faille de rejeu dans la vérification d’activation delockdownd - Les droits en écriture ont été obtenus en chargeant un ramdisk et un kernelcache en Recovery Mode, puis en modifiant
fstabetServices.plistpour accéder au système de fichiers racine au lieu de rester limité à/root/Mediaviaafcd - Le déverrouillage final a été automatisé avec anySIM, qui vidait, patchait puis réinjectait le firmware du baseband avant d’exécuter
AT+CLCK="PN",0,"00000000", et Apple a réagi le 27 septembre 2007 avec le firmware v1.1.1
L’iPhone de 2007 et l’objectif de la DevTeam
- Apple a lancé l’iPhone le 29 juin 2007, au prix de 499 $ pour le modèle 4 Go et 599 $ pour le modèle 8 Go
- À la sortie de la boîte, l’iPhone était inactif et n’affichait que l’écran
Connect to iTunes, l’utilisateur devant souscrire un abonnement AT&T dans iTunes - Même après l’inscription, l’appareil restait verrouillé sur AT&T
- Aucun lancement initial de l’iPhone n’était prévu au Canada, et Apple n’a conclu un accord avec Rogers que le 11 juillet 2008, en même temps que l’iPhone 3G
- L’iPhone Dev Team s’est réunie avec pour objectif de faire fonctionner l’appareil chez n’importe quel opérateur uniquement par logiciel, en publiant fréquemment ses avancées sur le blog iphone.fiveforty.net
- Le 3 juillet 2007, 8 mises à jour ont été publiées entre minuit et 21 h
Les 6 jalons de la DevTeam
- Pour utiliser un appareil verrouillé comme un smartphone ordinaire, les étapes suivantes étaient nécessaires
- Accès en lecture pour comprendre le système : Break DMG Password
- Sortir de l’état inactif : Bypass Activation
- Accès en écriture pour modifier le système : Get Write Access
- Working Toolchain pour créer des exécutables personnalisés
- Unlock pour permettre au baseband de se connecter à n’importe quel opérateur
- Une app pour automatiser l’ensemble du processus : Enable Third-Party Applications
- D’après la Wayback Machine, au 6 juillet 2007, 2 jalons sur 6 étaient terminés, et le parcours s’est achevé le 12 septembre 2007
- Sur la page d’état archivée le 25 septembre 2007,
Decrypt Firmware,Bypass Activation,Get Write Access,Get Working Toolchain,Enable Third-party ApplicationsetUnlock Phoneétaient indiqués comme terminés
Analyse de .ipsw et lecture du système de fichiers
- Pour restaurer l’appareil, iTunes téléchargeait une archive iPhone Software avec l’extension
.ipsw, qui était en réalité un fichier zip iPhone1,1_1.0_1A543a_Restore.ipswcontenait une image de récupérationimg2, un dossierFirmwarelié au baseband, le noyau iOSkernelcacheet deux gros fichiers DMG- L’archive de restauration iOS complète pesait environ 105 MiB
- Le premier DMG,
694-5259-38.dmg, était le ramdisk utilisé lors de la restauration, et n’était pas chiffré, donc montable avecdd - Le ramdisk n’était pas le système de fichiers iOS complet, mais il permettait de voir dans
/private/etc/master.passwdles mots de passe demobile, l’utilisateur exécutant les apps, et deroot, qui exécutait les autres processus - Le second DMG,
694-5262-39.dmg, était le système de fichiers iOS utilisé en fonctionnement normal, et il était chiffré- La clé a été trouvée dans
/usr/sbin/asrdu ramdisk - Comme il s’agissait d’une clé et non d’une passphrase,
hdiutilne pouvait pas être utilisé, et la DevTeam a écrit son propre outil de déchiffrement,vfdecrypt.c - Après déchiffrement, ils ont obtenu un accès en lecture à l’ensemble du système de fichiers d’exécution
- La clé a été trouvée dans
Contournement de l’activation
- L’activation normale impliquait iTunes, le serveur Apple
albert.apple.cometlockdowndsur l’iPhone- iTunes collectait le
DeviceID, l’IMEIet l’ICCIDde l’appareil - Il regroupait ces trois valeurs dans un token envoyé au serveur Apple
- Le serveur Apple signait ce token avec une clé privée avant de le renvoyer
lockdownd, en attente sur USB, vérifiait le token avec la clé publique d’Apple- Si le token venait bien d’Apple et correspondait aux informations de l’appareil, l’état passait à Activated
- iTunes collectait le
PhoneActivationServerde dvdjon patchait iTunes pour accéder au serveur d’activation en HTTP au lieu de HTTPS, puis redirigeait les requêtes vers son propre serveur- Le point clé n’était pas de créer un nouveau token signé, mais de rejouer le même signed token capturé lors d’une activation réussie, quelle que soit l’entrée
- Selon la présentation de George Hotz,
lockdowndne vérifiait pas si leDeviceID, l’IMEIet l’ICCIDde la réponse correspondaient aux valeurs réelles - La DevTeam a créé des
toolsen CLI lisant un signed token codé en dur depuis un plist pour l’envoyer à l’iPhone, puis a amélioré cela aveciPhoneInterface, fonctionnant sans iTunes
Droits en écriture et jailbreak
- Un iPhone activé pouvait recevoir via iTunes des fichiers comme de la musique ou des photos, mais le processus d’upload
afcdétait enfermé dans une chroot jail limitée à/root/Media - Seule la partition utilisateur était montée en lecture/écriture (
rw), tandis que la partition système était en lecture seule (r) - L’objectif était de sortir de la chroot jail et d’obtenir l’écriture jusqu’à la partition système, d’où le terme jailbreaking
- Le démarrage de l’iPhone se divisait entre mode normal et Recovery Mode
- En mode normal, la chaîne était BootROM → LLB → iBoot → Kernel → Normal Mode, chaque étape vérifiant la signature de la suivante
- Le Recovery Mode s’arrêtait à l’étape iBoot, puis iTunes chargeait un ramdisk, un kernelcache, etc. en RAM pour entrer en mode restauration
- La DevTeam a étudié dans
iTunesMobile.dllla façon dont iTunes écrivait sur le système de fichiers pendant une restauration, identifiant des commandes commemount,umountetditto iPHUCétait un outil CLI communiquant avec un appareil en Recovery Mode via des méthodes non publiques deiTunesMobile.dll- L’utilisateur plaçait l’appareil en Recovery Mode
- Le ramdisk était transféré à l’appareil et chargé en RAM
- Le kernelcache était envoyé, puis le noyau démarré en pointant vers le ramdisk
- L’appareil passait alors en Restore Mode
- La procédure réelle de jailbreak reposait sur la modification de
fstabetServices.plist- Dans
fstab, la partition système était modifiée pour être montée en rw plutôt qu’en lecture seule - Dans
Services.plist, un second serviceafcdétait créé avec/comme racine au lieu de/root/Media - Après redémarrage, iTunes pouvait voir l’ensemble du système de fichiers via
afcd2, et les partitions système comme utilisateur devenaient lisibles et modifiables
- Dans
- Par la suite, l’activation et l’accès en écriture ont été automatisés dans l’application de bureau Mac OS X INdependence
Toolchain et apps tierces
- Peu d’informations publiques existent sur la toolchain et l’exécution d’apps tierces, mais au moins 12 personnes ont participé au travail
- Le 19 juillet 2007, une binutils toolchain ciblant ARM était prête, permettant à la DevTeam d’exécuter sur l’iPhone des programmes écrits par elle-même
- La première application autonome
Hello Worlda été compilée avec laARM/Mach-O Toolchainde Nightwatch puis exécutée sur l’iPhone - GeoHotz a expliqué que la combinaison Mach-O + ARM n’existait pas auparavant hors d’Apple et qu’il avait fallu l’écrire soi-même
- Un autre objectif de la toolchain était de reconstituer
MobileTerminal.h, exposant des fonctions non publiques deiTunesMobile.so, afin de communiquer avecafcsans lancer iTunes - Certaines présentations affirment que le noyau vérifiait la signature des exécutables avant
execl, mais la synthèse indique que ce n’était pas le cas sur le premier iPhone et que cela semble avoir été introduit avec la v1.1.1
Déverrouillage du baseband et anySIM
- L’iPhone se divisait entre la partie smartphone exécutant iOS et la partie baseband gérant téléphone et modem
- Les deux systèmes avaient chacun leur RAM, CPU, stockage, firmware et oscillateur
- Ils échangeaient des commandes AT via une ligne UART montée sur
/dev/tty.baseband
- La commande AT nécessaire au déverrouillage était connue très tôt
AT+CLCK="PN",0,"xxxxxxxx"xxxxxxxxétait la NCK (Network Control Key), supposée unique à chaque appareil- Le nombre d’essais était limité à 3 à 10, après quoi le firmware pouvait verrouiller matériellement l’appareil sur AT&T
- Le baseband possédait lui aussi un BootROM et une chaîne de confiance, avec vérification de signature
- MuscleNerd expliquait que le baseband n’avait pas de filet de sécurité de type DFU/Recovery Mode, donc une mauvaise manipulation de la NOR ou d’une image pouvait endommager l’appareil de façon permanente
- En juillet 2007, la DevTeam a rétroconçu le baseband contenu dans
.ipswet analysé aussi/usr/local/bin/bbupdaterdans le ramdisk pour comprendre les commandes permettant d’envoyer un nouveau baseband - Le premier outil CLI,
iUnlock, nécessitait plusieurs fichiers comme le firmware dumpénoretICE03.12.06_G.fls - Ensuite est arrivée l’application plus simple
anySIM, qu’il suffisait de copier sur le téléphone avant de l’exécuter d’une simple pression sur un bouton anySIMfonctionnait dans l’ordre suivant- Ouverture de
/dev/tty.basebandet configuration des paramètres du modem - Dump du baseband de 4 MiB, c’est-à-dire la NOR, dans
/tmp - Chargement du baseband en RAM
- Chargement du secpack
ICE03.12.06_G.flsdepuis le ramdisk - Patch des commandes du baseband en RAM pour permettre le déverrouillage avec n’importe quelle NCK
- Réupload du baseband patché
- Exécution de
AT+CLCK="PN",0,"00000000"puisAT+CLCK="PN",2
- Ouverture de
L’astuce -0x400
- Le firmware baseband patché n’aurait normalement pas dû passer la vérification de signature, et l’upload aurait donc dû échouer
- Le contournement utilisait un décalage minus 0x400
- GeoHotz a expliqué que les
0x400premiers octets n’étaient pas utilisés avant la vérification de signature, ce qui permettait de commencer l’écriture0x400octets plus tôt - D’après des explications ultérieures de lecteurs de Hacker News, le baseband recevait le nouveau firmware par blocs allant jusqu’à
0x800octets- Il ne stockait pas les 4 MiB complets en RAM avant de vérifier le checksum puis d’écrire en flash
- Les octets reçus étaient écrits immédiatement en flash, seuls les
0x400premiers étant tamponnés en RAM - Une fois l’upload terminé, le baseband vérifiait le checksum
- En cas d’échec, les
0x400premiers octets tamponnés n’étaient pas écrits en flash et étaient simplement jetés
- La méthode
-0x400consistait d’abord à écrire des données poubelles0x400octets avant l’emplacement du firmware d’origine, puis à envoyer les 4 MiB du firmware- Le checksum échouait, ce qui faisait jeter les
0x400octets poubelles - Mais le reste du nouveau firmware avait déjà été écrit en flash au bon endroit
- Le checksum échouait, ce qui faisait jeter les
Fin du parcours et début du jeu du chat et de la souris
- Les instructions complètes de déverrouillage logiciel ont été publiées le 12 septembre 2007
- Des cas de réussite par continent ont été publiés en même temps, y compris un cas canadien
- Apple a rapidement publié le firmware v1.1.1 de l’iPhone le 27 septembre 2007
- La barre de progression de la DevTeam a été réinitialisée à
Decrypt 1.1.1,Get Write Access 1.1.1,Activate 1.1.1,Unlock 1.1.1,Enable Third-party Applications 1.1.1 - C’est à ce moment qu’a commencé le jeu du chat et de la souris entre Apple et la communauté de hack de l’iPhone, et il s’est poursuivi par la suite
1 commentaires
Commentaires sur Hacker News
Sans en-tête, cela ne mène pas à une exécution de code, donc c’est sûr, et à la fin, si la signature complète est vérifiée avec succès, on écrit l’en-tête pour rendre l’image entière valide
L’astuce ici consiste à écrire d’abord 0x400 octets de déchets 0x400 octets avant l’emplacement d’écriture voulu. Cette partie est traitée comme un en-tête, donc seulement mise en tampon sans être réellement écrite, tandis que le reste des données transmises est effectivement écrit à l’endroit voulu. Ensuite, la vérification de signature échoue, et comme les 0x400 premiers octets non désirés n’ont pas été écrits, c’est gagné
J’aimerais bien qu’on m’explique un peu plus aussi le décalage de -0x400 appliqué avant l’écriture des données, pour que tout devienne parfaitement clair
avec
Seek(fd, 0xA0020000 - 0x400);, on se place 0x400 avant l’endroit où les données doivent être écrites, puis avecSendWrite(fd, foo, 0x400, false);, on remplit de zéros les 0x400 premiers octets qu’on voudrait écrireEnsuite, avec
SendWrite(fd, fw, fwsize, true);, on remplit le reste avec les vraies données et on appelleSendEndSecpack(fd);. L’iPhone copie alors les données après les 0x400 octets, c’est-à-dire l’ensemble des données qu’on voulait écrire, puis tente une vérification de signature, qui échoue. Si cette vérification avait réussi, les 0x400 premiers octets laissés à zéro auraient alors été copiés eux aussiSi je me souviens bien, c’est aussi lui qui s’occupait du PDF ou de l’exploit TIFF qui a débloqué la PSP. Je crois qu’il vivait quelque part en Amérique du Sud, probablement en travaillant dans une université, mais c’est à peu près tout ce que je sais
C’était une période vraiment amusante et j’ai énormément appris. En revanche, George Hotz a mis en danger la sécurité de plusieurs personnes qui l’aidaient à accéder à de la documentation en japonais, malgré des demandes répétées de ne pas le faire, et c’était extrêmement frustrant ; c’est d’ailleurs la raison pour laquelle la dev team a fini par quitter le projet
lockdowndavec la clé publique d’Apple afin de passer à l’état « Activated », cela ressemble à une sorte de précurseur de OAuth/root/Media, accessible depuis iTunes, vers/Ce lien persistait pendant la mise à niveau, et ensuite, après la mise à jour du firmware, on pouvait accéder à
rootfs. À l’époque, cela s’appelait iPhone OS, pas encore iOSC’est un peu pareil chez les constructeurs automobiles. Mieux vaut éviter les premiers millésimes d’un nouveau produit ou d’une nouvelle plateforme
En général, le « S » indiquait surtout une mise à niveau mineure par rapport au modèle de base