10 KiB
macOS Kernel Extensions & Debugging
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Podstawowe informacje
Rozszerzenia jądra (Kexts) to pakiety z rozszerzeniem .kext
, które są ładowane bezpośrednio do przestrzeni jądra macOS, zapewniając dodatkową funkcjonalność głównemu systemowi operacyjnemu.
Wymagania
Oczywiście, jest to tak potężne, że załadowanie rozszerzenia jądra jest skomplikowane. Oto wymagania, które musi spełniać rozszerzenie jądra, aby mogło być załadowane:
- Podczas wejścia w tryb odzyskiwania, rozszerzenia jądra muszą być dozwolone do załadowania:
- Rozszerzenie jądra musi być podpisane certyfikatem podpisu kodu jądra, który może być przyznany tylko przez Apple. Kto dokładnie przeanalizuje firmę i powody, dla których jest to potrzebne.
- Rozszerzenie jądra musi być również notyfikowane, Apple będzie mogło sprawdzić je pod kątem złośliwego oprogramowania.
- Następnie, użytkownik root jest tym, który może załadować rozszerzenie jądra, a pliki wewnątrz pakietu muszą należeć do roota.
- Podczas procesu ładowania, pakiet musi być przygotowany w chronionej lokalizacji nie-root:
/Library/StagedExtensions
(wymaga przyznaniacom.apple.rootless.storage.KernelExtensionManagement
). - Na koniec, podczas próby załadowania, użytkownik otrzyma prośbę o potwierdzenie i, jeśli zostanie zaakceptowana, komputer musi być uruchomiony ponownie, aby go załadować.
Proces ładowania
W Catalina wyglądało to tak: Interesujące jest to, że proces weryfikacji zachodzi w userland. Jednak tylko aplikacje z przyznaniem com.apple.private.security.kext-management
mogą zażądać od jądra załadowania rozszerzenia: kextcache
, kextload
, kextutil
, kextd
, syspolicyd
kextutil
cli rozpoczyna proces weryfikacji ładowania rozszerzenia
- Będzie komunikować się z
kextd
za pomocą usługi Mach.
kextd
sprawdzi kilka rzeczy, takich jak podpis
- Będzie komunikować się z
syspolicyd
, aby sprawdzić, czy rozszerzenie może być załadowane.
syspolicyd
poprosi użytkownika, jeśli rozszerzenie nie zostało wcześniej załadowane.
syspolicyd
przekaże wynik dokextd
kextd
w końcu będzie mógł powiedzieć jądru, aby załadowało rozszerzenie
Jeśli kextd
nie jest dostępny, kextutil
może przeprowadzić te same kontrole.
Enumeracja (załadowane kexty)
# Get loaded kernel extensions
kextstat
# Get dependencies of the kext number 22
kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
Kernelcache
{% hint style="danger" %}
Chociaż rozszerzenia jądra powinny znajdować się w /System/Library/Extensions/
, jeśli przejdziesz do tego folderu, nie znajdziesz żadnego pliku binarnego. Dzieje się tak z powodu kernelcache i aby odwrócić jeden .kext
, musisz znaleźć sposób na jego uzyskanie.
{% endhint %}
Kernelcache to wstępnie skompilowana i wstępnie połączona wersja jądra XNU, wraz z niezbędnymi sterownikami i rozszerzeniami jądra. Jest przechowywana w skompresowanym formacie i dekompresowana do pamięci podczas procesu uruchamiania. Kernelcache ułatwia szybszy czas uruchamiania, mając gotową do uruchomienia wersję jądra i kluczowych sterowników, co zmniejsza czas i zasoby, które w przeciwnym razie byłyby wydawane na dynamiczne ładowanie i łączenie tych komponentów w czasie uruchamiania.
Lokalny Kernelcache
W iOS znajduje się w /System/Library/Caches/com.apple.kernelcaches/kernelcache
, w macOS możesz go znaleźć za pomocą: find / -name "kernelcache" 2>/dev/null
W moim przypadku w macOS znalazłem go w:
/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache
IMG4
Format pliku IMG4 to format kontenerowy używany przez Apple w urządzeniach iOS i macOS do bezpiecznego przechowywania i weryfikowania komponentów oprogramowania układowego (takich jak kernelcache). Format IMG4 zawiera nagłówek i kilka tagów, które kapsułkują różne fragmenty danych, w tym rzeczywisty ładunek (tak jak jądro lub bootloader), podpis oraz zestaw właściwości manifestu. Format wspiera weryfikację kryptograficzną, pozwalając urządzeniu potwierdzić autentyczność i integralność komponentu oprogramowania układowego przed jego wykonaniem.
Zwykle składa się z następujących komponentów:
- Payload (IM4P):
- Często skompresowany (LZFSE4, LZSS, …)
- Opcjonalnie szyfrowany
- Manifest (IM4M):
- Zawiera podpis
- Dodatkowy słownik klucz/wartość
- Restore Info (IM4R):
- Znany również jako APNonce
- Zapobiega powtarzaniu niektórych aktualizacji
- OPCJONALNE: Zwykle nie jest to znalezione
Dekomprymuj 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
Pobierz
W https://github.com/dortania/KdkSupportPkg/releases można znaleźć wszystkie zestawy debugowania jądra. Możesz je pobrać, zamontować, otworzyć za pomocą narzędzia Suspicious Package, uzyskać dostęp do folderu .kext
i wyodrębnić go.
Sprawdź go pod kątem symboli za pomocą:
nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l
Czasami Apple wydaje kernelcache z symbolami. Możesz pobrać niektóre firmware z symbolami, korzystając z linków na tych stronach. Firmware będzie zawierać kernelcache oraz inne pliki.
Aby wyodrębnić pliki, zacznij od zmiany rozszerzenia z .ipsw
na .zip
i rozpakuj je.
Po wyodrębnieniu firmware otrzymasz plik o nazwie: kernelcache.release.iphone14
. Jest w formacie IMG4, możesz wyodrębnić interesujące informacje za pomocą:
{% code overflow="wrap" %}
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
{% endcode %}
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
Inspecting kernelcache
Sprawdź, czy kernelcache ma symbole z
nm -a kernelcache.release.iphone14.e | wc -l
Z tym możemy teraz wyodrębnić wszystkie rozszerzenia lub to, które Cię interesuje:
# 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
Debugging
Referencje
- https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/
- https://www.youtube.com/watch?v=hGKOskSiaQo
{% hint style="success" %}
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.