Dans ce post on va voir comment installer Android puis une distribution de Linux spécialement créée pour l’iPhone.

Project SandCastle

Il y a quelques semaines, l’entreprise Corellium a présenté le projet SandCastle, qui consiste à démarrer Android sur un iPhone. Cela a été rendu possible grâce à checkra1n un outil de jailbreak avancé qui se base sur la faille BootROM checkm8 (checkmate) dévoilée fin 2019.

PongoOS

PongoOS est le système d’exploitation développé par l’équipe derrière l’outil de jailbreak checkra1n. C’est un environnement d’exécution chargé avant le démarrage du kernel. Il permet d’appliquer les patches nécessaires au kernel d’iOS, mais aussi de charger des images de firmware comme XNU ou Linux.

Il sera utilisé pour démarrer les images Android et Linux.

Pré-requis

Soyez sûr d’avoir installé les outils suivants :

  • libimobiledevice-tools
  • libusbmuxd-tools
  • libusb-dev

Avoir un câble série Lightning (DCSD, bonobo, etc…) est aussi fortement recommandé mais pas nécessaire.

Démarrer Android

Petite précision, j’utilise une distribution Linux Ubuntu, si vous utilisez un distribution différente les étapes seront les mêmes. De même pour les utilisateurs de MacOS.

Tout d’abord il faut télécharger le fichier ZIP pour démarrer Android le site du projet SandCastle. La version actuelle est uniquement compatible avec l’iPhone 7. Le support pour les autres appareils viendra plus tard.

Décompressez le fichier android-sandcastle.zip, et allez dans le dossier du même nom. Tout va ce passer dans ce répertoire.

Voici le contenu du répertoire :

λ ~/android-sandcastle » ls
Android.lzma  iproxy            libusbmuxd.4.dylib  setup_mac.sh
dtbpack       isetup            load-linux.mac      start_mac.sh
ids.dat       libplist.3.dylib  README.txt

La première chose à faire est de jailbreak votre appareil avec checkra1n. Si c’est déjà fait, utilisez l’app checkra1n pour restaurer l’appareil.

Ensuite, il faut envoyer le script de setup, isetup vers l’iPhone via SSH. Par défaut, il n’est pas possible de se connecter via SSH sur l’iPhone. Cependant, Checkra1n met à disposition le port 44 pour se connecter en SSH.

On va utiliser iproxy disponible dans le paquet libusbmuxd-tools , qui permet accéder à un service TCP d’un appareil Apple. Ca va nous permettre de faire du SSH over USB. Branchez votre iPhone à un ordinateur et lancez iproxy dans une nouvelle fenetre : iproxy 2222 44

λ ~ » iproxy 2222 44 &
λ ~/android-sandcastle » scp -P 2222 isetup root@127.0.0.1:/tmp/
root@127.0.0.1's password:
isetup                                                                 100% 1582   215.4KB/s   00:00

Vous pouvez ensuite vous connecter à l’iPhone sur le port 2222 et exécuter le script isetup :

λ ~/android-sandcastle » ssh root@127.0.0.1 -p 2222
root@127.0.0.1 password: 
-bash-3.2# chmod 755 /tmp/isetup 
-bash-3.2# /tmp/isetup 
Mounting /dev/disk0s1s6
Starting to download nand. This will take a few minutes
Decompressing nand image

Celui-ci va télécharger l’image NAND pour Android et créer un nouveau volume APFS dédié.

Maintenant qu’on a préparé l’environnement pour Android, on va pouvoir charger l’OS. Pour cela, à l’aide de checkra1n, il faut accéder à PongoOS : sudo checkra1n -p . Suivez les instructions de l’outil pour entrer en mode DFU. Sur l’écran de l’iPhone et la sortie série, vous avez maintenant accès au Shell de PongoOS.

Pour charger Android, il faut l’utilitaire load-linux. Il va nous permettre de charger une image Linux et un devicetree.

Si vous utilisez un Mac, l’exécutable est disponible dans le répertoire actuel. Pour les utilisateurs d’une distribution Linux, téléchargez le code sur le repository du projet. On va donc le compiler.

λ ~/android-sandcastle » curl -LO https://raw.githubusercontent.com/corellium/projectsandcastle/master/loader/load-linux.c
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5075  100  5075    0     0    333      0  0:00:15  0:00:15 --:--:--  1065
λ ~/android-sandcastle » gcc -o load-linux load-linux.c -I/usr/include/libusb-1.0 -lusb-1.0

On peut ensuite démarrer Android : sudo ./load-linux Android.lzma dtbpack. Sur la sortie série vous devriez voir le log du démarrage du noyau Linux.

Au niveau de l’affichage à l’écran, il y aura un démarrage en verbose et le logo d’Android s’affichera :

Actuellement, le support matériel est limité, mais c’est une première version beta. De plus à chaque redémarrage, il faudra relancer la procédure (pongoOS + load-linux) pour pouvoir démarrer à nouveau Android. C’est dû au type de la faille dans la stack USB de la BootROM, qui ne permet pas la persistance.

Démarrer Linux

Pour démarrer la version Linux, il faut télécharger, disponible sur la même page que la version Android. Ce fichier ZIP contient uniquement le strict nécessaire :

λ ~/linux-sandcastle » ls
dtbpack  Linux.lzma  load-linux.mac  README.txt

Pour démarrer Linux, même chose que pour Android : sudo ./load-linux Linux.lzma dtbpack.

Sur la sortie série, vous devriez avoir le prompt pour vous connecter (root/alpine) :

Si vous n’avez pas de câble série Lightning, vous pouvez vous connecter via SSH. Linux va créer une nouvelle interface USB sur votre machine permettant de vous connecter à l’iPhone. Sur ma machine elle se nomme enp0s29u1u2u1.

λ ~/linux-sandcastle » sudo ifconfig enp0s29u1u2u1  172.16.1.2/24
λ ~/linux-sandcastle » ip address show enp0s29u1u2u1
8: enp0s29u1u2u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether ea:af:05:80:7c:45 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.2/24 brd 172.16.1.255 scope global enp0s29u1u2u1
       valid_lft forever preferred_lft forever
    inet6 fe80::e8af:5ff:fe80:7c45/64 scope link 
       valid_lft forever preferred_lft forever

Vous pourrez ensuite y accéder via l’IP 172.16.1.1:

Bonus

Par défaut, l’iPhone n’a pas accès à Internet. Pour qu’il puisse y accéder, j’ai ajouté une route par défaut : ip route add default via 172.16.1.2 dev usb0. Vous pouvez aussi ajouter des serveurs DNS dans /etc/resolv.conf.

N’oubliez pas de router le trafic sur votre ordinateur, voici l’un des scripts que j’utilise :

#!/bin/bash

HOST=eno1
IPHONE=enp0s29u1u3u1

# Delete all existing rules.
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Keep my connections
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

# forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i $IPHONE -o $HOST -j ACCEPT
iptables -A FORWARD -i $HOST -o $IPHONE -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o $HOST -j MASQUERADE

Actuellement, ces projets sont uniquement compatibles avec les iPhone 7 et l’iPod touch 7. Le code source du noyau Linux et de la distribution buildroot sont disponibles sur Github.

Je vous invite aussi à lire l’histoire de Android sur iPhone.


Sources :