Le premier jailbreak pour Apple Watch est disponible et voici comment il fonctionne.

Apple Watch

La première Apple Watch a été dévoilée le 9 septembre 2014 et est sortie presque huit mois plus tard, soit le 24 avril 2015. Cela fait trois ans que la montre d’Apple est disponible et personne avant tihmstar n’avait encore publié un jailbreak aussi complet pour l’Apple Watch.

En effet si on récapitule la recherche publique qui a été faite pour ce bijoux de technologie on a :

On sait que Luca Todesco avait déjà jailbreak la watch comme le montre son tweet qui affiche un remote shell avec la commande uname -a permettant d’afficher quelques informations sur le noyau de l’OS et ps -e pour lister les processus et leur PID.

De plus axi0mX a récemment publié les clés de déchiffrement pour l’Apple Watch de première génération ce qui signifie qu’il a un exploit assez puissant pour récupérer les clés dans la bootchain.

L’Apple Watch étant un appareil 32 bits, celle-ci n’a pas de protection post-exploit comme pour les appareils 64 bits comme l’iPhone 5S. En effet KPP et KTRR ne sont pas présents pour vérifier l’intégrité du kernel. Le plus gros problème pour la montre d’Apple est qu’on ne peut communiquer initialement avec que par l’intermédiaire de l’iPhone.

De plus cette montre est plus lente qu’un iPhone ou un iPad donc le code en général met plus de temps à s’exécuter.

L’Apple Watch étant fournie avec un câble de recharge à induction, celui-ci ne permet pas de communiquer avec la montre ni de restaurer celle-ci en configuration usine. Néanmoins des câbles pour accéder au port de diagnostic de la watch sont disponibles mais couteux.

Contrairement aux autres appareils mobiles de la marque à la pomme, les firmwares des Apple Watches ne sont pas disponibles publiquement ce qui rend la tâche encore plus difficile pour la restauration.

Comme on peut le voir, il y a plus d’inconvénients que d’avantages à jailbreak une Apple Watch.

jelbrekTime

jelbreakTime est uniquement compatible avec l’Apple Watch S3 sous watchOS 4.1. Ce jailbreak inclut :

  • l’obtention du task_port pour le PID 0 qui correspond au PID du kernel pour le rediriger vers host_get_special_port(4)
  • les patches de h3lix, un jailbreak pour iPhone et iPad 32 bits sous iOS 10.x
  • un accès en lecture et écriture au fichiers systèmes de la montre
  • un bootstrap.tar modifié pour Apple Watch

Origine du nom

Le nom divisé en deux mots est un clin d’œil à la communauté du jailbreak iOS. “Jelbrek” qui signifie “jailbreak” est le nom que les membres de la communauté ont donné pour toute sorte de troll en lien avec le subreddit /r/jelbrek. Et “time” pour “temps” en français.

Compilation

Pour pouvoir analyser le programme avec un désassembleur, même si le code est disponible, il a fallut compiler l’outil de jailbreak. On peut le faire directement en ligne de commande sans passer par Xcode :

$ xcodebuild clean build CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -sdk watchos`

On retrouve l’exécutable principal dans build/Release-watchos/jelbrekT1m3\ WatchKit\ App.app/PlugIns/jelbrekT1m3\ WatchKit\ Extension.appex/.

Celui-ci s’appelle “jelbrekT1m3 WatchKit Extension”.

A l’aide de l’utilitaire file on peut voir qu’il correspond au type de fichier exécutable pour Apple Watch :

$ file  jelbrekT1m3\ WatchKit\ Extension
jelbrekT1m3 WatchKit Extension: Mach-O executable arm_v7k

Exploit

L’exploit utilisé pour jailbreak la watch est v0rtex, une implémentation open source de l’exploit detaillé par la team Pangu. Même si le post est écrit en chinois, le code pour déclencher le bug est compréhensible puisqu’il est écrit en C.

Le bug exploité est dans le driver IOSurface qui est une extension du noyau XNU. C’est un bug de type Use After Free. C’est qu’on utilise de la mémoire qui a déjà été libérée. Comme par exemple l’utilisation d’un pointeur après avoir appelé free().

Dans ce cas précis, c’est l’utilisation du mach port après sa libération.

Cet exploit a déjà été utilisé pour les jailbreak h3lix (32 bits) et double-h3lix (64 bits). Il est donc parfaitement adapté pour la montre et n’a reçu pratiquement aucun changement par rapport à l’exploit initial pour iOS.

Un write-up plus poussé est disponible ici.

Kernelpatches

La fonction betterWorkingAndShit() ensuite appliquer les différents patches pour le noyau. Jelbrektime embarque plusieurs patches pour le kernel communs aux appareils 32 bits :

  • PE_i_can_has_debugger = 1 pour désactiver certaines fonctionnalités de sécurité telles que l’autorisation d’éxecuter des binaires non-signés par AMFI.
  • Monter / en R/W
  • Possibilité de remonter les rootfs sans le paramètre nosuid qui permet d’autoriser les opérations sur les bits suid et sgid
  • proc_enforce = 0 : empêche la “politique” de vérification de AMFI d’être mise en place et retourne SUCCESS à chaque vérification
  • Désactivation des vérifications de signature de AMFI
  • Lecture, écriture et exécution de code en mémoire
  • Désactivation de composants de la sandbox

bootstrap.tar

Le fichier bootstrap.tar est une archive tar qui contient une suite de binaires pour iOS pour qu’il tourne comme une machine UNIX. Si on liste le contenu de l’archive on voit tous les fichiers et les répertoires dans lesquels ils seront installés.

$ tar -tvf bootstrap.tar
-rwxr-xr-x tihmstar/staff     212 2018-08-03 09:38 ./usr/bin/._cat
-rwxr-xr-x tihmstar/staff   87984 2018-08-03 09:38 ./usr/bin/cat
-rwxr-xr-x tihmstar/staff     212 2018-08-01 01:01 ./usr/bin/._tabs
-rwxr-xr-x tihmstar/staff  105840 2018-08-01 01:01 ./usr/bin/tabs
-rwxr-xr-x tihmstar/staff     212 2018-08-01 01:43 ./usr/bin/._zgrep
-rwxr-xr-x tihmstar/staff    7591 2018-08-01 01:43 ./usr/bin/zgrep
-rwxr-xr-x tihmstar/staff     212 2018-08-01 01:43 ./usr/bin/._zmore
-rwxr-xr-x tihmstar/staff    1841 2018-08-01 01:43 ./usr/bin/zmore

Voici la méthode utilisée pour installer les composants de bootstrap.tar dans les rootfs

NSURL *bootstrapURL = [[NSBundle mainBundle]URLForResource:@"bootstrap" withExtension:@"tar"];
r = [[NSFileManager defaultManager] fileExistsAtPath:@"/bin/bash"];
if(!r){
	postProgress(@"installing bootstrap");
	NSLog(@"Extracting bootstrap...\n");
	r = easyPosixSpawn([NSURL fileURLWithPath:@"/bin/tar"], @[@"-xkvf", bootstrapURL.path, @"-C", @"/", @"--preserve-permissions"]);
	if(r != 0){
    	NSLog(@"posix_spawn returned nonzero value: %d, errno: %d, strerror: %s\n", r, errno, strerror(errno));
    	//            return;
}

La première ligne se charge de trouver le bootstrap.tar qui se trouve dans jelbrekTime/jelbrekT1m3 WatchKit Extension/resources/. Ensuite on détermine si le fichier /bin/bash existe. Si il existe cela signifie que la montre a déjà été jailbreak une première fois et donc pas besoin de refaire cette étape.

En revanche, si le fichier n’est pas trouvé alors la fonction easyPosixSpawn() est appelée pour exécuter la commande suivante : tar -xkvf bootstrap.tar -C / --preserve-permissions . Cela va extraire l’archive dans à partir de la racine / et préservera les fichiers déjà existant ainsi que les permissions.

Si l’on compare après extraction, les permissions sont les mêmes.

$ ls -la bin/bash
-rwxr-xr-x 1 mathieu mathieu 1175456 Aug  3 09:37 bin/bash

$ tar -tvf bootstrap.tar | grep -e "/bin/bash" | tail -n -1
-rwxr-xr-x tihmstar/staff 1175456 2018-08-03 09:37 ./bin/bash

SSH

L’archive bootstrap.tar embarque un serveur SSH qui permet donc de contrôler la montre à distance à l’aide d’un remote shell ou via SFTP.

A la suite de l’installation de l’archive et toujours dans la fonction easyPosixSpawn() on passe à la configuration du serveur SSH puis à la génération des clés d’authentification pour OpenSSH.

FILE *sshd_config = fopen("/etc/sshd_config", "a");
char appendbuf[] = "UsePrivilegeSeparation no\nPermitRootLogin yes\nPort 22\nPort 2222\n";
fwrite(appendbuf, sizeof(appendbuf), 1, sshd_config);
fclose(sshd_config);
[...]
if (![[NSFileManager defaultManager] fileExistsAtPath:@"/etc/ssh_host_ed25519_key"]){
    mysystem("/usr/bin/ssh-keygen -N '' -t ed25519 -f /etc/ssh_host_ed25519_key");
}
mysystem("/usr/sbin/sshd");

La dernière ligne est l’équivalent de la fonction system() qui n’est pas disponible dans le SDK d’iOS. Elle est appelée pour lancer le deamon sshd.

Le fait est que l’Apple Watch n’a pas d’interface réseau Wifi. Pour se connecter via SSH il faut donc se connecter à la Watch depuis l’iPhone par Bluetooth depuis un ordinateur. Pour cela il faut utiliser un client pour com.apple.companion_proxy developpé par Luca Todesco pour son jailbreak. A l’aide de cet outil on va pouvoir rediriger lier le port 22 de la montre connectée vers un port aléatoire non-utilisé sur l’iPhone.

Puis à l’aide de iProxy on va pouvoir configurer un tunnel entre le PC et la montre sur le port souhaité. L’image ci-dessus vient de Luca Todesco qui montre comment fonctionne son outil.


C’est à peu près tout pour ce jailbreak. Bien qu’il y ai très peu d’avantages à jailbreak un Watch pour un utilisateur de jailbreak lambda. Il se pourrait que d’autre outils de jailbreak pour Apple Watch voient le jour dans les prochaines années.

En effet, avec WatchOS 5 Apple permet d’ouvrir des liens depuis l’Application messages et dans ce cas la surface d’attaque s’agrandit grâce à Webkit.


Si vous avez besoin d’infos contactez-moi sur Twitter: @matteyeux

Github : https://github.com/matteyeux


Sources :