KernelCache: Difference between revisions
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 = | |||
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 == | |||
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. | |||
=== 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.)'' | |||
== Évolution du format du Kernelcache (iOS 12 et versions ultérieures) == | |||
À 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 <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 : | |||
* 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) === | |||
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''' : | |||
<code>******** 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 | | |||
| ... | ... | ... | ... | ... | ... |</code> | |||
''(Note : La sortie complète contient 1860 classes IOKit. Vous pouvez télécharger le fichier complet pour plus de détails.)'' | |||
== 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. | |||
Pour plus d'informations, consultez The Apple Wiki. | |||
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.