Apple a présenté l’Apple Watch S4, l’iPhone XS, XS Max et XR le mercredi 12 septembre 2018. Ce post n’a pas pour but de faire le récapitulatif des nouveautés de ces appareils, mais de plonger plus profondément dans la partie logicielle et sécurité.

Comme d’habitude, après la présentation des nouveaux appareils, Apple publie la version Golden Master d’iOS 12 (16A366). Cette version est la même qui sera publiée le 17 septembre au public.

Apple a ensuite mis en ligne les versions d’iOS pour les nouveaux appareils.

iOS 12

Les composants de la bootchain et le SEP étant toujours chiffrés on ne s’attardera pas dessus pour l’instant.

Depuis iOS 10 beta 2, le kernelcache des appareils 64 bits est livré sans chiffrement, pour des raisons de performance. Il nous suffit donc de les décompresser à l’aide d’img4lib.
La nouvelle version du noyau est 4903.202.2. La dernière version publique soit iOS 11.4.1, étant 4570.70.24, il y a pu y avoir quelques mises à jour en interne.

CoreTrust

CoreTrust (com.apple.kext.CoreTrust) est une nouvelle extention du noyau (kext) implémentée dans iOS 12.0. Le but de cette nouvelle extension est de contrecarrer le fake signing des exécutables sur iOS en vérifiant les certificats utilisés (Apple iPhone Certification Authority et Apple Code Signing Certification Authority).
Il n’est pour l’instant plus possible de contourner les vérification de signature d’iOS. Il faudra signer chaque exécutable avec votre propre compte Apple Developer.

CoreTrust est une intermédiaire ajoutée entre la kext AMFI et le démon amfid pour vérifier l’intégrité des certificats. De plus les certificats pour les signatures sont dans __TEXT .__ const, une région de la mémoire protégée par KPP/KTRR.

Un problème pour les jailbreaks, mais pas pour les malwares/APT, puisque ceux-ci utilisent des certificats officiels pour ensuite sortir de la sandbox ou élever leurs privilèges.

Kernelcache

Dans un post, Brandon Azad a notifié d’un changement de format du kernelcache de certains appareils. En effet, en voulant décompresser un kernelcache d’iPhone 6 Plus on voit bien que joker a du mal a trouver les symboles du fichier.

Même problème avec jtool et nm qui ne listent pas les symboles du kernelcache. Ceux-ci ont en fait été retirés des kernelcaches de type RELEASE.

Le plus étonnant c’est que certains appareils comme l’iPhone X ne sont pas concernés, en effet sur la GM, on compte 4772 symboles dans le kernelcache.

$ jtool -S kernelcache.release.iphone10b.macho | wc -l
4772

Cela rendra le développement des patchfinders plus difficle. En effet, ceux-ci sont utilisés pour anayser un noyau XNU pour iOS en déterminant les offsets de certaines fonctions pour ensuite appliquer les patches neccessaires.

A noter Jonathan Levin a pu déterminer près de 85 000 symboles sur les kernelcaches d’iOS 12.0 beta 1. Sur le kernelcache de l’iPhone 6 Plus on peut en lister 91453.

J Levin a publié une version alpha de jtool2 pour le support des nouveaux kernelcaches. Son outil peut à nouveau lister tous les symboles.

$ jtool2 --analyze kernelcache.release.iphone11.dec
Analyzing kernelcache..
This is Darwin Kernel Version 18.0.0: Tue Aug 14 22:07:18 PDT 2018;
root:xnu-4903.202.2~1/RELEASE_ARM64_T8020
-- Disassembling __TEXT_EXEC.__text..
- Found _start_first_cpu
[...]
-- Analyzing __DATA_CONST..
- Found Mach Trap Table (@0xfffffff0077d89f0)
- Found sysent (0xfffffff0077e01f0)
opened companion file ./kernelcache.release.iphone11.dec...
Dumping symbol cache to file
Symbolicated 582 symbols to ./kernelcache.release.iphone11.dec...

De plus, joker n’arrivait plus à dumper les kexts du même kernelcache. Il semble qu’Apple a changé de façon de faire, puisque les kexts ne sont plus séparées du noyau.

C’est maintenant juste un gros fichier binaire. On pourrait même dire que c’est un noyau monolithique.

Bien que le code source du noyau sera publié après la publication d’iOS 12.0 au public, on dirait que Apple tient à ce que son noyau reste une blackbox.

Jtool2 devrait pallier le problèmes de kexts dans une prochaine mise à jour .

Apple Watch S4

Lors de sa conférence Tim Cook a d’abord présenté la nouvelle gamme d’Apple Watch : Series 4.
La mise à jour ayant été indexée sur le site d’Apple on peut donc la télécharger sur ipsw.me. Le fichier compressé contient tous les composant du firmware de la montre.

Hardware

Le processeur S4 (T8006) embarqué sur la logic board N141s est un processeur 64 bits. C’est la première montre 64 bits d’Apple.

Le nouveau contrôleur BT/Wifi tourne sur un processeur ARM Cortex-R5 32 bits, nom de code : Marconi.

Le firmware embarqué (wifi_armv7r_m9_rtkit_image.im4p) est un Mach-O 32 bits celui-ci étant lui-même embarqué dans un container IM4P il a aussi fallu l’extraire avec img4. Ce firmware est basé sur RTKit, un framwework interne d’Apple pour développer des systèmes en temps réel.

La puce utilisée pour le cellulaire de la Watch viens d’Intel, avec une architecture ARM.

Kernelcache

Comme sur chaque appareil de la marque à la pomme, le firmware de la montre embarque donc un kernelcache : kernelcache.release.watch4.

Après l’avoir décompressé, on peut confirmer que c’est un appareil 64 bits.

En listant les 4 dernières sections du fichier Mach-O, la plateforme est WatchOS 5.0.0, qui correspond à la mise à jour qui sera disponible au public.

Mais quelque chose cloche, la valeur de LC_SOURCE_VERSION ne correspond pas à la version du noyau XNU (4903.202.2), mais à celle du KernelCacheBuilder (1469.200.52.0.0), l’outil utilisé en interne chez Apple pour créer les kernelcaches.

Il semble que la personne en charge du déploiement des version de productions n’a pas mis la bonne valeur pour le flag RC_ProjectSourceVersion.

De plus, la montre embarque KTRR, la protection hardware sensée remplacer KPP.

Moteur neuronal

Pour je ne sais quelle raison, la montre embarque un réseau neuronal (h11_ane_fw_mercury.im4p). Nom de code : Mercury.

Encore une fois celui-ci est contenu dans un conteneur IM4P. La version de RTKit est RTKit-973.204.2 compilée le 14 aout 2018.

Contrairement au contrôleur Wifi, c’est un éxecutable avec une architecture 64 bits.

J’ai survolé ce fichier avec l’utilitaire strings et on dirait qu’il y a beaucoup d’informations de debug. Notamment car on peut afficher la liste des registres et leur valeur après une exception.

iPhone Xs

Place à l’iPhone Xs mais aussi au Xs Max et Xr, qui ont les mêmes caractéristiques au niveau hardware et software à quelques détails près. Voici une liste des nouveaux modèles d’iPhone :

Model Board Name
iPhone11,2 D321AP iPhone XS
iPhone11,4 D331AP iPhone XS Max
iPhone11,6 D331pAP iPhone XS Max (China)
iPhone11,8 N841AP iPhone XR

Hardware

Ces trois nouveaux iPhones embarquent la nouvelle puce A12 Bionic (T8020). C’est un processeur ARMv8.3 avec une architecture 64 bits

Tout comme l’Apple Watch, l’iPhone embarque un moteur neuronal (h11_ane_fw_quin.im4p) utilisé pour Face ID, nom de code : Quin.

Le firmware (armfw_g11p.im4p) du GPU est aussi basé sur RTKit.

Les nouveaux processeurs sont initialisés dès la première étape de demarrage. Cela permet d’appliquer KTRR sur ces coeurs.

Comme le souligne Longhorn c’est surement pour ça que les firmwares de ces processeurs sont disponibles dans le fichier IPSW. De plus cela permettra à Apple de les mettre à jour via iTunes ou Over The Air (OTA).

Kernelcache

Toutes les nouveautés dont j’ai parlé plus haut à propos du kernelcache sont implémentées. Soit un nouveau format, avec un kernel monolithique, aucun symbole, kexts non-séparées du noyau, etc…

Une nouveauté qu’apporte le nouveau processeur ARMv8.3 c’est l’authentification de pointeurs (en anglais : Pointer Authentication Codes ou PAC).

D’après Qualcomm, l’idée derrière l’authentification de pointeurs, c’est qu’un espace d’adressage de 64 bits est inferieur à 64 bits. On peut donc placer un pointeur authentifié après cet espace d’adressage et avant de l’écrire en mémoire.

Et donc vérifier l’intégrité de celui-ci avant de l’utiliser. Pour pouvoir modifier un pointeur protégé par le PAC, il faudrait donc trouver le PAC associé au pointeur.

On peut voir ça pour mitiger les techniques de Return Oriented Programming (ROP) et de Jump Oriented Programming (JOP)

D’ailleurs PAC est aussi implémenté sur la Watch.

IDA n’étant pas encore compatible avec les nouvelles instructions, xerub a publié un module pour le support des nouvelles instructions ARMv8.3.

Baseband

Le nouveau baseband de l’iPhone, Intel® XMM™ 7560 a le support multi-SIM, mais aussi 5G.

Les fichiers qui composent le firmware du baseband sont compressés au format ZIP dans le fichier ICE18-1.00.07.Release.bbfw (ICE correspond au firmware de Intel) . Pour les extraire on peut utiliser l’utilitaire unzip.

Le baseband contient deux fichiers binaires : psi_ram.bin (stage 0) qui va charger en mémoireebl.bin. Celui-ci va ensuite va faire de même pour les autres fichiers ELF et jumper vers le code principal dans SYS_SW.elf.

Un chercheur en sécurité a découvert quelques changements pour le baseband des iPhone XS/MAX et Xs. En effet contrairement à l’Apple Watch S4, celui-ci embarque un processeur Intel x86.

En prenant la même fonction comme exemple que sur son post dans le fichier psi_ram.bin on voit bien que ce sont des instructions x86.

Ralf (RPW) a aussi fait savoir que ce nouveau baseband peut détecter les appareils qui émettent des faux signaux cellulaires, comme les IMSI catchers.


C’est tout pour cette analyse, à l’heure ou j’écris ce post, iOS 12.0 sera disponible dans la soirée pour tous les appareils sous iOS 11.

Un autre appareil pourrait aussi être présenté d’ici peu. Il s’agirait d’un nouvel iPad avec un processeur T8027 (A12X) dont on peut voir l’identifiant présent comme chaine de caractère dans le kernelcache.

01/10/2018 : J’ai mis à jour mon article par rapport à la première release de jtool2 qui ajoute le support des nouveaux kernelcaches.

Si vous avez besoin d’infos ou souhaitez corriger des erreurs, contactez-moi sur Twitter: @matteyeux

Github : matteyeux


Sources :
Apple SoCs in 2018
iPhone Xs, Xr… And, TWO more things…
What do Pointer Authentication Codes mean for iOS jailbreaking?
Whitepaper: Pointer Authentication on ARMv8.3
x86 finds its way into your iPhone
Analyzing the iOS 12 kernelcache’s tagged pointers