macOS Kernel Extensions

Support HackTricks

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

  1. kextutil cli починає процес перевірки для завантаження розширення

  • Він спілкується з kextd, використовуючи Mach service.

  1. kextd перевірить кілька речей, таких як підпис

  • Він спілкується з syspolicyd, щоб перевірити, чи може розширення бути завантаженим.

  1. syspolicyd запитає користувача, якщо розширення не було завантажено раніше.

  • syspolicyd повідомить результат kextd

  1. kextd нарешті зможе сказати ядру завантажити розширення

Якщо kextd недоступний, kextutil може виконати ті ж перевірки.

Enumeration (loaded kexts)

# Get loaded kernel extensions
kextstat

# Get dependencies of the kext number 22
kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1

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:

# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

Завантажити

У https://github.com/dortania/KdkSupportPkg/releases можна знайти всі набори для налагодження ядра. Ви можете завантажити його, змонтувати, відкрити за допомогою інструменту Suspicious Package, отримати доступ до папки .kext та екстрактувати його.

Перевірте його на наявність символів за допомогою:

nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l

Іноді Apple випускає kernelcache з символами. Ви можете завантажити деякі прошивки з символами, перейшовши за посиланнями на цих сторінках. Прошивки міститимуть kernelcache серед інших файлів.

Щоб витягти файли, почніть з зміни розширення з .ipsw на .zip і розпакуйте його.

Після витягування прошивки ви отримаєте файл на кшталт: kernelcache.release.iphone14. Він у форматі IMG4, ви можете витягти цікаву інформацію за допомогою:

pyimg4:

pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

img4tool:

img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

Inspecting kernelcache

Перевірте, чи має kernelcache символи з

nm -a kernelcache.release.iphone14.e | wc -l

З цим ми тепер можемо витягти всі розширення або те, яке вас цікавить:

# List all extensions
kextex -l kernelcache.release.iphone14.e
## Extract com.apple.security.sandbox
kextex -e com.apple.security.sandbox kernelcache.release.iphone14.e

# Extract all
kextex_all kernelcache.release.iphone14.e

# Check the extension for symbols
nm -a binaries/com.apple.security.sandbox | wc -l

Посилання

Підтримайте HackTricks

Last updated