macOS Kernel Extensions & Debugging

Reading time: 6 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Informations de base

Les extensions de noyau (Kexts) sont des paquets avec une extension .kext qui sont chargés directement dans l'espace noyau de macOS, fournissant des fonctionnalités supplémentaires au systÚme d'exploitation principal.

Exigences

Évidemment, c'est si puissant qu'il est compliquĂ© de charger une extension de noyau. Voici les exigences qu'une extension de noyau doit respecter pour ĂȘtre chargĂ©e :

  • Lors de l'entrĂ©e en mode de rĂ©cupĂ©ration, les extensions de noyau doivent ĂȘtre autorisĂ©es Ă  ĂȘtre chargĂ©es :
  • L'extension de noyau doit ĂȘtre signĂ©e avec un certificat de signature de code de noyau, qui ne peut ĂȘtre accordĂ© que par Apple. Qui examinera en dĂ©tail l'entreprise et les raisons pour lesquelles cela est nĂ©cessaire.
  • L'extension de noyau doit Ă©galement ĂȘtre notariĂ©e, Apple pourra la vĂ©rifier pour dĂ©tecter des logiciels malveillants.
  • Ensuite, l'utilisateur root est celui qui peut charger l'extension de noyau et les fichiers Ă  l'intĂ©rieur du paquet doivent appartenir Ă  root.
  • Pendant le processus de tĂ©lĂ©chargement, le paquet doit ĂȘtre prĂ©parĂ© dans un emplacement protĂ©gĂ© non-root : /Library/StagedExtensions (nĂ©cessite l'octroi com.apple.rootless.storage.KernelExtensionManagement).
  • Enfin, lors de la tentative de chargement, l'utilisateur recevra une demande de confirmation et, si acceptĂ©e, l'ordinateur doit ĂȘtre redĂ©marrĂ© pour le charger.

Processus de chargement

Dans Catalina, c'était comme ça : Il est intéressant de noter que le processus de vérification se déroule en userland. Cependant, seules les applications avec l'octroi com.apple.private.security.kext-management peuvent demander au noyau de charger une extension : kextcache, kextload, kextutil, kextd, syspolicyd

  1. kextutil cli démarre le processus de vérification pour charger une extension
  • Il communiquera avec kextd en utilisant un service Mach.
  1. kextd vérifiera plusieurs choses, telles que la signature
  • Il communiquera avec syspolicyd pour vĂ©rifier si l'extension peut ĂȘtre chargĂ©e.
  1. syspolicyd demande à l'utilisateur si l'extension n'a pas été chargée précédemment.
  • syspolicyd rapportera le rĂ©sultat Ă  kextd
  1. kextd pourra enfin dire au noyau de charger l'extension

Si kextd n'est pas disponible, kextutil peut effectuer les mĂȘmes vĂ©rifications.

ÉnumĂ©ration (kexts chargĂ©s)

bash
# Get loaded kernel extensions
kextstat

# Get dependencies of the kext number 22
kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1

Kernelcache

caution

MĂȘme si les extensions du noyau sont censĂ©es se trouver dans /System/Library/Extensions/, si vous allez dans ce dossier, vous ne trouverez aucun binaire. Cela est dĂ» au kernelcache et pour inverser un .kext, vous devez trouver un moyen de l'obtenir.

Le kernelcache est une version prĂ©-compilĂ©e et prĂ©-lien du noyau XNU, ainsi que des drivers et des extensions de noyau essentiels. Il est stockĂ© dans un format compressĂ© et est dĂ©compressĂ© en mĂ©moire pendant le processus de dĂ©marrage. Le kernelcache facilite un temps de dĂ©marrage plus rapide en ayant une version prĂȘte Ă  l'emploi du noyau et des drivers cruciaux disponibles, rĂ©duisant le temps et les ressources qui seraient autrement dĂ©pensĂ©s pour charger et lier dynamiquement ces composants au moment du dĂ©marrage.

Local Kerlnelcache

Dans iOS, il est situé dans /System/Library/Caches/com.apple.kernelcaches/kernelcache dans macOS, vous pouvez le trouver avec : find / -name "kernelcache" 2>/dev/null
Dans mon cas, dans macOS, je l'ai trouvé dans :

  • /System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache

IMG4

Le format de fichier IMG4 est un format de conteneur utilisĂ© par Apple dans ses appareils iOS et macOS pour stocker et vĂ©rifier en toute sĂ©curitĂ© les composants du firmware (comme le kernelcache). Le format IMG4 comprend un en-tĂȘte et plusieurs balises qui encapsulent diffĂ©rentes piĂšces de donnĂ©es, y compris la charge utile rĂ©elle (comme un noyau ou un chargeur de dĂ©marrage), une signature et un ensemble de propriĂ©tĂ©s de manifeste. Le format prend en charge la vĂ©rification cryptographique, permettant Ă  l'appareil de confirmer l'authenticitĂ© et l'intĂ©gritĂ© du composant du firmware avant de l'exĂ©cuter.

Il est généralement composé des composants suivants :

  • Payload (IM4P) :
  • Souvent compressĂ© (LZFSE4, LZSS, 
)
  • Optionnellement chiffrĂ©
  • Manifest (IM4M) :
  • Contient la signature
  • Dictionnaire clĂ©/valeur supplĂ©mentaire
  • Restore Info (IM4R) :
  • Également connu sous le nom d'APNonce
  • EmpĂȘche la rĂ©pĂ©tition de certaines mises Ă  jour
  • OPTIONNEL : En gĂ©nĂ©ral, cela n'est pas trouvĂ©

DĂ©compressez le Kernelcache :

bash
# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

Télécharger

Dans https://github.com/dortania/KdkSupportPkg/releases, il est possible de trouver tous les kits de débogage du noyau. Vous pouvez le télécharger, le monter, l'ouvrir avec l'outil Suspicious Package, accéder au dossier .kext et l'extraire.

VĂ©rifiez-le pour les symboles avec :

bash
nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l

Parfois, Apple publie kernelcache avec des symbols. Vous pouvez télécharger certains firmwares avec des symbols en suivant les liens sur ces pages. Les firmwares contiendront le kernelcache parmi d'autres fichiers.

Pour extract les fichiers, commencez par changer l'extension de .ipsw Ă  .zip et unzip le fichier.

AprÚs avoir extrait le firmware, vous obtiendrez un fichier comme : kernelcache.release.iphone14. Il est au format IMG4, vous pouvez extraire les informations intéressantes avec :

pyimg4:

bash
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

img4tool:

bash
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

Inspection du kernelcache

VĂ©rifiez si le kernelcache a des symboles avec

bash
nm -a kernelcache.release.iphone14.e | wc -l

Avec cela, nous pouvons maintenant extraire toutes les extensions ou celle qui vous intéresse :

bash
# List all extensions
kextex -l kernelcache.release.iphone14.e
## Extract com.apple.security.sandbox
kextex -e com.apple.security.sandbox kernelcache.release.iphone14.e

# Extract all
kextex_all kernelcache.release.iphone14.e

# Check the extension for symbols
nm -a binaries/com.apple.security.sandbox | wc -l

DĂ©bogage

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks