KernelCache: Difference between revisions

From The French Apple Wiki
Jump to navigationJump to search
Created page with "# Kernelcache Le **kernelcache** est un fichier essentiel dans l'écosystème des systèmes d'exploitation d'Apple (iOS, iPadOS, macOS, watchOS, etc.). Il regroupe le noyau du système d'exploitation ainsi que toutes ses extensions (connues sous le nom de KEXTs, pour Kernel Extensions) dans un seul fichier. Ce fichier est ensuite encapsulé et souvent chiffré dans un conteneur spécifique, selon la version du système et le matériel utilisé : un conteneur **IMG3** po..."
 
No edit summary
 
Line 1: Line 1:
# Kernelcache
= Kernelcache =
Le '''kernelcache''' est un fichier essentiel dans les systèmes d'exploitation d'Apple (iOS, macOS, etc.), qui regroupe le noyau lui-même ainsi que toutes ses extensions (connues sous le nom de '''KEXTs''', pour ''Kernel Extensions''). Ces extensions incluent des pilotes et des modules comme '''AppleImage3NORAccess''', '''IOAESAccelerator''', '''IOPKEAccelerator''', etc. Ce fichier est ensuite encapsulé et, dans la plupart des cas, chiffré dans un conteneur spécifique selon la version du système :


Le **kernelcache** est un fichier essentiel dans l'écosystème des systèmes d'exploitation d'Apple (iOS, iPadOS, macOS, watchOS, etc.). Il regroupe le noyau du système d'exploitation ainsi que toutes ses extensions (connues sous le nom de KEXTs, pour Kernel Extensions) dans un seul fichier. Ce fichier est ensuite encapsulé et souvent chiffré dans un conteneur spécifique, selon la version du système et le matériel utilisé : un conteneur **IMG3** pour iPhone OS 2.0 et supérieur, un conteneur **IMG4** pour les appareils équipés d'une puce A7 ou plus récente et les Apple Watches, ou un conteneur **8900** pour les versions iPhone OS 1.0 à 1.1.4.
* '''IMG3''' : Utilisé à partir d'iPhone OS 2.0.
* '''IMG4''' : Utilisé pour les appareils équipés d'une puce A7 ou plus récente, ainsi que pour les Apple Watches.
* '''8900''' : Utilisé pour iPhone OS 1.0 à 1.1.4.


Dans ce document, nous allons explorer en détail le fonctionnement du kernelcache, son contenu, les outils utilisés pour l'analyser, ainsi que les évolutions récentes dans son format, notamment à partir de l'iPhone XS (iPhone11) et d'iOS 12.
== Analyse du Kernelcache ==
L'outil '''joker''', disponible sur <nowiki>http://newosxbook.com/</nowiki>, permet d'extraire des informations détaillées à partir d'un kernelcache déchiffré. Cet outil fournit des données précieuses telles que :


---
* Les adresses des appels système (''system calls'') et des ''Mach traps'' dans le noyau.
* Une liste complète des KEXTs contenus dans le kernelcache, avec leurs adresses de chargement.


## Qu'est-ce que le kernelcache ?
=== Exemple de sortie pour un kernelcache iOS 6.1.3 (iPhone 4, iPhone3,1) ===
Voici un extrait de la sortie générée par l'outil ''joker'' pour un kernelcache d'iOS 6.1.3, montrant 153 KEXTs :
{| class="wikitable"
!Kext Nom
!Adresse
!Offset Fichier
!Identifiant
|-
|Libkern Pseudoextension
|0x80396000
|0xffffffff
|com.apple.kpi.libkern
|-
|Mach Kernel Pseudoextension
|0x8039e000
|0x35d000
|com.apple.kpi.mach
|-
|Unsupported Pseudoextension
|0x8039f000
|0x35e000
|com.apple.kpi.unsupported
|-
|I/O Kit Pseudoextension
|0x803a1000
|0x360000
|com.apple.kpi.iokit
|-
|Private Pseudoextension
|0x803b8000
|0x377000
|com.apple.kpi.private
|-
|BSD Kernel Pseudoextension
|0x803bd000
|0x37c000
|com.apple.kpi.bsd
|-
|AppleARMPlatform
|0x803c3000
|0x382000
|com.apple.driver.AppleARMPlatform
|-
|AppleSamsungSPI
|0x803fd000
|0x3bc000
|com.apple.driver.AppleSamsungSPI
|-
|...
|...
|...
|...
|}
''(Note : La liste complète contient 153 KEXTs, mais seuls quelques exemples sont présentés ici pour des raisons de concision.)''


Le kernelcache est une archive qui combine :
== Évolution du format du Kernelcache (iOS 12 et versions ultérieures) ==
- **Le noyau** : le cœur du système d'exploitation, responsable de la gestion des ressources matérielles et logicielles.
À partir de l'iPhone XS/R (iPhone11) et d'iOS 12, Apple a introduit un nouveau format de kernelcache. Ce format se distingue par plusieurs caractéristiques :
- **Les extensions du noyau (KEXTs)** : des modules logiciels qui étendent les fonctionnalités du noyau, comme les pilotes pour le matériel (USB, stockage, réseau, etc.) ou les frameworks système (sécurité, cryptographie, etc.).


Le kernelcache est optimisé pour réduire le temps de démarrage du système en préchargeant le noyau et ses extensions dans un fichier unique, évitant ainsi le chargement individuel des KEXTs au démarrage. Ce fichier est généralement chiffré pour des raisons de sécurité, en particulier sur les appareils iOS, afin de protéger le système contre les modifications non autorisées.
* '''Version LC_SOURCE_VERSION''' : La version indiquée est nettement inférieure à celle du noyau XNU (par exemple, 1469 pour iOS 12, 17xx pour iOS 13), probablement en raison d'une mauvaise configuration du générateur de kernelcache.
* '''Structure monolithique''' : Les nouveaux kernelcaches sont monolithiques, avec le code des KEXTs étroitement intégré au noyau lui-même, rendant l'extraction des KEXTs plus complexe.
* '''Suppression des symboles''' : Les symboles sont entièrement supprimés, ce qui complique l'analyse. L'outil ''joker'' ne peut plus extraire les KEXTs individuellement avec sa fonction ''Kextraction''.


Le kernelcache est utilisé sur tous les systèmes d'exploitation d'Apple, mais son format et sa structure varient en fonction de l'appareil et de la version du système d'exploitation.
Cependant, l'outil '''jtool2''' (successeur de ''joker'') avec l'option <code>--analyze</code> permet de symboliser des milliers de symboles (entre 3 000 et 8 000 selon la version d'iOS), offrant une alternative pour l'analyse.


---
== Analyse avancée avec ioskextdump ==
L'outil '''ioskextdump''', développé par ''cocoahuke'', utilise le framework de désassemblage '''Capstone''' pour analyser les kernelcaches iOS. Il fournit des informations détaillées particulièrement utiles pour la recherche de vulnérabilités, notamment :


## Structure du kernelcache
* Nom, adresse, taille et table virtuelle (''vtable'') de toutes les classes de base et dérivées d'IOKit.
* Relations d'héritage pour toutes les classes dérivées d'IOKit.
* Adresses de toutes les fonctions et leurs positions dans la ''vtable''.
* Symbolisation de toutes les fonctions dans chaque classe dérivée.
* Liste des fonctions surchargées (''override'') dans chaque classe dérivée.
* Détection de la structure '''IOExternalMethodDispatch''' dans chaque classe ''UserClient''.


Le kernelcache contient une liste impressionnante d'extensions du noyau, chacune avec un rôle spécifique. Par exemple, pour un kernelcache extrait d'iOS 6.1.3 sur un iPhone 4 (iPhone3,1), l'outil **joker** (disponible sur [newosxbook.com](http://newosxbook.com/)) a permis d'identifier 153 KEXTs. Voici un extrait des extensions présentes dans ce kernelcache, avec leurs adresses de chargement et leurs identifiants :
Cet outil prend en charge les kernelcaches d'iOS 8 à 13 et différentes architectures (arm32, arm64, x86_64).


- **Libkern Pseudoextension** (`com.apple.kpi.libkern`) : Fournit des fonctions de base pour la gestion des KEXTs.
=== Exemple de sortie pour iOS 12.3 (IOHIDLibUserClient) ===
- **Mach Kernel Pseudoextension** (`com.apple.kpi.mach`) : Gère les appels système Mach.
Voici un extrait de la sortie générée par ''ioskextdump_ios10'' pour un kernelcache iOS 12.3, montrant les détails de la classe '''IOHIDLibUserClient''' :
- **I/O Kit Pseudoextension** (`com.apple.kpi.iokit`) : Framework pour les pilotes matériels.
<code>******** 1:com.apple.iokit.IOHIDFamily *******
- **AppleARMPlatform** (`com.apple.driver.AppleARMPlatform`) : Support pour les processeurs ARM d'Apple.
(0xfffffff005ff7ee8)->OSMetaClass:OSMetaClass call 4 args list
- **IOCryptoAcceleratorFamily** (`com.apple.iokit.IOCryptoAcceleratorFamily`) : Gestion du chiffrement matériel.
x0:0xfffffff00775bb40
- **IOUSBFamily** (`com.apple.iokit.IOUSBFamily`) : Support pour les périphériques USB.
x1:IOHIDLibUserClient
- **AppleJPEGDriver** (`com.apple.driver.AppleJPEGDriver`) : Gestion du décodage JPEG.
x2:0xfffffff007668400
- **IOSurface** (`com.apple.iokit.IOSurface`) : Gestion des surfaces graphiques.
x3:0x150
vtable start from addr 0xfffffff006deef70
Inheritance relationship: IOUserClient->IOService->IORegistryEntry->OSObject
### Fonctions surchargées
| Fonction | Adresse | Implémentation |
|----------|---------|----------------|
| IOUserClient_IOUserClient | 0xfffffff006deef70 | 0xfffffff005ff500c |
| IOUserClient_~IOUserClient | 0xfffffff006deef78 | 0xfffffff005ff5010 |
| IOUserClient_getMetaClass | 0xfffffff006deefa8 | 0xfffffff005ff5028 |
| IOUserClient_free | 0xfffffff006deefd8 | 0xfffffff005ff63c0 |
| IORegistryEntry_setProperties | 0xfffffff006def0c8 | 0xfffffff005ff65a8 |
| IOService_didTerminate | 0xfffffff006def1d0 | 0xfffffff005ff6370 |
| IOService_start | 0xfffffff006def218 | 0xfffffff005ff5a04 |
| IOService_stop | 0xfffffff006def220 | 0xfffffff005ff5e9c |
| IOService_attach | 0xfffffff006def2c8 | 0xfffffff005ff7dac |
| IOService_message | 0xfffffff006def388 | 0xfffffff005ff64a8 |
| IOUserClient_externalMethod | 0xfffffff006def4a8 | 0xfffffff005ff60d0 |
| IOUserClient_initWithTask | 0xfffffff006def4c0 | 0xfffffff005ff585c |
| IOUserClient_clientClose | 0xfffffff006def4c8 | 0xfffffff005ff59e0 |
| IOUserClient_registerNotificationPort | 0xfffffff006def4e0 | 0xfffffff005ff65c8 |
| IOUserClient_clientMemoryForType | 0xfffffff006def4f8 | 0xfffffff005ff67a8 |
### Méthodes externes
| Index | Fonction | scalar_i | struct_i | scalar_o | struct_o |
|-------|----------|----------|----------|----------|----------|
| 0 | 0xfffffff005ff514c | 0x0 | 0x0 | 0x2 | 0x0 |
| 1 | 0xfffffff005ff5164 | 0x1 | 0x0 | 0x0 | 0x0 |
| 2 | 0xfffffff005ff5170 | 0x0 | 0x0 | 0x0 | 0x0 |
| 3 | 0xfffffff005ff5188 | 0x2 | 0x0 | 0x1 | 0x0 |
| ... | ... | ... | ... | ... | ... |</code>
''(Note : La sortie complète contient 1860 classes IOKit. Vous pouvez télécharger le fichier complet pour plus de détails.)''


Chaque KEXT est chargé à une adresse mémoire spécifique, et le kernelcache contient également des informations sur les appels système (syscalls) et les traps Mach, qui sont essentiels pour l'interaction entre le noyau et les applications.
== Conclusion ==
Le kernelcache est un composant clé des systèmes Apple, regroupant le noyau et ses extensions dans un fichier unique. Les outils comme ''joker'', ''jtool2'' et ''ioskextdump'' permettent d'analyser ces fichiers pour extraire des informations critiques, notamment pour la recherche de vulnérabilités ou le développement. Avec l'évolution du format à partir d'iOS 12, l'analyse est devenue plus complexe en raison de la structure monolithique et de la suppression des symboles, mais des outils avancés comme ''ioskextdump'' continuent de fournir des solutions puissantes pour les chercheurs.


### Formats de conteneur
Pour plus d'informations, consultez The Apple Wiki.
 
Le kernelcache est encapsulé dans différents formats selon les versions d'iOS et le matériel :
- **8900** : Utilisé dans iPhone OS 1.0 à 1.1.4, un format simple et non chiffré.
- **IMG3** : Introduit avec iPhone OS 2.0, ce format inclut le chiffrement pour sécuriser le noyau.
- **IMG4** : Utilisé à partir des puces A7 (iPhone 5s, 2013) et sur les Apple Watches. Ce format est plus moderne et prend en charge des fonctionnalités avancées de sécurité.
 
---
 
## Analyse du kernelcache
 
Pour analyser un kernelcache, plusieurs outils spécialisés ont été développés, notamment dans le cadre de la recherche sur la sécurité et le jailbreaking.
 
### L'outil Joker
 
L'outil **joker**, développé par Jonathan Levin (disponible sur [newosxbook.com](http://newosxbook.com/)), est utilisé pour extraire des informations à partir d'un kernelcache déchiffré. Il permet :
- D'extraire les adresses des appels système et des traps Mach.
- De lister toutes les extensions du noyau (KEXTs) et leurs adresses de chargement.
- D'extraire les KEXTs individuellement (fonctionnalité appelée "Kextraction").

Latest revision as of 10:54, 16 October 2025

Kernelcache

[edit | edit source]

Le kernelcache est un fichier essentiel dans les systèmes d'exploitation d'Apple (iOS, macOS, etc.), qui regroupe le noyau lui-même ainsi que toutes ses extensions (connues sous le nom de KEXTs, pour Kernel Extensions). Ces extensions incluent des pilotes et des modules comme AppleImage3NORAccess, IOAESAccelerator, IOPKEAccelerator, etc. Ce fichier est ensuite encapsulé et, dans la plupart des cas, chiffré dans un conteneur spécifique selon la version du système :

  • IMG3 : Utilisé à partir d'iPhone OS 2.0.
  • IMG4 : Utilisé pour les appareils équipés d'une puce A7 ou plus récente, ainsi que pour les Apple Watches.
  • 8900 : Utilisé pour iPhone OS 1.0 à 1.1.4.

Analyse du Kernelcache

[edit | edit source]

L'outil joker, disponible sur http://newosxbook.com/, permet d'extraire des informations détaillées à partir d'un kernelcache déchiffré. Cet outil fournit des données précieuses telles que :

  • Les adresses des appels système (system calls) et des Mach traps dans le noyau.
  • Une liste complète des KEXTs contenus dans le kernelcache, avec leurs adresses de chargement.

Exemple de sortie pour un kernelcache iOS 6.1.3 (iPhone 4, iPhone3,1)

[edit | edit source]

Voici un extrait de la sortie générée par l'outil joker pour un kernelcache d'iOS 6.1.3, montrant 153 KEXTs :

Kext Nom Adresse Offset Fichier Identifiant
Libkern Pseudoextension 0x80396000 0xffffffff com.apple.kpi.libkern
Mach Kernel Pseudoextension 0x8039e000 0x35d000 com.apple.kpi.mach
Unsupported Pseudoextension 0x8039f000 0x35e000 com.apple.kpi.unsupported
I/O Kit Pseudoextension 0x803a1000 0x360000 com.apple.kpi.iokit
Private Pseudoextension 0x803b8000 0x377000 com.apple.kpi.private
BSD Kernel Pseudoextension 0x803bd000 0x37c000 com.apple.kpi.bsd
AppleARMPlatform 0x803c3000 0x382000 com.apple.driver.AppleARMPlatform
AppleSamsungSPI 0x803fd000 0x3bc000 com.apple.driver.AppleSamsungSPI
... ... ... ...

(Note : La liste complète contient 153 KEXTs, mais seuls quelques exemples sont présentés ici pour des raisons de concision.)

Évolution du format du Kernelcache (iOS 12 et versions ultérieures)

[edit | edit source]

À partir de l'iPhone XS/R (iPhone11) et d'iOS 12, Apple a introduit un nouveau format de kernelcache. Ce format se distingue par plusieurs caractéristiques :

  • Version LC_SOURCE_VERSION : La version indiquée est nettement inférieure à celle du noyau XNU (par exemple, 1469 pour iOS 12, 17xx pour iOS 13), probablement en raison d'une mauvaise configuration du générateur de kernelcache.
  • Structure monolithique : Les nouveaux kernelcaches sont monolithiques, avec le code des KEXTs étroitement intégré au noyau lui-même, rendant l'extraction des KEXTs plus complexe.
  • Suppression des symboles : Les symboles sont entièrement supprimés, ce qui complique l'analyse. L'outil joker ne peut plus extraire les KEXTs individuellement avec sa fonction Kextraction.

Cependant, l'outil jtool2 (successeur de joker) avec l'option --analyze permet de symboliser des milliers de symboles (entre 3 000 et 8 000 selon la version d'iOS), offrant une alternative pour l'analyse.

Analyse avancée avec ioskextdump

[edit | edit source]

L'outil ioskextdump, développé par cocoahuke, utilise le framework de désassemblage Capstone pour analyser les kernelcaches iOS. Il fournit des informations détaillées particulièrement utiles pour la recherche de vulnérabilités, notamment :

  • Nom, adresse, taille et table virtuelle (vtable) de toutes les classes de base et dérivées d'IOKit.
  • Relations d'héritage pour toutes les classes dérivées d'IOKit.
  • Adresses de toutes les fonctions et leurs positions dans la vtable.
  • Symbolisation de toutes les fonctions dans chaque classe dérivée.
  • Liste des fonctions surchargées (override) dans chaque classe dérivée.
  • Détection de la structure IOExternalMethodDispatch dans chaque classe UserClient.

Cet outil prend en charge les kernelcaches d'iOS 8 à 13 et différentes architectures (arm32, arm64, x86_64).

Exemple de sortie pour iOS 12.3 (IOHIDLibUserClient)

[edit | edit source]

Voici un extrait de la sortie générée par ioskextdump_ios10 pour un kernelcache iOS 12.3, montrant les détails de la classe IOHIDLibUserClient :

******** 1:com.apple.iokit.IOHIDFamily *******
(0xfffffff005ff7ee8)->OSMetaClass:OSMetaClass call 4 args list
x0:0xfffffff00775bb40
x1:IOHIDLibUserClient
x2:0xfffffff007668400
x3:0x150
vtable start from addr 0xfffffff006deef70
Inheritance relationship: IOUserClient->IOService->IORegistryEntry->OSObject

### Fonctions surchargées
| Fonction | Adresse | Implémentation |
|----------|---------|----------------|
| IOUserClient_IOUserClient | 0xfffffff006deef70 | 0xfffffff005ff500c |
| IOUserClient_~IOUserClient | 0xfffffff006deef78 | 0xfffffff005ff5010 |
| IOUserClient_getMetaClass | 0xfffffff006deefa8 | 0xfffffff005ff5028 |
| IOUserClient_free | 0xfffffff006deefd8 | 0xfffffff005ff63c0 |
| IORegistryEntry_setProperties | 0xfffffff006def0c8 | 0xfffffff005ff65a8 |
| IOService_didTerminate | 0xfffffff006def1d0 | 0xfffffff005ff6370 |
| IOService_start | 0xfffffff006def218 | 0xfffffff005ff5a04 |
| IOService_stop | 0xfffffff006def220 | 0xfffffff005ff5e9c |
| IOService_attach | 0xfffffff006def2c8 | 0xfffffff005ff7dac |
| IOService_message | 0xfffffff006def388 | 0xfffffff005ff64a8 |
| IOUserClient_externalMethod | 0xfffffff006def4a8 | 0xfffffff005ff60d0 |
| IOUserClient_initWithTask | 0xfffffff006def4c0 | 0xfffffff005ff585c |
| IOUserClient_clientClose | 0xfffffff006def4c8 | 0xfffffff005ff59e0 |
| IOUserClient_registerNotificationPort | 0xfffffff006def4e0 | 0xfffffff005ff65c8 |
| IOUserClient_clientMemoryForType | 0xfffffff006def4f8 | 0xfffffff005ff67a8 |

### Méthodes externes
| Index | Fonction | scalar_i | struct_i | scalar_o | struct_o |
|-------|----------|----------|----------|----------|----------|
| 0 | 0xfffffff005ff514c | 0x0 | 0x0 | 0x2 | 0x0 |
| 1 | 0xfffffff005ff5164 | 0x1 | 0x0 | 0x0 | 0x0 |
| 2 | 0xfffffff005ff5170 | 0x0 | 0x0 | 0x0 | 0x0 |
| 3 | 0xfffffff005ff5188 | 0x2 | 0x0 | 0x1 | 0x0 |
| ... | ... | ... | ... | ... | ... |

(Note : La sortie complète contient 1860 classes IOKit. Vous pouvez télécharger le fichier complet pour plus de détails.)

Conclusion

[edit | edit source]

Le kernelcache est un composant clé des systèmes Apple, regroupant le noyau et ses extensions dans un fichier unique. Les outils comme joker, jtool2 et ioskextdump permettent d'analyser ces fichiers pour extraire des informations critiques, notamment pour la recherche de vulnérabilités ou le développement. Avec l'évolution du format à partir d'iOS 12, l'analyse est devenue plus complexe en raison de la structure monolithique et de la suppression des symboles, mais des outils avancés comme ioskextdump continuent de fournir des solutions puissantes pour les chercheurs.

Pour plus d'informations, consultez The Apple Wiki.