258 lines
26 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`:
<figure><img src="../../../images/image (1192).png" alt=""><figcaption></figcaption></figure>
### Статус 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) <a href="#cve" id="cve"></a>
Було виявлено, що можливо **поміняти пакет установника після того, як система перевірила його код** підпису, а потім система встановлювала шкідливий пакет замість оригінального. Оскільки ці дії виконувалися **`system_installd`**, це дозволяло обійти SIP.
#### [CVE-20209854](https://objective-see.org/blog/blog_0x4D.html) <a href="#cve-unauthd-chain" id="cve-unauthd-chain"></a>
Якщо пакет було встановлено з підключеного образу або зовнішнього диска, **установник** **виконував** двійковий файл з **цієї файлової системи** (замість захищеного місця 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 <command>`, файл `~/.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 <a href="#cve-a-detailed-look" id="cve-a-detailed-look"></a>
Як [**детально описано в цьому блозі**](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** та їхнє розташування:
<pre><code>+-- 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)
| |
| +-&#x3C; 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
| | ---------------------------------------------------
<strong>| | APFS Volume Disk (Role): disk3s1 (System)
</strong>| | Name: Macintosh HD (Case-insensitive)
<strong>| | Mount Point: /System/Volumes/Update/mnt1
</strong>| | Capacity Consumed: 12819210240 B (12.8 GB)
| | Sealed: Broken
| | FileVault: Yes (Unlocked)
| | Encrypted: No
| | |
| | Snapshot: FAA23E0C-791C-43FF-B0E7-0E1C0810AC61
| | Snapshot Disk: disk3s1s1
<strong>| | Snapshot Mount Point: /
</strong><strong>| | Snapshot Sealed: Yes
</strong>[...]
+-> Volume disk3s5 281959B7-07A1-4940-BDDF-6419360F3327
| ---------------------------------------------------
| APFS Volume Disk (Role): disk3s5 (Data)
| Name: Macintosh HD - Data (Case-insensitive)
<strong> | Mount Point: /System/Volumes/Data
</strong><strong> | Capacity Consumed: 412071784448 B (412.1 GB)
</strong> | Sealed: No
| FileVault: Yes (Unlocked)
</code></pre>
У попередньому виводі можна побачити, що **доступні для користувача місця** змонтовані під `/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}}