Home Vision Pro
Post
Cancel

Vision Pro

swaggy_logo

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

whoops

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 whoops

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. whoops

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 :

This post is licensed under CC BY 4.0 by the author.