KernelCache

From The French Apple Wiki
Revision as of 10:54, 16 October 2025 by Mxt (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

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.