macOS Kernel Extensions
Basic Information
Kernel extensions (Kexts) are пакети з розширенням .kext
, які завантажуються безпосередньо в простір ядра macOS, надаючи додаткову функціональність основній операційній системі.
Requirements
Очевидно, що це настільки потужно, що завантажити розширення ядра є складним. Це вимоги, які повинні бути виконані, щоб розширення ядра могло бути завантажено:
Коли входите в режим відновлення, розширення ядра повинні бути дозволені для завантаження:
Розширення ядра повинно бути підписане сертифікатом підпису коду ядра, який може бути наданий тільки Apple. Хто детально розгляне компанію та причини, чому це потрібно.
Розширення ядра також повинно бути нотаризоване, Apple зможе перевірити його на наявність шкідливого ПЗ.
Потім, кореневий користувач є тим, хто може завантажити розширення ядра, а файли всередині пакету повинні належати кореню.
Під час процесу завантаження пакет повинен бути підготовлений у захищеному місці, що не є кореневим:
/Library/StagedExtensions
(вимагає наданняcom.apple.rootless.storage.KernelExtensionManagement
).Нарешті, при спробі завантажити його, користувач отримає запит на підтвердження і, якщо прийнято, комп'ютер повинен бути перезавантажений для його завантаження.
Loading process
У Catalina це виглядало так: Цікаво відзначити, що процес перевірки відбувається в користувацькому просторі. Однак тільки програми з наданням com.apple.private.security.kext-management
можуть запитувати у ядра завантажити розширення: kextcache
, kextload
, kextutil
, kextd
, syspolicyd
kextutil
cli починає процес перевірки для завантаження розширення
Він спілкується з
kextd
, використовуючи Mach service.
kextd
перевірить кілька речей, таких як підпис
Він спілкується з
syspolicyd
, щоб перевірити, чи може розширення бути завантаженим.
syspolicyd
запитає користувача, якщо розширення не було завантажено раніше.
syspolicyd
повідомить результатkextd
kextd
нарешті зможе сказати ядру завантажити розширення
Якщо kextd
недоступний, kextutil
може виконати ті ж перевірки.
Enumeration (loaded kexts)
Kernelcache
Навіть якщо очікується, що розширення ядра будуть у /System/Library/Extensions/
, якщо ви зайдете в цю папку, ви не знайдете жодного бінарного файлу. Це пов'язано з kernelcache, і для того, щоб зворотно інженерити один .kext
, вам потрібно знайти спосіб його отримати.
Kernelcache - це попередньо скомпільована та попередньо зв'язана версія ядра XNU, разом з основними драйверами та розширеннями ядра. Він зберігається у сжатому форматі і розпаковується в пам'яті під час процесу завантаження. Kernelcache сприяє швидшому часу завантаження, маючи готову до запуску версію ядра та важливих драйверів, що зменшує час і ресурси, які інакше витрачалися б на динамічне завантаження та зв'язування цих компонентів під час завантаження.
Local Kerlnelcache
В iOS він розташований у /System/Library/Caches/com.apple.kernelcaches/kernelcache
, в macOS ви можете знайти його за допомогою: find / -name "kernelcache" 2>/dev/null
У моєму випадку в macOS я знайшов його в:
/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache
IMG4
Формат файлу IMG4 - це контейнерний формат, який використовується Apple в її пристроях iOS та macOS для безпечного зберігання та перевірки компонентів прошивки (як-от kernelcache). Формат IMG4 включає заголовок і кілька тегів, які інкапсулюють різні частини даних, включаючи фактичний корисний навантаження (як-от ядро або завантажувач), підпис і набір властивостей маніфесту. Формат підтримує криптографічну перевірку, що дозволяє пристрою підтверджувати автентичність та цілісність компонента прошивки перед його виконанням.
Він зазвичай складається з наступних компонентів:
Payload (IM4P):
Часто стиснутий (LZFSE4, LZSS, …)
За бажанням зашифрований
Manifest (IM4M):
Містить підпис
Додатковий словник ключ/значення
Restore Info (IM4R):
Відомий також як APNonce
Запобігає повторному використанню деяких оновлень
OPTIONAL: Зазвичай це не знаходиться
Розпакуйте Kernelcache:
Завантажити
У https://github.com/dortania/KdkSupportPkg/releases можна знайти всі набори для налагодження ядра. Ви можете завантажити його, змонтувати, відкрити за допомогою інструменту Suspicious Package, отримати доступ до папки .kext
та екстрактувати його.
Перевірте його на наявність символів за допомогою:
Іноді Apple випускає kernelcache з символами. Ви можете завантажити деякі прошивки з символами, перейшовши за посиланнями на цих сторінках. Прошивки міститимуть kernelcache серед інших файлів.
Щоб витягти файли, почніть з зміни розширення з .ipsw
на .zip
і розпакуйте його.
Після витягування прошивки ви отримаєте файл на кшталт: kernelcache.release.iphone14
. Він у форматі IMG4, ви можете витягти цікаву інформацію за допомогою:
Inspecting kernelcache
Перевірте, чи має kernelcache символи з
З цим ми тепер можемо витягти всі розширення або те, яке вас цікавить:
Посилання
Last updated