# macOS SIP {{#include ../../../banners/hacktricks-training.md}} ## **Основна інформація** **Захист цілісності системи (SIP)** в macOS є механізмом, призначеним для запобігання навіть найбільш привілейованим користувачам від внесення несанкціонованих змін до ключових системних папок. Ця функція відіграє важливу роль у підтримці цілісності системи, обмежуючи дії, такі як додавання, модифікація або видалення файлів у захищених зонах. Основні папки, захищені SIP, включають: - **/System** - **/bin** - **/sbin** - **/usr** Правила, які регулюють поведінку SIP, визначені в конфігураційному файлі, розташованому за адресою **`/System/Library/Sandbox/rootless.conf`**. У цьому файлі шляхи, які починаються з зірочки (\*), позначаються як винятки з інакше суворих обмежень SIP. Розгляньте наведену нижче ілюстрацію: ```javascript /usr * /usr/libexec/cups * /usr/local * /usr/share/man ``` Цей фрагмент вказує на те, що хоча SIP зазвичай захищає директорію **`/usr`**, є специфічні підкаталоги (`/usr/libexec/cups`, `/usr/local` та `/usr/share/man`), де зміни дозволені, як вказано зірочкою (\*) перед їхніми шляхами. Щоб перевірити, чи директорія або файл захищені SIP, ви можете використовувати команду **`ls -lOd`**, щоб перевірити наявність прапора **`restricted`** або **`sunlnk`**. Наприклад: ```bash ls -lOd /usr/libexec/cups drwxr-xr-x 11 root wheel sunlnk 352 May 13 00:29 /usr/libexec/cups ``` У цьому випадку прапорець **`sunlnk`** означає, що каталог `/usr/libexec/cups` **не може бути видалений**, хоча файли в ньому можуть бути створені, змінені або видалені. З іншого боку: ```bash ls -lOd /usr/libexec drwxr-xr-x 338 root wheel restricted 10816 May 13 00:29 /usr/libexec ``` Тут **`restricted`** прапорець вказує на те, що директорія `/usr/libexec` захищена SIP. У директорії, захищеній SIP, файли не можуть бути створені, змінені або видалені. Більше того, якщо файл містить атрибут **`com.apple.rootless`** розширений **атрибут**, цей файл також буде **захищений SIP**. > [!TIP] > Зверніть увагу, що **Sandbox** хук **`hook_vnode_check_setextattr`** запобігає будь-яким спробам змінити розширений атрибут **`com.apple.rootless`.** **SIP також обмежує інші дії root**, такі як: - Завантаження ненадійних розширень ядра - Отримання task-ports для процесів, підписаних Apple - Зміна змінних NVRAM - Дозвіл на налагодження ядра Опції зберігаються в змінній nvram як бітовий прапорець (`csr-active-config` на Intel і `lp-sip0` читається з завантаженого Device Tree для ARM). Ви можете знайти прапорці в вихідному коді XNU в `csr.sh`:
### Статус SIP Ви можете перевірити, чи увімкнено SIP на вашій системі, за допомогою наступної команди: ```bash csrutil status ``` Якщо вам потрібно вимкнути SIP, ви повинні перезавантажити комп'ютер у режимі відновлення (натискаючи Command+R під час запуску), а потім виконати наступну команду: ```bash csrutil disable ``` Якщо ви хочете зберегти SIP увімкненим, але видалити захисти від налагодження, ви можете зробити це за допомогою: ```bash csrutil enable --without debug ``` ### Інші обмеження - **Забороняє завантаження непідписаних розширень ядра** (kexts), забезпечуючи, що лише перевірені розширення взаємодіють з ядром системи. - **Запобігає налагодженню** процесів системи macOS, захищаючи основні компоненти системи від несанкціонованого доступу та модифікації. - **Гальмує інструменти** на кшталт dtrace від перевірки системних процесів, ще більше захищаючи цілісність роботи системи. [**Дізнайтеся більше про інформацію SIP у цій доповіді**](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)**.** ### **Права, пов'язані з SIP** - `com.apple.rootless.xpc.bootstrap`: Контроль launchd - `com.apple.rootless.install[.heritable]`: Доступ до файлової системи - `com.apple.rootless.kext-management`: `kext_request` - `com.apple.rootless.datavault.controller`: Керування UF_DATAVAULT - `com.apple.rootless.xpc.bootstrap`: Можливості налаштування XPC - `com.apple.rootless.xpc.effective-root`: Root через launchd XPC - `com.apple.rootless.restricted-block-devices`: Доступ до сирих блочних пристроїв - `com.apple.rootless.internal.installer-equivalent`: Безперешкодний доступ до файлової системи - `com.apple.rootless.restricted-nvram-variables[.heritable]`: Повний доступ до NVRAM - `com.apple.rootless.storage.label`: Модифікувати файли, обмежені com.apple.rootless xattr з відповідною міткою - `com.apple.rootless.volume.VM.label`: Підтримувати обмін VM на томі ## Обхід SIP Обхід SIP дозволяє зловмиснику: - **Доступ до даних користувача**: Читати чутливі дані користувача, такі як електронна пошта, повідомлення та історія Safari з усіх облікових записів користувачів. - **Обхід TCC**: Прямо маніпулювати базою даних TCC (Прозорість, Згода та Контроль), щоб надати несанкціонований доступ до веб-камери, мікрофона та інших ресурсів. - **Встановити постійність**: Розмістити шкідливе ПЗ в захищених SIP місцях, роблячи його стійким до видалення, навіть з правами root. Це також включає можливість втручання в Інструмент видалення шкідливого ПЗ (MRT). - **Завантажувати розширення ядра**: Хоча є додаткові запобіжники, обхід SIP спрощує процес завантаження непідписаних розширень ядра. ### Пакети установника **Пакети установника, підписані сертифікатом Apple**, можуть обійти його захист. Це означає, що навіть пакети, підписані стандартними розробниками, будуть заблоковані, якщо вони намагатимуться змінити каталоги, захищені SIP. ### Невідомий файл SIP Однією з потенційних лазівок є те, що якщо файл вказано в **`rootless.conf`, але він наразі не існує**, його можна створити. Шкідливе ПЗ може скористатися цим, щоб **встановити постійність** в системі. Наприклад, шкідлива програма може створити файл .plist у `/System/Library/LaunchDaemons`, якщо він вказаний у `rootless.conf`, але не присутній. ### com.apple.rootless.install.heritable > [!CAUTION] > Права **`com.apple.rootless.install.heritable`** дозволяють обійти SIP #### [CVE-2019-8561](https://objective-see.org/blog/blog_0x42.html) Було виявлено, що можливо **поміняти пакет установника після того, як система перевірила його код** підпису, а потім система встановлювала шкідливий пакет замість оригінального. Оскільки ці дії виконувалися **`system_installd`**, це дозволяло обійти SIP. #### [CVE-2020–9854](https://objective-see.org/blog/blog_0x4D.html) Якщо пакет було встановлено з підключеного образу або зовнішнього диска, **установник** **виконував** двійковий файл з **цієї файлової системи** (замість захищеного місця SIP), змушуючи **`system_installd`** виконувати довільний двійковий файл. #### CVE-2021-30892 - Shrootless [**Дослідники з цього блогу**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) виявили вразливість у механізмі захисту цілісності системи (SIP) macOS, відому як вразливість 'Shrootless'. Ця вразливість зосереджена навколо демона **`system_installd`**, який має право **`com.apple.rootless.install.heritable`**, що дозволяє будь-якому з його дочірніх процесів обійти обмеження файлової системи SIP. Демон **`system_installd`** буде встановлювати пакети, які були підписані **Apple**. Дослідники виявили, що під час установки пакета, підписаного Apple (.pkg файл), **`system_installd`** **виконує** будь-які **скрипти після установки**, включені в пакет. Ці скрипти виконуються за допомогою стандартної оболонки, **`zsh`**, яка автоматично **виконує** команди з файлу **`/etc/zshenv`**, якщо він існує, навіть у неінтерактивному режимі. Цю поведінку можна використати зловмисниками: створивши шкідливий файл `/etc/zshenv` і чекаючи, поки **`system_installd` викличе `zsh`**, вони можуть виконувати довільні операції на пристрої. Більше того, було виявлено, що **`/etc/zshenv` може використовуватися як загальна техніка атаки**, а не лише для обходу SIP. Кожен профіль користувача має файл `~/.zshenv`, який поводиться так само, як `/etc/zshenv`, але не вимагає прав root. Цей файл може використовуватися як механізм постійності, спрацьовуючи щоразу, коли запускається `zsh`, або як механізм підвищення привілеїв. Якщо адміністратор підвищує привілеї до root, використовуючи `sudo -s` або `sudo `, файл `~/.zshenv` буде спрацьовувати, ефективно підвищуючи привілеї до root. #### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) У [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) було виявлено, що той же процес **`system_installd`** все ще можна зловживати, оскільки він поміщав **скрипт після установки в папку з випадковою назвою, захищену SIP у `/tmp`**. Справа в тому, що **`/tmp` сам по собі не захищений SIP**, тому було можливо **підключити** **віртуальний образ до нього**, потім **установник** помістив би туди **скрипт після установки**, **відмонтував** віртуальний образ, **відтворив** усі **папки** та **додав** **скрипт після установки** з **payload** для виконання. #### [fsck_cs utility](https://www.theregister.com/2016/03/30/apple_os_x_rootless/) Виявлено вразливість, при якій **`fsck_cs`** був введений в оману, що призвело до пошкодження важливого файлу, через його здатність слідувати **символічним посиланням**. Зокрема, зловмисники створили посилання з _`/dev/diskX`_ на файл `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist`. Виконання **`fsck_cs`** на _`/dev/diskX`_ призвело до пошкодження `Info.plist`. Цілісність цього файлу є важливою для SIP (Системи захисту цілісності), яка контролює завантаження розширень ядра. Після пошкодження здатність SIP керувати виключеннями ядра порушується. Команди для використання цієї вразливості такі: ```bash ln -s /System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist /dev/diskX fsck_cs /dev/diskX 1>&- touch /Library/Extensions/ reboot ``` Використання цієї вразливості має серйозні наслідки. Файл `Info.plist`, який зазвичай відповідає за управління дозволами для розширень ядра, стає неефективним. Це включає неможливість занести певні розширення, такі як `AppleHWAccess.kext`, до чорного списку. Внаслідок цього, з механізмом контролю SIP, що не працює, це розширення може бути завантажене, надаючи несанкціонований доступ на читання та запис до оперативної пам'яті системи. #### [Mount over SIP protected folders](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship) Було можливим змонтувати нову файлову систему над **SIP захищеними папками, щоб обійти захист**. ```bash mkdir evil # Add contento to the folder hdiutil create -srcfolder evil evil.dmg hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg ``` #### [Upgrader bypass (2016)](https://objective-see.org/blog/blog_0x14.html) Система налаштована на завантаження з вбудованого образу диска установника в `Install macOS Sierra.app` для оновлення ОС, використовуючи утиліту `bless`. Використовується наступна команда: ```bash /usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer ``` Безпека цього процесу може бути скомпрометована, якщо зловмисник змінить образ оновлення (`InstallESD.dmg`) перед завантаженням. Стратегія полягає в заміні динамічного завантажувача (dyld) на шкідливу версію (`libBaseIA.dylib`). Ця заміна призводить до виконання коду зловмисника, коли ініціюється інсталятор. Код зловмисника отримує контроль під час процесу оновлення, експлуатуючи довіру системи до інсталятора. Атака продовжується шляхом зміни образу `InstallESD.dmg` за допомогою методу swizzling, особливо націлюючись на метод `extractBootBits`. Це дозволяє інжектувати шкідливий код перед використанням образу диска. Більше того, в `InstallESD.dmg` є `BaseSystem.dmg`, який слугує кореневою файловою системою коду оновлення. Інжекція динамічної бібліотеки в цей файл дозволяє шкідливому коду працювати в процесі, здатному змінювати файли на рівні ОС, що значно підвищує потенціал для компрометації системи. #### [systemmigrationd (2023)](https://www.youtube.com/watch?v=zxZesAN-TEk) У цій доповіді з [**DEF CON 31**](https://www.youtube.com/watch?v=zxZesAN-TEk) показано, як **`systemmigrationd`** (який може обійти SIP) виконує **bash** та **perl** скрипти, які можуть бути зловживані через змінні середовища **`BASH_ENV`** та **`PERL5OPT`**. #### CVE-2023-42860 Як [**детально описано в цьому блозі**](https://blog.kandji.io/apple-mitigates-vulnerabilities-installer-scripts), скрипт `postinstall` з пакетів `InstallAssistant.pkg` дозволяв виконання: ```bash /usr/bin/chflags -h norestricted "${SHARED_SUPPORT_PATH}/SharedSupport.dmg" ``` і було можливим створити символічне посилання в `${SHARED_SUPPORT_PATH}/SharedSupport.dmg`, яке дозволяло б користувачу **обійти обмеження на будь-який файл, ігноруючи захист SIP**. ### **com.apple.rootless.install** > [!CAUTION] > Право **`com.apple.rootless.install`** дозволяє обійти SIP Право `com.apple.rootless.install` відоме тим, що обіймає захист цілісності системи (SIP) на macOS. Це було особливо згадано у зв'язку з [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/). У цьому конкретному випадку, система XPC-сервіс, розташований за адресою `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc`, має це право. Це дозволяє відповідному процесу обійти обмеження SIP. Крім того, цей сервіс помітно пропонує метод, який дозволяє переміщення файлів без застосування будь-яких заходів безпеки. ## Запечатані системні знімки Запечатані системні знімки - це функція, введена Apple в **macOS Big Sur (macOS 11)** як частина механізму **захисту цілісності системи (SIP)** для забезпечення додаткового рівня безпеки та стабільності системи. Вони по суті є версіями системного тому тільки для читання. Ось більш детальний огляд: 1. **Незмінна система**: Запечатані системні знімки роблять системний том macOS "незмінним", що означає, що його не можна змінювати. Це запобігає будь-яким несанкціонованим або випадковим змінам системи, які можуть загрожувати безпеці або стабільності системи. 2. **Оновлення програмного забезпечення системи**: Коли ви встановлюєте оновлення або апгрейди macOS, macOS створює новий системний знімок. Тоді стартовий том macOS використовує **APFS (Apple File System)** для переходу на цей новий знімок. Весь процес застосування оновлень стає безпечнішим і надійнішим, оскільки система завжди може повернутися до попереднього знімка, якщо щось піде не так під час оновлення. 3. **Розділення даних**: У поєднанні з концепцією розділення даних і системного тому, введеною в macOS Catalina, функція запечатаного системного знімка забезпечує, що всі ваші дані та налаштування зберігаються на окремому томі "**Data**". Це розділення робить ваші дані незалежними від системи, що спрощує процес оновлень системи та підвищує безпеку системи. Пам'ятайте, що ці знімки автоматично керуються macOS і не займають додаткового місця на вашому диску завдяки можливостям спільного використання простору APFS. Також важливо зазначити, що ці знімки відрізняються від **знімків Time Machine**, які є резервними копіями всієї системи, доступними для користувача. ### Перевірка знімків Команда **`diskutil apfs list`** перераховує **деталі томів APFS** та їхнє розташування:
+-- Container disk3 966B902E-EDBA-4775-B743-CF97A0556A13
|   ====================================================
|   APFS Container Reference:     disk3
|   Size (Capacity Ceiling):      494384795648 B (494.4 GB)
|   Capacity In Use By Volumes:   219214536704 B (219.2 GB) (44.3% used)
|   Capacity Not Allocated:       275170258944 B (275.2 GB) (55.7% free)
|   |
|   +-< Physical Store disk0s2 86D4B7EC-6FA5-4042-93A7-D3766A222EBE
|   |   -----------------------------------------------------------
|   |   APFS Physical Store Disk:   disk0s2
|   |   Size:                       494384795648 B (494.4 GB)
|   |
|   +-> Volume disk3s1 7A27E734-880F-4D91-A703-FB55861D49B7
|   |   ---------------------------------------------------
|   |   APFS Volume Disk (Role):   disk3s1 (System)
|   |   Name:                      Macintosh HD (Case-insensitive)
|   |   Mount Point:               /System/Volumes/Update/mnt1
|   |   Capacity Consumed:         12819210240 B (12.8 GB)
|   |   Sealed:                    Broken
|   |   FileVault:                 Yes (Unlocked)
|   |   Encrypted:                 No
|   |   |
|   |   Snapshot:                  FAA23E0C-791C-43FF-B0E7-0E1C0810AC61
|   |   Snapshot Disk:             disk3s1s1
|   |   Snapshot Mount Point:      /
|   |   Snapshot Sealed:           Yes
[...]
+-> Volume disk3s5 281959B7-07A1-4940-BDDF-6419360F3327
|   ---------------------------------------------------
|   APFS Volume Disk (Role):   disk3s5 (Data)
|   Name:                      Macintosh HD - Data (Case-insensitive)
    |   Mount Point:               /System/Volumes/Data
    |   Capacity Consumed:         412071784448 B (412.1 GB)
    |   Sealed:                    No
|   FileVault:                 Yes (Unlocked)
У попередньому виводі можна побачити, що **доступні для користувача місця** змонтовані під `/System/Volumes/Data`. Крім того, **знімок системного тому macOS** змонтований у `/` і він **запечатаний** (криптографічно підписаний ОС). Отже, якщо SIP буде обійдено і його змінять, **ОС більше не завантажиться**. Також можливо **перевірити, що запечатка увімкнена**, запустивши: ```bash csrutil authenticated-root status Authenticated Root status: enabled ``` Крім того, диск знімка також змонтовано як **тільки для читання**: ```bash mount /dev/disk3s1s1 on / (apfs, sealed, local, read-only, journaled) ``` {{#include ../../../banners/hacktricks-training.md}}