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 extensions (Kexts) are пакети з розширенням .kext
, які завантажуються безпосередньо в простір ядра macOS, надаючи додаткову функціональність основній операційній системі.
Очевидно, що це настільки потужно, що завантажити розширення ядра є складним. Це вимоги, які повинно виконувати розширення ядра, щоб бути завантаженим:
Коли входите в режим відновлення, розширення ядра повинні бути дозволені для завантаження:
Розширення ядра повинно бути підписане сертифікатом підпису коду ядра, який може бути наданий лише Apple. Хто детально розгляне компанію та причини, чому це потрібно.
Розширення ядра також повинно бути нотаризоване, Apple зможе перевірити його на наявність шкідливого ПЗ.
Потім, кореневий користувач є тим, хто може завантажити розширення ядра, а файли всередині пакету повинні належати кореню.
Під час процесу завантаження пакет повинен бути підготовлений у захищеному місці, що не є кореневим: /Library/StagedExtensions
(вимагає надання com.apple.rootless.storage.KernelExtensionManagement
).
Нарешті, при спробі завантажити його, користувач отримає запит на підтвердження і, якщо прийнято, комп'ютер повинен бути перезавантажений для його завантаження.
У Catalina це виглядало так: Цікаво відзначити, що процес перевірки відбувається в userland. Однак лише програми з наданням com.apple.private.security.kext-management
можуть запитувати у ядра завантажити розширення: kextcache
, kextload
, kextutil
, kextd
, syspolicyd
kextutil
cli починає процес перевірки для завантаження розширення
Він спілкуватиметься з kextd
, використовуючи Mach service.
kextd
перевірить кілька речей, таких як підпис
Він спілкуватиметься з syspolicyd
, щоб перевірити, чи може розширення бути завантаженим.
syspolicyd
запитає користувача, якщо розширення не було завантажено раніше.
syspolicyd
повідомить результат kextd
kextd
нарешті зможе сказати ядру завантажити розширення
Якщо kextd
недоступний, kextutil
може виконати ті ж перевірки.
Навіть якщо очікується, що розширення ядра будуть у /System/Library/Extensions/
, якщо ви зайдете в цю папку, ви не знайдете жодного бінарного файлу. Це пов'язано з kernelcache, і для того, щоб зворотно інженерити один .kext
, вам потрібно знайти спосіб його отримати.
kernelcache - це попередньо скомпільована та попередньо зв'язана версія ядра XNU, разом з основними драйверами та розширеннями ядра. Він зберігається у сжатому форматі і розпаковується в пам'ять під час процесу завантаження. Kernelcache сприяє швидшому часу завантаження, маючи готову до запуску версію ядра та важливих драйверів, що зменшує час і ресурси, які інакше витрачалися б на динамічне завантаження та зв'язування цих компонентів під час завантаження.
В 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 - це контейнерний формат, який використовується 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, ви можете витягти цікаву інформацію за допомогою:
Перевірте, чи має kernelcache символи з
З цим ми тепер можемо витягти всі розширення або те, яке вас цікавить:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)