Parlons un peu du logiciel interne de l’Apple Vision Pro
Apple Vision Pro
En juin dernier, lors de la Worldwide Developers Conference 2023, Apple a présenté son “One More Thing”: l’Apple Vision Pro.
Tim Cook l’a défini comme une plateforme de réalité augmenté qui permettrait de mélanger le monde réel avec le monde numérique.
Ce nouvel ordinateur est en fait un casque de réalité mixte permettant de faire de l’informatique spatiale.
Il se contrôle avec les yeux, les mains, et la voix grâce à plein de capteurs un peu partout sur casque. Il embarque aussi un nouveau système d’exploitation : RealityOS
Dans cet article on va pas s’attarder sur les possibilités du casque, mais plutot sur la partie logicielle. Qu’est-ce qu’on peut apprendre de ce produit rien qu’en jetant un oeil au firmware du Vision Pro.
Coté hardware, le Vision Pro embarque une puce Apple Silicon M2.
Pour la gestion en temps réel des capteurs, une nouvelle puce a été conçue permettant de gérer en temps reel les informations reçues par les 12 caméras, les 5 capteurs et les 6 micros du casque.
Firmware
Au moment où j’écris cet article, Apple a sorti la beta 6 de realityOS 1.0.
Mon analyse portera sur la beta 1 car c’est la seule version pour laquelle j’ai les clés pour dechiffer le SEP et les bootloaders, mais concretement ya pas enormement de changements par rapport aux nouvelles betas. xrOS internal name for realityOS
OTA
Les fichiers de restauration IPSW ne sont pas disponibles publiquement. Mais les versions OTA qui sont un peu plus legères sont accessibles via Pallas, le service de mises à jours OTA d’Apple.
Grace à Pallas et le script de Siguza, on peut télécharger la version 1.0 beta 1 : RealityDevice14,1- 21N5207g.
Filesystem
Lorsque le fichier de mise à jour est decompressé, dans le repertoire AssetData/payloadv2
se trouvent les fichiers compressés representant les fichiers système du Vision Pro
Les payloads sont des fichiers avec comme magic pbzx
. un format detaillé dans la saga de J Levin dédiée aux mises à jour OTA d’Apple.
Chaque payload contient une partie des rootfs, qu’on peut extraire avec aa
sur MacOS : for i in payload.*; do aa extract -i $i -o out; done
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜ payloadv2 ll
total 65096
drwxrwxr-x 143 mathieu staff 4.5K Jul 21 08:00 Applications
drwxrwxr-x 2 mathieu staff 64B Jul 21 07:01 Developer
drwxr-xr-x 19 mathieu staff 608B Jul 30 09:45 Library
drwxr-xr-x 6 mathieu staff 192B Jul 21 08:00 System
drwxr-xr-x 18 mathieu staff 576B Jul 21 10:18 app_patches
drwxr-xr-x 4 mathieu staff 128B Jul 30 09:45 bin
drwxrwxr-t 2 mathieu staff 64B Jul 21 07:01 cores
dr-xr-xr-x 2 mathieu staff 64B Jul 21 07:01 dev
lrwxr-xr-x 1 mathieu staff 11B Jul 30 09:45 etc -> private/etc
drwxr-xr-x 7 mathieu staff 224B Jul 21 08:07 private
drwxr-xr-x 19 mathieu staff 608B Jul 30 09:45 sbin
lrwxr-xr-x 1 mathieu staff 15B Jul 30 09:45 tmp -> private/var/tmp
drwxr-xr-x 8 mathieu staff 256B Jul 21 08:07 usr
lrwxr-xr-x 1 mathieu staff 11B Jul 30 09:45 var -> private/var
Ca permet par exemple d’avoir un visuel des applications qui sont disponibles nativement pour RealityOS.
Apple R1 - Bora
Bora est le nom de code pour la puce R1. C’est la puce qui fait tourner un firmware temps réél.
Le firmware en question : AssetData/boot/Firmware/n301bora/Release/ftab.bin
. C’est un fichier FTAB qui a format spécifique assez simple. Il est notament utilisé pour les firmware d’Airpods.
1
2
3
4
5
6
7
8
9
10
> xxd ftab.bin
00000000: 00d1 0015 ffff ffff 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 726b 6f73 6674 6162 2c00 0000 0000 0000 rkosftab,.......
00000030: 696c 6c62 f002 0000 c817 0b00 0000 0000 illb............
00000040: 726b 6f73 b81a 0b00 a0d6 1400 0000 0000 rkos............
00000050: 6b6d 7069 58f1 1f00 80ad 0800 0000 0000 kmpiX...........
00000060: 6e76 726d d89e 2800 0040 0000 0000 0000 nvrm..(..@......
00000070: 616f 7066 d8de 2800 20f9 1300 0000 0000 aopf..(. .......
...
1
2
3
4
5
6
7
8
9
10
11
» python3 ftab_split.py ftab.bin
tag : illb offset : 0x2f0 size : 0xb17c8
tag : rkos offset : 0xb1ab8 size : 0x14d6a0
tag : kmpi offset : 0x1ff158 size : 0x8ad80
tag : nvrm offset : 0x289ed8 size : 0x4000
tag : aopf offset : 0x28ded8 size : 0x13f920
tag : ispf offset : 0x3cd7f8 size : 0xd21aa0
tag : disp offset : 0x10ef298 size : 0x4fb440
tag : disb offset : 0x15ea6d8 size : 0x60
tag : diss offset : 0x15ea738 size : 0x3b9dc0
tag : audl offset : 0x19a44f8 size : 0x1c5c00
Le CPU/Core ou tourne le RTOS pour le visionPro
RTKIT
Le SEP et OpticID
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
29
30
31
32
33
34
35
36
37
38
39
40
λ /tmp » ~/dev/sepsplit-rs/target/debug/sepsplit-rs sep-firmware.n301.RELEASE.bin sep
HDR UUID: 9e39de27-691f-293d-80a4-ebe0d1d88e17
detected 64 bit SEP
boot size 0x4000
kernel size 0x10000, UUID 9e39de27-691f-293d-80a4-ebe0d1d88e17
SEPOS size 0x2b138, UUID f6872af4-427f-7a32-8bac-f0e63e79c08b
SEPD phys_text 0x74000, virt 0x74000, size_text 0x14000, phys_data 0x3d4000, size_data 0x14000, entry 0x74da0,
UUID 4ab3bd0c-decd-0834-acbb-8d42112d9632
AESSEP phys_text 0x88000, virt 0x74000, size_text 0xc000, phys_data 0x3e8000, size_data 0x4000, entry 0x782d0,
UUID 1064d893-48c9-9230-ba3f-842a17bf84d9
dxio phys_text 0x94000, virt 0x74000, size_text 0x8000, phys_data 0x3ec000, size_data 0x4000, entry 0x76030,
UUID 1c52c8b3-d123-403e-addd-2786d6d1f069
entitlement phys_text 0x9c000, virt 0x74000, size_text 0x8000, phys_data 0x3f0000, size_data 0x4000, entry 0x765d0,
UUID 41e008d7-298a-d83f-9fe4-c652a6cf907b
skg phys_text 0xa4000, virt 0x74000, size_text 0xc000, phys_data 0x3f4000, size_data 0x4000, entry 0x777f0,
UUID 901b5d4d-a50a-be34-9ecb-304e3c6138e0
sars phys_text 0xb0000, virt 0x74000, size_text 0x14000, phys_data 0x3f8000, size_data 0x4000, entry 0x772e0,
UUID f5f7f59f-b871-5637-b432-3d5617e2c7f1
ARTM phys_text 0xc4000, virt 0x74000, size_text 0x4000, phys_data 0x3fc000, size_data 0x4000, entry 0x75b60,
UUID e43753aa-3513-2432-b941-6ff7b4bbfb80
xART phys_text 0xc8000, virt 0x74000, size_text 0x8000, phys_data 0x400000, size_data 0x40000, entry 0x762c0,
UUID 32fd0e46-970c-3135-9d22-f24ddbdbaa39
oysAppl_n301 phys_text 0xd0000, virt 0x74000, size_text 0x100000, phys_data 0x440000, size_data 0x8000, entry 0x74c40,
UUID 8508170c-2a49-f132-950e-3fd3c8b895b0
scrd phys_text 0x1d0000, virt 0x74000, size_text 0x20000, phys_data 0x448000, size_data 0x10000, entry 0x90960,
UUID 3ae1c1c9-6b6b-5936-a93e-043d8fefd1c9
pass_ocelot phys_text 0x1f0000, virt 0x74000, size_text 0x4000, phys_data 0x458000, size_data 0x4000, entry 0x76e50,
UUID 841f73f8-87ea-0f3b-b6b9-b521da89b5de
sks phys_text 0x1f4000, virt 0x74000, size_text 0xa8000, phys_data 0x45c000, size_data 0x8000, entry 0xdf130,
UUID 15eb2b1e-7722-513b-adc2-413714a475d8
ssma phys_text 0x29c000, virt 0x74000, size_text 0x1c000, phys_data 0x464000, size_data 0xc000, entry 0x7acc0,
UUID 15fb152e-e697-8f33-85f7-12b62ce98e12
hdcp phys_text 0x2b8000, virt 0x74000, size_text 0x8000, phys_data 0x470000, size_data 0x8000, entry 0x7ab70,
UUID 1b8137ee-23f2-e730-aa9e-0aa861010f3b
soys_n301 phys_text 0x2c0000, virt 0x74000, size_text 0x50000, phys_data 0x478000, size_data 0x1f4000, entry 0x9ed00,
UUID 6c22df47-95b3-3d32-ad7e-172748ec0ed8
sse phys_text 0x310000, virt 0x74000, size_text 0x1c000, phys_data 0x66c000, size_data 0x10000, entry 0x7ecc0,
UUID 5b6355c9-b3ef-9d30-9259-a604d1f9842c
libShared_n301_R phys_text 0x32c000, virt 0x8000, size_text 0x40000, phys_data 0x67c000, size_data 0x80000, entry 0x8000,
UUID 74da95a5-5123-7234-95cc-e879bce2f1a9
Pour conclure, on a un logiciel, plutôt facile à analyser. Mise à part le chiffrement XOR des strings, il n’y pas d’offuscation.
Une fois installé et grâce à la persistance, il est embêtant à supprimer définitivement. Et si le kernel module est installé, l’exécutable peut être “caché”. Pareil pour la liste des ports ouverts.
En lisant les premiers rapports qui datent de 2015, on voit que c’est un malware qui n’a pas énormément évolué au fil du temps.
J’espère que ce post vous a plu, n’hésitez pas à me contacter sur Twitter, Mastodon ou même par mail si vous avez des questions.
Liens et sources :