macOS Kernel Extensions
Basic Information
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.
Requirements
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 podpisywania 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ż notaryzowane, 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ć.
Loading process
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.
Enumeration (loaded kexts)
Kernelcache
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.
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
Dekompresuj Kernelcache:
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ą:
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ą:
Inspecting kernelcache
Sprawdź, czy kernelcache ma symbole z
Z tym możemy teraz wyodrębnić wszystkie rozszerzenia lub to, które Cię interesuje:
Referencje
Last updated