Voici une nouvelle analyse du Secure Enclave Processor (SEP) d’Apple.
A propos du SEP
Le SEP a été introduit par Apple avec l’iPhone 5S et Touch ID en septembre 2013. Ce processeur a pour but de stocker et chiffrer les données biométriques utilisées pour déverrouiller les appareils d’Apple.
De plus, il permet de protéger les données utilisateur sur l’iPhone. Chaque fichier est chiffré par une clé unique générée par le SEP. Même en transposant la mémoire flash d’un appareil verrouillé par un code sur un autre appareil, les données restent inaccessibles.
Le SEP permet aussi d’empêcher les tentatives des brute force sur le code de verrouillage.
Le SEP permet donc de :
- Déverrouiller un appareil Apple (Mac, iPhone, etc…) via un code ou avec Face ID et Touch ID.
- Chiffrer les données d’un stockage.
- Gérer le contrôle de la caméra Face Time.
- Contrôler le Secure Boot des Macs.
Il faut savoir que le SEP est encore considéré comme une black box. Le firmware que l’on peut récupérer dans les fichiers de mise à jour pour appareils Apple est chiffré. Celui-ci est uniquement déchiffré au démarrage de l’iPhone lorsqu’il est chargé en mémoire.
Aujourd’hui tous les appareils Apple sont équipés d’un SEP.
Hardware
Coté matériel, sur les générations A7 - A10, le SEP est un processeur Kingfisher Cortex A 32 bits. Sur les versions A11 - A13, le processeur a une architecture 64 bits.
Il possède un moteur matériel pour le chiffrement des données ainsi que son propre générateur de nombres aléatoires pour la génération des clés. Et il gère sa mémoire de façon chiffré et inaccessible par l’Application Processor (AP).
Le SEP a ses propres périphériques dédiés (GPIO, SPI, UART) et est isolé du reste du SOC. L’AP peut uniquement contacter le SEP via une mailbox, c’est un mécanisme permettant de faire communiquer les deux processeurs ensemble. Il n’est donc pas affecté par checkm8.
En plus, les capteurs biométriques tels que Touch ID et Face ID sont pairé directement à l’assemblage des appareils pour assurer une intégrité des composants.
SEPROM
La SEPROM est le premier code à s’exécuter sur le coprocesseur. Celle-ci est immutable et ne peut pas être modifiée.
Lors du démarrage d’un iPhone, le CPU est initialisé et va ainsi initialiser le SEP, et le démarrer. Celui-ci vérifie lui-même son intégrité, puis il va ensuite vérifier l’intégrité de la BootROM. Si l’authentification n’est pas validée, le SEP n’autorise pas le démarrage de la BootROM.
Voici le schéma qui vient du brevet officiel montrant les vérifications du SEP au démarrage :
Comme pour l’AP, la chaine de démarrage du SEP se base sur une chaine de confiance.
La SEPROM étant en lecture seule, Apple s’est permis de “hard coder” le certificat dans la ROM. On peut donc trouver l’adresse du certificat à l’aide de binwalk.
1
2
3
4
5
6
λ ~ » binwalk SEPROM.t8027.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
63568 0xF850 SHA256 hash constants, little endian
80616 0x13AE8 Certificate in DER format (x509 v3), header length: 4, sequence length: 1370
Ensuite on peut extraire le certificat à l’aide de dd
. Puis le parcourir avec openssl :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
λ ~ » dd if=SEPROM.t8027.bin of=SEPROM_cert skip=80616 bs=1
181528+0 records in
181528+0 records out
181528 bytes (182 kB, 177 KiB) copied, 0,449162 s, 404 kB/s
λ ~ » openssl asn1parse -inform der -in SEPROM_cert
0:d=0 hl=4 l=1370 cons: SEQUENCE
4:d=1 hl=4 l= 834 cons: SEQUENCE
8:d=2 hl=2 l= 3 cons: cont [ 0 ]
10:d=3 hl=2 l= 1 prim: INTEGER :02
13:d=2 hl=2 l= 8 prim: INTEGER :521563F9FDF7D0C6
23:d=2 hl=2 l= 13 cons: SEQUENCE
25:d=3 hl=2 l= 9 prim: OBJECT :sha384WithRSAEncryption
49:d=5 hl=2 l= 30 prim: UTF8STRING :Apple Secure Boot Root CA - G2
81:d=3 hl=2 l= 19 cons: SET
83:d=4 hl=2 l= 17 cons: SEQUENCE
85:d=5 hl=2 l= 3 prim: OBJECT :organizationName
90:d=5 hl=2 l= 10 prim: UTF8STRING :Apple Inc.
102:d=3 hl=2 l= 11 cons: SET
104:d=4 hl=2 l= 9 cons: SEQUENCE
106:d=5 hl=2 l= 3 prim: OBJECT :countryName
111:d=5 hl=2 l= 2 prim: PRINTABLESTRING :US
115:d=2 hl=2 l= 30 cons: SEQUENCE
117:d=3 hl=2 l= 13 prim: UTCTIME :141219201310Z
132:d=3 hl=2 l= 13 prim: UTCTIME :341214201310Z
147:d=2 hl=2 l= 75 cons: SEQUENCE
153:d=5 hl=2 l= 3 prim: OBJECT :commonName
158:d=5 hl=2 l= 30 prim: UTF8STRING :Apple Secure Boot Root CA - G2
[..]
Contrairement à l’Application Processor, PAC n’a pas été implémenté dans la SEPROM.
SEP Firmware
Le firmware du SEP est accessible depuis les fichiers de mise à jour d’iOS. Mais comme dis plus haut celui-ci est chiffré. Néanmoins, certaines clés sont disponible sur the iPhone Wiki et parfois sur Twitter.
Si on regarde le firmware déchiffré dans un éditeur hexadécimal, on peut voir qu’il contient plusieurs références (SEPOS, SEPD, etc…) au début du fichier.
Ce sont en fait des fichiers au format mach-O qui sont des composants du firmware. Par défaut le premier fichier mach-o dans le firmware du SEP, c’est le kernel. Pour le localiser il suffit de chercher la première valeur magic d’un fichier mach-o 64 bits : feedfacf
. Au format little-endian ça donne cffaedfe
.
Pour faciliter l’extraction des différents fichiers, j’ai écrit un script en Python. Celui-ci parcourt le firmware et cherche les fichiers mach-o pour ensuite les extraire.
Les images extraites sont celles du système du SEP, comme le kernel, SEPOS et les drivers, ainsi que les applications comme AESSEP ou ARTMate.
seputil
seputil
est l’utilitaire en ligne de commande qui gère le SEP. C’est cet outil qui permet de charger le firmware en mémoire. Il est aussi utilisé pour communiquer avec SEPOS et la SEPROM.
Pour charger le SEP, seputil
doit parser le firmware qui est dans un conteneur img4. Le type de format img4 est aussi utilisé sur les autres fichiers de démarrage comme l’iBoot. On retrouve donc plusieurs références à ce format dans le dît fichier.
A noter qu’une faille dans ce parser, permettrait une compromission totale du SEP et de la SecureROM. Cela fait de seputil
un point d’entrée parfait pour bidouiller.
De plus sur certains appareils il est possible d’accéder à la console du SEP via seputil
. Ce sont des commandes qui sont envoyées directement au SEPOS. Ces commandes fonctionnent uniquement en interagissant via la sortie série des appareils Apple.
Toutefois, la console était disponible sur les versions antérieures d’iOS.
Demotion du SEP
Par défaut sur les appareils de production, Apple ne permet pas de debugger le SEP via JTAG ou SWD. Grace à ce type de debugging de bas niveau il serait donc possible d’extraire la ROM du SEP (SEPROM), mais aussi charger des images modifiées ou utiliser la GID-key pour déchiffrer d’autres images du même SoC.
Seuls les appareils de développement permettent ce type de debugging. Le terme d’Apple pour ce type de fonctionnalité s’appelle “demotion”. La seule fois ou quelqu’un d’Apple en a parlé c’était Ivan Krstic à la Black Hat.
Ce même terme a été repris par axi0mx dans ipwndfu pour activer la fonctionnalité de JTAG sur la SecureROM des iPhones vulnérables à checkm8.
Pour demote le SEP, il faut pouvoir exécuter du code arbitraire dans la SEPROM. Cela permettrait de changer la valeur du fusible de sécurité d’un appareil. Celui-ci est accessible uniquement via l’espace d’adressage du SEP.
Mais fort heureusement, via un certain type de prototype d’iPhone/iPod/iPad il est possible de récupérer la ROM de ce processeur. Certaines ont été rendues accessible via securerom.fun.
C’était un premier aperçu du SEP. J’ai prévu d’autres articles notamment pour expliquer plus en profondeur le firmware et SEPOS.
Il y a quelques années j’avais déjà écrit un article sur le SEP, mais il se basait sur le firmware de l’iPhone 5S. Depuis l’iPhone 8/X le SEP a une architecture 64 bits avec beaucoup plus de fonctionnalités que ses prédécesseurs. Et j’ai aussi quelques outils en plus pour mener à bien ma recherche :).
Sources :