macOS Kernel Extensions & Debugging
Reading time: 10 minutes
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Basiese Inligting
Kernel uitbreidings (Kexts) is pakkette met 'n .kext
uitbreiding wat direk in die macOS kernel ruimte gelaai word, wat bykomende funksionaliteit aan die hoofbedryfstelsel bied.
Deprecasie status & DriverKit / Stelsel Uitbreidings
Begin met macOS Catalina (10.15) het Apple die meeste ou KPIs as verouderd gemerk en die Stelsel Uitbreidings & DriverKit raamwerke bekendgestel wat in gebruikersruimte loop. Vanaf macOS Big Sur (11) sal die bedryfstelsel weier om derdeparty kexts te laai wat op verouderde KPIs staatmaak, tensy die masjien in Verminderde Sekuriteit modus geboot word. Op Apple Silicon vereis die inskakeling van kexts ook dat die gebruiker:
- Herbegin in Herstel â Opstart Sekuriteit Nutsgoed.
- Kies Verminderde Sekuriteit en merk âLaat gebruikersbestuur van kernel uitbreidings van geĂŻdentifiseerde ontwikkelaars toeâ.
- Herbegin en keur die kext goed van Stelselinstellings â Privaatheid & Sekuriteit.
Gebruikersland bestuurders wat met DriverKit/Stelsel Uitbreidings geskryf is, verlaag aansienlik die aanvaloppervlak omdat crashes of geheuebesoedeling beperk is tot 'n sandboxed proses eerder as kernel ruimte.
đ Vanaf macOS Sequoia (15) het Apple verskeie ou netwerk- en USB KPIs heeltemal verwyder â die enigste vooruit-compatibele oplossing vir verskaffers is om na Stelsel Uitbreidings te migreer.
Vereistes
Dit is duidelik dat dit so kragtig is dat dit komplikasies het om 'n kernel uitbreiding te laai. Dit is die vereistes waaraan 'n kernel uitbreiding moet voldoen om gelaai te word:
- Wanneer herstelmodus betree word, moet kernel uitbreidings toegelaat word om gelaai te word:
.png)
- Die kernel uitbreiding moet onderteken wees met 'n kernel kode ondertekeningssertifikaat, wat slegs deur Apple toegestaan kan word. Wie die maatskappy en die redes waarom dit nodig is, in detail sal hersien.
- Die kernel uitbreiding moet ook genotarieer wees, Apple sal dit vir malware kan nagaan.
- Dan is die root gebruiker die een wat die kernel uitbreiding kan laai en die lĂȘers binne die pakkie moet aan root behoort.
- Tydens die oplaadproses moet die pakkie in 'n beskermde nie-root ligging voorberei word:
/Library/StagedExtensions
(vereis diecom.apple.rootless.storage.KernelExtensionManagement
grant). - Laastens, wanneer daar probeer word om dit te laai, sal die gebruiker 'n bevestigingsversoek ontvang en, indien aanvaar, moet die rekenaar herbegin om dit te laai.
Laai proses
In Catalina was dit soos volg: Dit is interessant om op te let dat die verifikasie proses in gebruikersland plaasvind. egter, slegs toepassings met die com.apple.private.security.kext-management
grant kan die kernel vra om 'n uitbreiding te laai: kextcache
, kextload
, kextutil
, kextd
, syspolicyd
kextutil
cli begin die verifikasie proses om 'n uitbreiding te laai
- Dit sal met
kextd
praat deur 'n Mach diens te gebruik.
kextd
sal verskeie dinge nagaan, soos die handtekening
- Dit sal met
syspolicyd
praat om te kontroleer of die uitbreiding gelaai kan word.
syspolicyd
sal die gebruiker vra as die uitbreiding nie voorheen gelaai is nie.
syspolicyd
sal die resultaat aankextd
rapporteer
kextd
sal uiteindelik in staat wees om die kernel te vertel om die uitbreiding te laai
As kextd
nie beskikbaar is nie, kan kextutil
dieselfde kontroles uitvoer.
Enumerasie & bestuur (gelaaide kexts)
kextstat
was die historiese hulpmiddel, maar dit is verouderd in onlangse macOS vrystellings. Die moderne koppelvlak is kmutil
:
# List every extension currently linked in the kernel, sorted by load address
sudo kmutil showloaded --sort
# Show only third-party / auxiliary collections
sudo kmutil showloaded --collection aux
# Unload a specific bundle
sudo kmutil unload -b com.example.mykext
Oudere sintaksis is steeds beskikbaar vir verwysing:
# (Deprecated) Get loaded kernel extensions
kextstat
# (Deprecated) Get dependencies of the kext number 22
kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
kmutil inspect
kan ook gebruik word om die inhoud van 'n Kernel Collection (KC)' te dump of te verifieer dat 'n kext al die simbool afhanklikhede oplos:
# List fileset entries contained in the boot KC
kmutil inspect -B /System/Library/KernelCollections/BootKernelExtensions.kc --show-fileset-entries
# Check undefined symbols of a 3rd party kext before loading
kmutil libraries -p /Library/Extensions/FancyUSB.kext --undef-symbols
Kernelcache
caution
Alhoewel die kernel uitbreidings verwag word om in /System/Library/Extensions/
te wees, as jy na hierdie gids gaan, sal jy geen binĂȘre vind. Dit is as gevolg van die kernelcache en om een .kext
te reverse, moet jy 'n manier vind om dit te verkry.
Die kernelcache is 'n vooraf-gecompileerde en vooraf-gekoppelde weergawe van die XNU-kern, saam met noodsaaklike toestel drywers en kernel uitbreidings. Dit word in 'n gecomprimeerde formaat gestoor en word tydens die opstartproses in geheue gedecomprimeer. Die kernelcache fasiliteer 'n sneller opstarttyd deur 'n gereed-om-te-loop weergawe van die kern en belangrike drywers beskikbaar te hĂȘ, wat die tyd en hulpbronne verminder wat andersins aan die dinamiese laai en koppeling van hierdie komponente tydens opstart bestee sou word.
Plaaslike Kernelcache
In iOS is dit geleë in /System/Library/Caches/com.apple.kernelcaches/kernelcache
in macOS kan jy dit vind met: find / -name "kernelcache" 2>/dev/null
In my geval in macOS het ek dit gevind in:
/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache
IMG4
Die IMG4 lĂȘerformaat is 'n houerformaat wat deur Apple in sy iOS en macOS toestelle gebruik word om firmware komponente (soos kernelcache) veilig te stoor en te verifieer. Die IMG4 formaat sluit 'n kop en verskeie etikette in wat verskillende stukke data kapsuleer, insluitend die werklike payload (soos 'n kern of opstartlader), 'n handtekening, en 'n stel manifest eienskappe. Die formaat ondersteun kriptografiese verifikasie, wat die toestel toelaat om die egtheid en integriteit van die firmware komponent te bevestig voordat dit uitgevoer word.
Dit bestaan gewoonlik uit die volgende komponente:
- Payload (IM4P):
- Gereeld gecomprimeer (LZFSE4, LZSS, âŠ)
- Opsioneel versleuteld
- Manifest (IM4M):
- Bevat Handtekening
- Bykomende Sleutel/Waarde woordeboek
- Herstel Inligting (IM4R):
- Ook bekend as APNonce
- Voorkom die herhaling van sommige opdaterings
- OPSIONEEL: Gewoonlik word dit nie gevind nie
Decompress die 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
Laai Af
In https://github.com/dortania/KdkSupportPkg/releases is dit moontlik om al die kernel debug kits te vind. Jy kan dit aflaai, monteer, dit oopmaak met die Suspicious Package hulpmiddel, toegang verkry tot die .kext
gids en uitpak.
Kontroleer dit vir simbole met:
nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l
Soms stel Apple kernelcache met symbols vry. Jy kan sommige firmware met symbols aflaai deur die skakels op daardie bladsye te volg. Die firmware sal die kernelcache saam met ander lĂȘers bevat.
Om die lĂȘers te onttrek, begin deur die uitbreiding van .ipsw
na .zip
te verander en dit te ontzip.
Na die onttrekking van die firmware sal jy 'n lĂȘer soos: kernelcache.release.iphone14
kry. Dit is in IMG4 formaat, jy kan die interessante inligting onttrek met:
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
Inspecting kernelcache
Kontroleer of die kernelcache simbole het met
nm -a kernelcache.release.iphone14.e | wc -l
Met hierdie kan ons nou alle die uitbreidings of die een waarin jy belangstel:
# 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
Onlangs kwesbaarhede & uitbuitingstegnieke
Jaar | CVE | Samevatting |
---|---|---|
2024 | CVE-2024-44243 | Logika fout in storagekitd het 'n root aanvaller toegelaat om 'n kwaadwillige lĂȘerstelsel bundel te registreer wat uiteindelik 'n ongetekende kext gelaai het, wat die Stelselintegriteitbeskerming (SIP) omseil en volgehoue rootkits moontlik maak. Gepatch in macOS 14.2 / 15.2. |
2021 | CVE-2021-30892 (Shrootless) | Installasie daemon met die regte com.apple.rootless.install kon misbruik word om arbitrĂȘre post-installasie skripte uit te voer, SIP te deaktiveer en arbitrĂȘre kexts te laai. |
Neem-aways vir rooi-spanne
- Soek na bevoegde daemons (
codesign -dvv /path/bin | grep entitlements
) wat met Disk Arbitration, Installer of Kext Bestuur interaksie het. - Die misbruik van SIP omseilings bied byna altyd die vermoĂ« om 'n kext te laai â kernkode-uitvoering.
Verdedigende wenke
Hou SIP ingeskakel, monitor vir kmutil load
/kmutil create -n aux
aanroepings wat van nie-Apple binaries kom en waarsku oor enige skrywe na /Library/Extensions
. Eindpunt Sekuriteit gebeurtenisse ES_EVENT_TYPE_NOTIFY_KEXTLOAD
bied byna regte tydsigbaarheid.
Foutopsporing van macOS kern & kexts
Apple se aanbevole werksvloei is om 'n Kernel Debug Kit (KDK) te bou wat ooreenstem met die lopende weergawe en dan LLDB oor 'n KDP (Kernel Debugging Protocol) netwerk sessie aan te sluit.
Eenmalige plaaslike foutopsporing van 'n paniek
# Create a symbolication bundle for the latest panic
sudo kdpwrit dump latest.kcdata
kmutil analyze-panic latest.kcdata -o ~/panic_report.txt
Leef afstandsdebugin van 'n ander Mac
- Laai af + installeer die presiese KDK weergawe vir die teiken masjien.
- Koppel die teiken Mac en die gasheer Mac met 'n USB-C of Thunderbolt-kabel.
- Op die teiken:
sudo nvram boot-args="debug=0x100 kdp_match_name=macbook-target"
reboot
- Op die gasheer:
lldb
(lldb) kdp-remote "udp://macbook-target"
(lldb) bt # get backtrace in kernel context
Om LLDB aan 'n spesifieke gelaaide kext te heg
# Identify load address of the kext
ADDR=$(kmutil showloaded --bundle-identifier com.example.driver | awk '{print $4}')
# Attach
sudo lldb -n kernel_task -o "target modules load --file /Library/Extensions/Example.kext/Contents/MacOS/Example --slide $ADDR"
âčïž KDP stel slegs 'n lees-slegs koppelvlak beskikbaar. Vir dinamiese instrumentering sal jy die binĂȘre op-disk moet patch, kernel funksie hooking benut (bv.
mach_override
) of die bestuurder na 'n hypervisor migreer vir volle lees/skryf.
References
- DriverKit Sekuriteit â Apple Platform Sekuriteitsgids
- Microsoft Sekuriteitsblog â Analiseer CVE-2024-44243 SIP omseiling
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.