macOS Kernel Extensions & Debugging
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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.
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 przyznania com.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ć.
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 do kextd
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.
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.
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.
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
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:
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ą:
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ą:
Sprawdź, czy kernelcache ma symbole z
Z tym możemy teraz wyodrębnić wszystkie rozszerzenia lub to, które Cię interesuje:
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)