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)
Kernel uzantıları (Kexts), macOS çekirdek alanına doğrudan yüklenen ve ana işletim sistemine ek işlevsellik sağlayan .kext
uzantısına sahip paketlerdir.
Açıkça, bu kadar güçlü olduğu için bir kernel uzantısını yüklemek karmaşıktır. Bir kernel uzantısının yüklenebilmesi için karşılaması gereken gereksinimler şunlardır:
Kurtarma moduna girerken, kernel uzantılarının yüklenmesine izin verilmelidir:
Kernel uzantısı, yalnızca Apple tarafından verilebilen bir kernel kod imzalama sertifikası ile imzalanmış olmalıdır. Şirketin detaylı bir şekilde gözden geçireceği ve neden gerektiği.
Kernel uzantısı ayrıca notarize edilmelidir, Apple bunu kötü amaçlı yazılım için kontrol edebilecektir.
Ardından, root kullanıcısı kernel uzantısını yükleyebilen kişidir ve paket içindeki dosyalar root'a ait olmalıdır.
Yükleme sürecinde, paket korumalı bir kök olmayan konumda hazırlanmalıdır: /Library/StagedExtensions
(bu, com.apple.rootless.storage.KernelExtensionManagement
iznini gerektirir).
Son olarak, yüklemeye çalışırken, kullanıcı bir onay isteği alacaktır ve kabul edilirse, bilgisayar yeniden başlatılmalıdır.
Catalina'da böyleydi: Doğrulama sürecinin kullanıcı alanında gerçekleştiğini belirtmek ilginçtir. Ancak, yalnızca com.apple.private.security.kext-management
iznine sahip uygulamalar kernel'den bir uzantıyı yüklemesini isteyebilir: kextcache
, kextload
, kextutil
, kextd
, syspolicyd
kextutil
cli bir uzantıyı yüklemek için doğrulama sürecini başlatır
kextd
ile bir Mach servisi kullanarak iletişim kuracaktır.
kextd
birkaç şeyi kontrol edecektir, örneğin imzayı
Uzantının yüklenip yüklenemeyeceğini kontrol etmek için syspolicyd
ile iletişim kuracaktır.
syspolicyd
, uzantı daha önce yüklenmemişse kullanıcıya soracaktır.
syspolicyd
, sonucu kextd
'ye bildirecektir.
kextd
nihayetinde kernel'e uzantıyı yüklemesini söyleyebilecektir.
Eğer kextd
mevcut değilse, kextutil
aynı kontrolleri gerçekleştirebilir.
Kernel uzantılarının /System/Library/Extensions/
içinde bulunması beklenmesine rağmen, bu klasöre giderseniz hiçbir ikili dosya bulamayacaksınız. Bunun nedeni kernelcache'dir ve bir .kext
dosyasını tersine mühendislik yapmak için onu elde etmenin bir yolunu bulmanız gerekir.
Kernelcache, XNU çekirdeğinin önceden derlenmiş ve önceden bağlantılı bir versiyonu ile birlikte temel cihaz sürücüleri ve kernel uzantıları içerir. Sıkıştırılmış bir formatta depolanır ve önyükleme süreci sırasında belleğe açılır. Kernelcache, çekirdeğin ve kritik sürücülerin çalışmaya hazır bir versiyonunu bulundurarak daha hızlı bir önyükleme süresi sağlar; bu, bu bileşenlerin dinamik olarak yüklenmesi ve bağlantı kurulması için harcanacak zaman ve kaynakları azaltır.
iOS'ta /System/Library/Caches/com.apple.kernelcaches/kernelcache
içinde bulunur, macOS'ta ise şu komutla bulabilirsiniz: find / -name "kernelcache" 2>/dev/null
Benim durumumda macOS'ta şurada buldum:
/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache
IMG4 dosya formatı, Apple tarafından iOS ve macOS cihazlarında firmware bileşenlerini güvenli bir şekilde saklamak ve doğrulamak için kullanılan bir konteyner formatıdır (örneğin kernelcache). IMG4 formatı, gerçek yük (örneğin bir çekirdek veya önyükleyici), bir imza ve bir dizi manifest özelliklerini kapsayan başlık ve çeşitli etiketler içerir. Format, cihazın firmware bileşeninin özgünlüğünü ve bütünlüğünü doğrulamasına olanak tanıyan kriptografik doğrulamayı destekler.
Genellikle aşağıdaki bileşenlerden oluşur:
Payload (IM4P):
Genellikle sıkıştırılmıştır (LZFSE4, LZSS, …)
İsteğe bağlı olarak şifrelenmiş
Manifest (IM4M):
İmza içerir
Ek Anahtar/Değer sözlüğü
Restore Info (IM4R):
APNonce olarak da bilinir
Bazı güncellemelerin tekrar oynatılmasını önler
İSTEĞE BAĞLI: Genellikle bulunmaz
Kernelcache'i açın:
https://github.com/dortania/KdkSupportPkg/releases adresinde tüm kernel hata ayıklama kitlerini bulmak mümkündür. Bunu indirebilir, bağlayabilir, Suspicious Package aracıyla açabilir, .kext
klasörüne erişebilir ve çıkarabilirsiniz.
Semboller için kontrol edin:
Bazen Apple kernelcache ile semboller yayınlar. Bu sayfalardaki bağlantıları takip ederek sembollü bazı firmware'leri indirebilirsiniz. Firmware'ler diğer dosyaların yanı sıra kernelcache içerecektir.
Dosyaları çıkarmak için uzantıyı .ipsw
'den .zip
'e değiştirin ve açın.
Firmware'i çıkardıktan sonra kernelcache.release.iphone14
gibi bir dosya elde edeceksiniz. Bu IMG4 formatındadır, ilginç bilgileri çıkarmak için:
Kernelcache'in sembollerinin olup olmadığını kontrol et
Bununla artık tüm uzantıları veya ilginizi çeken uzantıyı çıkarabiliriz:
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)