macOS Kernel & System Extensions

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Ядро XNU

Основа macOS - це XNU, що означає "X не є Unix". Це ядро фундаментально складається з мікроядра Mach (про яке буде розповідь пізніше), та елементів з Berkeley Software Distribution (BSD). XNU також надає платформу для ядерних драйверів через систему, що називається I/O Kit. Ядро XNU є частиною проекту з відкритим кодом Darwin, що означає, що його вихідний код доступний безкоштовно.

З погляду дослідника з безпеки або розробника Unix, macOS може виглядати досить схожим на систему FreeBSD з елегантним графічним інтерфейсом та низкою власних додатків. Більшість додатків, розроблених для BSD, будуть компілюватися та працювати на macOS без необхідності внесення змін, оскільки командні інструменти, знайомі користувачам Unix, присутні в macOS. Однак, через те, що ядро XNU включає Mach, існують деякі значні відмінності між традиційною системою, схожою на Unix, та macOS, і ці відмінності можуть викликати потенційні проблеми або надавати унікальні переваги.

Відкрита версія XNU: https://opensource.apple.com/source/xnu/

Mach

Mach - це мікроядро, призначене бути сумісним з UNIX. Одним з його ключових принципів дизайну було мінімізування кількості коду, що виконується в просторі ядра, і натомість дозволяти багатьом типовим функціям ядра, таким як файлова система, мережа та введення/виведення, виконуватися як завдання на рівні користувача.

У XNU Mach відповідає за багато критичних операцій на низькому рівні, які зазвичай обробляє ядро, такі як планування процесора, багатозадачність та управління віртуальною пам'яттю.

BSD

Ядро XNU також включає значну кількість коду, походящого з проекту FreeBSD. Цей код виконується як частина ядра разом з Mach, в тому ж адресному просторі. Однак код FreeBSD в XNU може суттєво відрізнятися від оригінального коду FreeBSD через необхідні модифікації для забезпечення його сумісності з Mach. FreeBSD сприяє багатьом операціям ядра, включаючи:

  • Управління процесами

  • Обробка сигналів

  • Основні механізми безпеки, включаючи управління користувачами та групами

  • Інфраструктура системних викликів

  • TCP/IP стек та сокети

  • Брандмауер та фільтрація пакетів

Розуміння взаємодії між BSD та Mach може бути складним через їх різні концептуальні каркаси. Наприклад, BSD використовує процеси як свою фундаментальну одиницю виконання, тоді як Mach працює на основі потоків. Ця розбіжність узгоджується в XNU шляхом асоціювання кожного процесу BSD з завданням Mach, яке містить рівно один потік Mach. Коли використовується системний виклик fork() BSD, код BSD в ядрі використовує функції Mach для створення структури завдання та потоку.

Більше того, Mach та BSD кожен мають власні моделі безпеки: модель безпеки Mach базується на правах портів, тоді як модель безпеки BSD працює на основі власності процесу. Розбіжності між цими двома моделями іноді призводили до вразливостей локального підвищення привілеїв. Окрім типових системних викликів, також існують пастки Mach, які дозволяють програмам простору користувача взаємодіяти з ядром. Ці різні елементи разом формують багатогранну, гібридну архітектуру ядра macOS.

I/O Kit - Драйвери

I/O Kit - це відкритий, об'єктно-орієнтований фреймворк драйверів пристроїв в ядрі XNU, який обробляє динамічно завантажені драйвери пристроїв. Він дозволяє додавати модульний код до ядра на льоту, підтримуючи різноманітне обладнання.

pagemacOS IOKit

IPC - Міжпроцесова Комунікація

pagemacOS IPC - Inter Process Communication

Kernelcache

Kernelcache - це попередньо скомпільована та попередньо зв'язана версія ядра XNU, разом з основними драйверами пристроїв та розширеннями ядра. Він зберігається у стиснутому форматі та розпаковується в пам'ять під час процесу завантаження. Kernelcache сприяє швидшому часу завантаження за рахунок наявності готової до запуску версії ядра та важливих драйверів, що дозволяє зменшити час та ресурси, які інакше б витрачалися на динамічне завантаження та зв'язування цих компонентів під час завантаження.

У iOS він розташований у /System/Library/Caches/com.apple.kernelcaches/kernelcache, у macOS ви можете знайти його за допомогою find / -name kernelcache 2>/dev/null або mdfind kernelcache | grep kernelcache

Можливо виконати kextstat для перевірки завантажених розширень ядра.

IMG4

Формат файлу IMG4 - це контейнерний формат, який використовується Apple у своїх пристроях iOS та macOS для безпечного зберігання та перевірки компонентів прошивки (наприклад, kernelcache). Формат IMG4 включає заголовок та кілька тегів, які упаковують різні частини даних, включаючи фактичний навантаження (наприклад, ядро або завантажувач), підпис, та набір властивостей маніфесту. Формат підтримує криптографічну перевірку, що дозволяє пристрою підтвердити автентичність та цілісність компонента прошивки перед його виконанням.

Зазвичай складається з наступних компонентів:

  • Навантаження (IM4P):

  • Часто стиснене (LZFSE4, LZSS, ...)

  • Опціонально зашифроване

  • Маніфест (IM4M):

  • Містить підпис

  • Додатковий словник Ключ/Значення

  • Інформація про відновлення (IM4R):

  • Також відомий як APNonce

  • Запобігає повторному відтворенню деяких оновлень

  • ОПЦІЙНО: Зазвичай цього не знаходять

Розпакуйте Kernelcache:

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

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

Символи ядра

Іноді Apple випускає ядро кешу з символами. Ви можете завантажити деякі прошивки з символами, перейшовши за посиланням на https://theapplewiki.com.

IPSW

Це прошивки Apple, які можна завантажити з https://ipsw.me/. Серед інших файлів вони містять ядро кешу. Для вилучення файлів ви можете просто їх розпакувати.

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

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

Ви можете перевірити витягнутий ядро для символів за допомогою: 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

Розширення ядра macOS

macOS дуже обмежує завантаження розширень ядра (.kext) через високі привілеї, з якими цей код буде виконуватися. Фактично, за замовчуванням це практично неможливо (якщо не знайдено обхід).

pagemacOS Kernel Extensions

Розширення системи macOS

Замість використання Розширень ядра macOS створила Розширення системи, які надають API рівня користувача для взаємодії з ядром. Таким чином, розробники можуть уникнути використання розширень ядра.

pagemacOS System Extensions

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated