macOS Launch/Environment Constraints & Trust Cache
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ograničenja pokretanja u macOS-u su uvedena kako bi se poboljšala sigurnost regulisanjem kako, ko i odakle se proces može pokrenuti. Uvedena u macOS Ventura, pružaju okvir koji kategorizuje svaki sistemski binarni fajl u različite kategorije ograničenja, koje su definisane unutar trust cache, liste koja sadrži sistemske binarne fajlove i njihove odgovarajuće heš vrednosti. Ova ograničenja se protežu na svaki izvršni binarni fajl unutar sistema, podrazumevajući skup pravila koja definišu zahteve za pokretanje određenog binarnog fajla. Pravila obuhvataju samoprocenjivanja koja binarni fajl mora zadovoljiti, roditeljska ograničenja koja moraju biti ispunjena od strane njegovog roditeljskog procesa, i odgovorna ograničenja koja moraju poštovati druge relevantne entitete.
Mehanizam se proteže na aplikacije trećih strana putem Environment Constraints, počevši od macOS Sonoma, omogućavajući programerima da zaštite svoje aplikacije tako što će odrediti skup ključeva i vrednosti za ograničenja okruženja.
Definišete ograničenja okruženja i biblioteka za pokretanje u rečnicima ograničenja koje ili čuvate u launchd
datotekama sa svojstvima, ili u odvojenim datotekama sa svojstvima koje koristite u potpisivanju koda.
Postoje 4 tipa ograničenja:
Samoprocenjivanja: Ograničenja primenjena na izvršni binarni fajl.
Roditeljski proces: Ograničenja primenjena na roditelja procesa (na primer launchd
koji pokreće XP servis)
Odgovorna ograničenja: Ograničenja primenjena na proces koji poziva servis u XPC komunikaciji
Ograničenja učitavanja biblioteka: Koristite ograničenja učitavanja biblioteka da selektivno opišete kod koji može biti učitan
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 samoograničenje. Takođe proverava da li izvršni fajl roditeljskog procesa zadovoljava roditeljsko ograničenje izvršnog fajla, i da li izvršni fajl odgovornog procesa zadovoljava odgovorno ograničenje izvršnog fajla. Ako bilo koje od ovih ograničenja pokretanja nije ispunjeno, operativni sistem ne pokreće program.
Ako prilikom učitavanja biblioteke bilo koji deo ograničenja biblioteke nije tačan, vaš proces ne učitava biblioteku.
LC se sastoji od činjenica i logičkih operacija (i, ili..) koje kombinuju činjenice.
Činjenice koje LC može koristiti su dokumentovane. Na primer:
is-init-proc: Boolean vrednost koja označava da li izvršni fajl mora biti proces inicijalizacije operativnog sistema (launchd
).
is-sip-protected: Boolean vrednost koja označava da li izvršni fajl mora biti fajl zaštićen Sistemskom integritetnom zaštitom (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 pokrenutog sistemskog volumena.
Unutar /System...
...
Kada je Apple binarni fajl potpisan, dodeljuje ga LC kategoriji unutar trust cache.
iOS 16 LC kategorije su obrnute i dokumentovane ovde.
Trenutne LC kategorije (macOS 14 - Somona) su obrnute i njihove opisne informacije se mogu naći ovde.
Na primer, Kategorija 1 je:
(on-authorized-authapfs-volume || on-system-volume)
: Mora biti u System ili Cryptexes volumenu.
launch-type == 1
: Mora biti sistemska usluga (plist u LaunchDaemons).
validation-category == 1
: Izvršna datoteka operativnog sistema.
is-init-proc
: Launchd
Imate više informacija o tome ovde, ali u suštini, one su definisane u AMFI (AppleMobileFileIntegrity), tako da treba da preuzmete Kernel Development Kit da biste dobili KEXT. Simboli koji počinju sa kConstraintCategory
su zanimljivi. Ekstrakcijom ćete dobiti DER (ASN.1) kodirani tok koji ćete morati da dekodirate pomoću ASN.1 Decoder ili python-asn1 biblioteke i njenog dump.py
skripta, andrivet/python-asn1 koji će vam dati razumljiviji string.
Ovo su Launch Constraints postavljeni u aplikacijama trećih strana. Razvijač može odabrati činjenice i logičke operatore koje će koristiti u svojoj aplikaciji da bi ograničio pristup samom sebi.
Moguće je enumerisati Environment Constraints aplikacije sa:
U macOS postoji 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
A u iOS-u izgleda da se nalazi u /usr/standalone/firmware/FUD/StaticTrustCache.img4
.
Na macOS-u koji radi na Apple Silicon uređajima, ako Apple potpisani binarni fajl nije u kešu poverenja, AMFI će odbiti da ga učita.
Prethodni fajlovi keša poverenja su u formatu IMG4 i IM4P, pri čemu je IM4P deo sa podacima formata IMG4.
Možete koristiti pyimg4 za ekstrakciju podataka iz baza:
(Druga opcija bi mogla biti korišćenje alata img4tool, koji će raditi čak i na M1, čak i ako je verzija stara, i za x86_64 ako ga instalirate na odgovarajuće lokacije).
Sada možete koristiti alat trustcache da dobijete informacije u čitljivom formatu:
Keš poverenja prati sledeću strukturu, tako da je LC kategorija 4. kolona
Zatim, možete koristiti skriptu kao što je ova da izvučete podatke.
Iz tih podataka možete proveriti aplikacije sa vrednošću ograničenja pokretanja 0
, koje su one koje nisu ograničene (proverite ovde šta svaka vrednost znači).
Ograničenja pokretanja bi ublažila nekoliko starih napada tako što bi osigurala da proces neće biti izvršen u neočekivanim uslovima: Na primer, iz neočekivanih lokacija ili da bude pozvan od neočekivanog roditeljskog procesa (ako samo launchd treba da ga pokrene).
Štaviše, Ograničenja pokretanja takođe ublažavaju napade na smanjenje nivoa.
Međutim, ona ne ublažavaju uobičajene XPC zloupotrebe, Electron injekcije koda ili dylib injekcije bez validacije biblioteka (osim ako su ID-ovi timova koji mogu učitati biblioteke poznati).
U Sonoma izdanju, značajna tačka je konfiguracija odgovornosti XPC servisnog daemona. XPC servis je odgovoran za sebe, za razliku od povezane klijentske aplikacije koja je odgovorna. Ovo je dokumentovano u izveštaju o povratnim informacijama FB13206884. Ova postavka može izgledati kao greška, jer omogućava određene interakcije sa XPC servisom:
Pokretanje XPC servisa: Ako se smatra greškom, ova postavka ne dozvoljava pokretanje XPC servisa putem koda napadača.
Povezivanje sa aktivnim servisom: Ako je XPC servis već pokrenut (moguće aktiviran njegovom originalnom aplikacijom), nema prepreka za povezivanje sa njim.
Iako implementacija ograničenja na XPC servis može biti korisna sužavanjem prozora za potencijalne napade, to ne rešava primarnu zabrinutost. Osiguranje bezbednosti XPC servisa fundamentalno zahteva efikasnu validaciju povezane klijentske aplikacije. Ovo ostaje jedini način da se ojača bezbednost servisa. Takođe, vredi napomenuti da je pomenuta konfiguracija odgovornosti trenutno operativna, što možda nije u skladu sa predviđenim dizajnom.
Čak i ako je potrebno da aplikacija bude otvorena putem LaunchService (u roditeljskim ograničenjima). To se može postići korišćenjem open
(koji može postaviti env promenljive) ili korišćenjem Launch Services API (gde se mogu naznačiti env promenljive).
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)