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
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
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 :
.png)
- 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'octroicom.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
kextutil
cli démarre le processus de vérification pour charger une extension
- Il communiquera avec
kextd
en utilisant un service Mach.
kextd
vérifiera plusieurs choses, telles que la signature
- Il communiquera avec
syspolicyd
pour vĂ©rifier si l'extension peut ĂȘtre chargĂ©e.
syspolicyd
demande à l'utilisateur si l'extension n'a pas été chargée précédemment.
syspolicyd
rapportera le rĂ©sultat Ăkextd
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)
# 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 :
# 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 :
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 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
Inspection du kernelcache
VĂ©rifiez si le kernelcache a des symboles avec
nm -a kernelcache.release.iphone14.e | wc -l
Avec cela, nous pouvons maintenant extraire toutes les extensions ou celle qui vous intéresse :
# 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
- https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/
- https://www.youtube.com/watch?v=hGKOskSiaQo
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
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.