hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-launch-environment-constraints.md

198 lines
14 KiB
Markdown
Raw Normal View History

2024-02-10 13:11:20 +00:00
# macOS Ograničenja pokretanja / okruženja i keš poverenja
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2024-02-10 13:11:20 +00:00
* Da li radite u **kompaniji za kibernetičku bezbednost**? Želite li da vidite **vašu kompaniju reklamiranu na HackTricks-u**? Ili želite da imate pristup **najnovijoj verziji PEASS-a ili preuzmete HackTricks u PDF formatu**? Proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* **Pridružite se** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili me **pratite** na **Twitter-u** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **i** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud)
*
* .
</details>
2024-02-10 13:11:20 +00:00
## Osnovne informacije
2024-02-10 13:11:20 +00:00
Ograničenja pokretanja u macOS-u su uvedena radi poboljšanja bezbednosti tako što **regulišu kako, ko i odakle se može pokrenuti proces**. Uvedena u macOS Ventura, pružaju okvir koji kategorizuje **svaki sistemski binarni fajl u odvojene kategorije ograničenja**, koje su definisane unutar **keša poverenja**, liste koja sadrži sistemski binarni fajl i njegov odgovarajući heš. Ova ograničenja se odnose na svaki izvršni binarni fajl u sistemu i obuhvataju skup **pravila** koja definišu zahteve za **pokretanje određenog binarnog fajla**. Pravila obuhvataju ograničenja koja binarni fajl mora zadovoljiti, ograničenja roditeljskog procesa koja moraju biti ispunjena od strane roditeljskog procesa, kao i ograničenja odgovornosti koja moraju biti poštovana od strane drugih relevantnih entiteta.
2024-02-10 13:11:20 +00:00
Mehanizam se proširuje na aplikacije trećih strana putem **Ograničenja okruženja**, počevši od macOS Sonoma, omogućavajući programerima da zaštite svoje aplikacije specificiranjem **skupa ključeva i vrednosti za ograničenja okruženja**.
2024-02-10 13:11:20 +00:00
Definišete **ograničenja pokretanja okruženja i biblioteke** u rečnicima ograničenja koje čuvate u **`launchd` property list fajlovima**, ili u **posebnim property list fajlovima** koje koristite pri potpisivanju koda.
2024-02-10 13:11:20 +00:00
Postoje 4 vrste ograničenja:
2024-02-10 13:11:20 +00:00
* **Ograničenja samog procesa**: Ograničenja primenjena na **pokrenuti** binarni fajl.
* **Ograničenja roditeljskog procesa**: Ograničenja primenjena na **roditeljski proces** (na primer **`launchd`** koji pokreće XP servis).
* **Ograničenja odgovornosti**: Ograničenja primenjena na **proces koji poziva servis** u XPC komunikaciji.
* **Ograničenja učitavanja biblioteke**: Koristite ograničenja učitavanja biblioteke da biste selektivno opisali kod koji može biti učitan.
2024-02-10 13:11:20 +00:00
Dakle, kada proces pokuša da pokrene drugi proces - pozivajući `execve(_:_:_:)` ili `posix_spawn(_:_:_:_:_:_:)` - operativni sistem proverava da li **izvršni** fajl **zadovoljava** svoje **sopstveno ograničenje**. Takođe proverava da li **izvršni fajl roditeljskog procesa** zadovoljava ograničenje roditeljskog procesa izvršnog fajla, i da li **izvršni fajl odgovornog procesa** zadovoljava ograničenje odgovornog procesa izvršnog fajla. Ako neko od ovih ograničenja pokretanja nije ispunjeno, operativni sistem ne pokreće program.
2024-02-10 13:11:20 +00:00
Ako prilikom učitavanja biblioteke bilo koji deo **ograničenja biblioteke nije tačan**, vaš proces **neće učitati** biblioteku.
2024-02-10 13:11:20 +00:00
## LC Kategorije
2024-02-10 13:11:20 +00:00
LC se sastoji od **činjenica** i **logičkih operacija** (i, ili...) koje kombinuju činjenice.
2024-02-10 13:11:20 +00:00
[**Činjenice koje LC može koristiti su dokumentovane**](https://developer.apple.com/documentation/security/defining\_launch\_environment\_and\_library\_constraints). Na primer:
2024-02-10 13:11:20 +00:00
* is-init-proc: Boolean vrednost koja označava da li izvršni fajl mora biti inicijalni proces operativnog sistema (`launchd`).
* is-sip-protected: Boolean vrednost koja označava da li izvršni fajl mora biti fajl zaštićen od strane System Integrity Protection (SIP).
* `on-authorized-authapfs-volume:` Boolean vrednost koja označava da li je operativni sistem učitao izvršni fajl sa autorizovanog, autentifikovanog APFS volumena.
* `on-authorized-authapfs-volume`: Boolean vrednost koja označava da li je operativni sistem učitao izvršni fajl sa autorizovanog, autentifikovanog APFS volumena.
* Cryptexes volumen
* `on-system-volume:` Boolean vrednost koja označava da li je operativni sistem učitao izvršni fajl sa trenutno podignutog sistemskog volumena.
* Unutar /System...
* ...
2024-02-10 13:11:20 +00:00
Kada se Apple binarni fajl potpiše, **dodeljuje mu se LC kategorija** unutar **keša poverenja**.
2024-02-10 13:11:20 +00:00
* **iOS 16 LC kategorija** su [**reverzirane i dokumentovane ovde**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056).
* Trenutne **LC kategorije (macOS 14** - Somona) su reverzirane i njihovi [**opisi se mogu pronaći ovde**](https://gist.github.com/theevilbit/a6fef1e0397425a334d064f7b6e1be53).
2024-02-10 13:11:20 +00:00
Na primer, Kategorija 1 je:
```
Category 1:
2024-02-10 13:11:20 +00:00
Self Constraint: (on-authorized-authapfs-volume || on-system-volume) && launch-type == 1 && validation-category == 1
Parent Constraint: is-init-proc
```
2024-02-10 13:11:20 +00:00
* `(on-authorized-authapfs-volume || on-system-volume)`: Morate biti na System ili Cryptexes volumenu.
* `launch-type == 1`: Morate biti sistemski servis (plist u LaunchDaemons).
* `validation-category == 1`: Izvršna datoteka operativnog sistema.
* `is-init-proc`: Launchd
2024-02-10 13:11:20 +00:00
### Reversiranje LC kategorija
2024-02-10 13:11:20 +00:00
Imate više informacija [**ovde**](https://theevilbit.github.io/posts/launch\_constraints\_deep\_dive/#reversing-constraints), ali u osnovi, one su definisane u **AMFI (AppleMobileFileIntegrity)**, tako da morate preuzeti Kernel Development Kit da biste dobili **KEXT**. Simboli koji počinju sa **`kConstraintCategory`** su **interesantni**. Izdvajanjem njih dobijate DER (ASN.1) kodiran tok koji ćete morati dekodirati pomoću [ASN.1 Decoder](https://holtstrom.com/michael/tools/asn1decoder.php) ili python-asn1 biblioteke i njenog `dump.py` skripta, [andrivet/python-asn1](https://github.com/andrivet/python-asn1/tree/master) koji će vam dati razumljiviji string.
2024-02-10 13:11:20 +00:00
## Ograničenja okruženja
2024-02-10 13:11:20 +00:00
Ovo su postavljena ograničenja okruženja konfigurisana u **aplikacijama trećih strana**. Razvijač može odabrati **činjenice** i **logičke operatore** koje će koristiti u svojoj aplikaciji kako bi ograničio pristup sebi.
2024-02-10 13:11:20 +00:00
Moguće je nabrojati ograničenja okruženja aplikacije pomoću:
```bash
codesign -d -vvvv app.app
```
## Trust Caches
2024-02-10 13:11:20 +00:00
U **macOS**-u postoje nekoliko kešova poverenja:
* **`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/BaseSystemTrustCache.img4`**
* **`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4`**
* **`/System/Library/Security/OSLaunchPolicyData`**
2024-02-10 13:11:20 +00:00
A na iOS-u izgleda da se nalazi u **`/usr/standalone/firmware/FUD/StaticTrustCache.img4`**.
{% hint style="warning" %}
2024-02-10 13:11:20 +00:00
Na macOS-u koji se izvršava na uređajima Apple Silicon, ako Apple potpisani binarni fajl nije u kešu poverenja, AMFI će odbiti da ga učita.
{% endhint %}
2024-02-10 13:11:20 +00:00
### Enumeracija kešova poverenja
2024-02-10 13:11:20 +00:00
Prethodni fajlovi keša poverenja su u formatu **IMG4** i **IM4P**, pri čemu je IM4P sekcija za prenos podataka u formatu IMG4.
2024-02-10 13:11:20 +00:00
Možete koristiti [**pyimg4**](https://github.com/m1stadev/PyIMG4) da izvučete prenos podataka iz baza:
{% code overflow="wrap" %}
```bash
# Installation
python3 -m pip install pyimg4
# Extract payloads data
cp /System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/BaseSystemTrustCache.img4 /tmp
pyimg4 img4 extract -i /tmp/BaseSystemTrustCache.img4 -p /tmp/BaseSystemTrustCache.im4p
pyimg4 im4p extract -i /tmp/BaseSystemTrustCache.im4p -o /tmp/BaseSystemTrustCache.data
cp /System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4 /tmp
pyimg4 img4 extract -i /tmp/StaticTrustCache.img4 -p /tmp/StaticTrustCache.im4p
pyimg4 im4p extract -i /tmp/StaticTrustCache.im4p -o /tmp/StaticTrustCache.data
pyimg4 im4p extract -i /System/Library/Security/OSLaunchPolicyData -o /tmp/OSLaunchPolicyData.data
```
{% endcode %}
2024-02-10 13:11:20 +00:00
(Druga opcija može biti korišćenje alata [**img4tool**](https://github.com/tihmstar/img4tool), koji će raditi čak i na M1 čipu, čak i ako je verzija starija i za x86\_64 ako ga instalirate na odgovarajućim lokacijama).
2024-02-10 13:11:20 +00:00
Sada možete koristiti alat [**trustcache**](https://github.com/CRKatri/trustcache) da biste dobili informacije u čitljivom formatu:
```bash
# Install
wget https://github.com/CRKatri/trustcache/releases/download/v2.0/trustcache_macos_arm64
sudo mv ./trustcache_macos_arm64 /usr/local/bin/trustcache
xattr -rc /usr/local/bin/trustcache
chmod +x /usr/local/bin/trustcache
# Run
trustcache info /tmp/OSLaunchPolicyData.data | head
trustcache info /tmp/StaticTrustCache.data | head
trustcache info /tmp/BaseSystemTrustCache.data | head
version = 2
uuid = 35EB5284-FD1E-4A5A-9EFB-4F79402BA6C0
entry count = 969
0065fc3204c9f0765049b82022e4aa5b44f3a9c8 [none] [2] [1]
00aab02b28f99a5da9b267910177c09a9bf488a2 [none] [2] [1]
0186a480beeee93050c6c4699520706729b63eff [none] [2] [2]
0191be4c08426793ff3658ee59138e70441fc98a [none] [2] [3]
01b57a71112235fc6241194058cea5c2c7be3eb1 [none] [2] [2]
01e6934cb8833314ea29640c3f633d740fc187f2 [none] [2] [2]
020bf8c388deaef2740d98223f3d2238b08bab56 [none] [2] [3]
```
2024-02-10 13:11:20 +00:00
Keš poverenja prati sledeću strukturu, tako da je **LC kategorija četvrta kolona**.
```c
struct trust_cache_entry2 {
2024-02-10 13:11:20 +00:00
uint8_t cdhash[CS_CDHASH_LEN];
uint8_t hash_type;
uint8_t flags;
uint8_t constraintCategory;
uint8_t reserved0;
} __attribute__((__packed__));
```
2024-02-10 13:11:20 +00:00
Zatim, možete koristiti skriptu kao što je [**ova**](https://gist.github.com/xpn/66dc3597acd48a4c31f5f77c3cc62f30) da izvučete podatke.
2024-02-10 13:11:20 +00:00
Iz tih podataka možete proveriti aplikacije sa **vrednošću ograničenja pokretanja `0`**, koje nisu ograničene ([**proverite ovde**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056) za svaku vrednost).
2024-02-10 13:11:20 +00:00
## Mitigacije napada
2024-02-10 13:11:20 +00:00
Ograničenja pokretanja bi sprečila nekoliko starih napada tako što bi **osigurala da se proces ne izvršava u neočekivanim uslovima**: na primer, iz neočekivanih lokacija ili pozivanjem od strane neočekivanog roditeljskog procesa (ako samo launchd treba da ga pokrene).
2024-02-10 13:11:20 +00:00
Osim toga, ograničenja pokretanja takođe **smanjuju rizik od napada degradacijom**.
2024-02-10 13:11:20 +00:00
Međutim, ona ne sprečavaju uobičajene zloupotrebe XPC-a, ubacivanje koda u Electron ili ubacivanje dylib biblioteka bez provere (osim ako su poznati ID-ovi timova koji mogu učitavati biblioteke).
2024-02-10 13:11:20 +00:00
### Zaštita XPC demona
2024-02-07 04:06:18 +00:00
2024-02-10 13:11:20 +00:00
U Sonoma izdanju, značajan detalj je **konfiguracija odgovornosti** XPC servisa demona. XPC servis je odgovoran za sebe, za razliku od povezanog klijenta koji je odgovoran. Ovo je dokumentovano u izveštaju o povratnoj informaciji FB13206884. Ova postavka može delovati nedostatno, jer omogućava određene interakcije sa XPC servisom:
2024-02-07 04:06:18 +00:00
2024-02-10 13:11:20 +00:00
- **Pokretanje XPC servisa**: Ako se pretpostavi da je ovo greška, ova postavka ne dozvoljava pokretanje XPC servisa putem napadačkog koda.
- **Povezivanje sa aktivnim servisom**: Ako je XPC servis već pokrenut (možda aktiviran od strane originalne aplikacije), nema prepreka za povezivanje sa njim.
2024-02-07 04:06:18 +00:00
2024-02-10 13:11:20 +00:00
Iako bi implementacija ograničenja na XPC servis mogla biti korisna tako što bi **smanjila mogućnost napada**, to ne rešava osnovnu brigu. Osiguravanje sigurnosti XPC servisa suštinski zahteva **efikasnu validaciju povezanog klijenta**. To ostaje jedini način za ojačavanje sigurnosti servisa. Takođe, treba napomenuti da pomenuta konfiguracija odgovornosti trenutno funkcioniše, što možda nije u skladu sa namerenim dizajnom.
2024-02-10 13:11:20 +00:00
### Zaštita Electrona
2024-02-10 13:11:20 +00:00
Čak i ako je potrebno da se aplikacija **otvori pomoću LaunchService-a** (u ograničenjima roditelja), to se može postići korišćenjem **`open`** (koji može postaviti okružne promenljive) ili korišćenjem **Launch Services API-ja** (gde se mogu naznačiti okružne promenljive).
2024-02-10 13:11:20 +00:00
## Reference
* [https://youtu.be/f1HA5QhLQ7Y?t=24146](https://youtu.be/f1HA5QhLQ7Y?t=24146)
* [https://theevilbit.github.io/posts/launch\_constraints\_deep\_dive/](https://theevilbit.github.io/posts/launch\_constraints\_deep\_dive/)
* [https://eclecticlight.co/2023/06/13/why-wont-a-system-app-or-command-tool-run-launch-constraints-and-trust-caches/](https://eclecticlight.co/2023/06/13/why-wont-a-system-app-or-command-tool-run-launch-constraints-and-trust-caches/)
* [https://developer.apple.com/videos/play/wwdc2023/10266/](https://developer.apple.com/videos/play/wwdc2023/10266/)
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od početka do naprednog nivoa sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2024-02-10 13:11:20 +00:00
* Da li radite u **kompaniji za kibernetičku bezbednost**? Želite da vidite **vašu kompaniju reklamiranu na HackTricks**? Ili želite da imate pristup **najnovijoj verziji PEASS-a ili preuzmete HackTricks u PDF formatu**? Proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* **Pridružite se** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili me **pratite** na **Twitteru** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova** [**hacktricks repo-u**](https://github.com/carlospolop/hacktricks) **i** [**hacktricks-cloud repo-u**](https://github.com/carlospolop/hacktricks-cloud)
*
* .
</details>