macOS XPC
Last updated
Last updated
Learn & practice AWS Hacking: Learn & practice GCP Hacking:
XPC, što je skraćenica za XNU (jezgro koje koristi macOS) međuprocesna komunikacija, je okvir za komunikaciju između procesa na macOS-u i iOS-u. XPC pruža mehanizam za sigurne, asinhrone pozive metoda između različitih procesa na sistemu. To je deo Apple-ove sigurnosne paradigme, koja omogućava kreiranje aplikacija sa odvojenim privilegijama gde svaki komponent radi sa samo onim dozvolama koje su mu potrebne da obavi svoj posao, čime se ograničava potencijalna šteta od kompromitovanog procesa.
XPC koristi oblik međuprocesne komunikacije (IPC), što je skup metoda za različite programe koji rade na istom sistemu da šalju podatke napred-nazad.
Primarne prednosti XPC-a uključuju:
Sigurnost: Razdvajanjem posla u različite procese, svaki proces može dobiti samo dozvole koje su mu potrebne. To znači da čak i ako je proces kompromitovan, ima ograničenu sposobnost da nanese štetu.
Stabilnost: XPC pomaže da se srušavanja izoluju na komponentu gde se dešavaju. Ako proces padne, može se ponovo pokrenuti bez uticaja na ostatak sistema.
Performanse: XPC omogućava laku konkurentnost, jer se različiti zadaci mogu izvoditi istovremeno u različitim procesima.
Jedini nedostatak je što je razdvajanje aplikacije u nekoliko procesa koji komuniciraju putem XPC manje efikasno. Ali u današnjim sistemima to gotovo nije primetno i prednosti su bolje.
XPC komponente aplikacije su unutar same aplikacije. Na primer, u Safariju ih možete pronaći u /Applications/Safari.app/Contents/XPCServices
. Imaju ekstenziju .xpc
(kao com.apple.Safari.SandboxBroker.xpc
) i takođe su paketi sa glavnim binarnim fajlom unutar njega: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker
i Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist
Kao što možda mislite, XPC komponenta će imati različite privilegije i ovlašćenja od drugih XPC komponenti ili glavnog binarnog fajla aplikacije. OSIM ako je XPC usluga konfigurisana sa postavljenim na “True” u svom Info.plist fajlu. U ovom slučaju, XPC usluga će raditi u istoim sigurnosnoj sesiji kao aplikacija koja je pozvala.
XPC usluge se pokreću od strane launchd kada je to potrebno i zatvaraju se kada su svi zadaci završeni kako bi se oslobodili sistemski resursi. Specifične XPC komponente aplikacije mogu koristiti samo aplikacija, čime se smanjuje rizik povezan sa potencijalnim ranjivostima.
Sistemske XPC usluge su dostupne svim korisnicima. Ove usluge, bilo launchd ili Mach-tip, moraju biti definisane u plist fajlovima smeštenim u određenim direktorijumima kao što su /System/Library/LaunchDaemons
, /Library/LaunchDaemons
, /System/Library/LaunchAgents
, ili /Library/LaunchAgents
.
Ovi plist fajlovi će imati ključ pod nazivom MachServices
sa imenom usluge, i ključ pod nazivom Program
sa putanjom do binarnog fajla:
The ones in LaunchDameons
se pokreću kao root. Dakle, ako neprivilegovan proces može da komunicira sa jednim od ovih, mogao bi da eskalira privilegije.
xpc_object_t
Svaka XPC poruka je objekat rečnika koji pojednostavljuje serijalizaciju i deserializaciju. Štaviše, libxpc.dylib
definiše većinu tipova podataka, tako da je moguće osigurati da su primljeni podaci očekivanog tipa. U C API-ju svaki objekat je xpc_object_t
(i njegov tip se može proveriti koristeći xpc_get_type(object)
).
Pored toga, funkcija xpc_copy_description(object)
može se koristiti za dobijanje string reprezentacije objekta koja može biti korisna za svrhe debagovanja.
Ovi objekti takođe imaju neke metode koje se mogu pozvati kao što su xpc_<object>_copy
, xpc_<object>_equal
, xpc_<object>_hash
, xpc_<object>_serialize
, xpc_<object>_deserialize
...
xpc_object_t
se kreiraju pozivanjem xpc_<objetType>_create
funkcije, koja interno poziva _xpc_base_create(Class, Size)
gde se navodi tip klase objekta (jedan od XPC_TYPE_*
) i veličina (neka dodatna 40B će biti dodata veličini za metapodatke). Što znači da će podaci objekta početi na offsetu 40B.
Stoga, xpc_<objectType>_t
je neka vrsta podklase xpc_object_t
koja bi bila podklasa os_object_t*
.
Napomena da bi developer trebao koristiti xpc_dictionary_[get/set]_<objectType>
da dobije ili postavi tip i stvarnu vrednost ključa.
xpc_pipe
xpc_pipe
je FIFO cev koju procesi mogu koristiti za komunikaciju (komunikacija koristi Mach poruke).
Moguće je kreirati XPC server pozivajući xpc_pipe_create()
ili xpc_pipe_create_from_port()
da ga kreirate koristeći specifičnu Mach port. Zatim, da primite poruke, moguće je pozvati xpc_pipe_receive
i xpc_pipe_try_receive
.
Napomena da je objekat xpc_pipe
xpc_object_t
sa informacijama u svojoj strukturi o dva korišćena Mach porta i imenu (ako postoji). Ime, na primer, daemon secinitd
u svom plist-u /System/Library/LaunchDaemons/com.apple.secinitd.plist
konfiguriše cev nazvanu com.apple.secinitd
.
Primer xpc_pipe
je bootstrap pipe koju kreira launchd
čime se omogućava deljenje Mach portova.
NSXPC*
Ovo su objekti visokog nivoa u Objective-C koji omogućavaju apstrakciju XPC veza. Štaviše, lakše je debagovati ove objekte sa DTrace nego prethodne.
GCD Queues
XPC koristi GCD za slanje poruka, štaviše generiše određene redove za raspoređivanje kao što su xpc.transactionq
, xpc.io
, xpc-events.add-listenerq
, xpc.service-instance
...
Ovo su paketi sa .xpc
ekstenzijom smešteni unutar XPCServices
foldera drugih projekata i u Info.plist
imaju CFBundlePackageType
postavljen na XPC!
.
Ovaj fajl ima druge konfiguracione ključeve kao što su ServiceType
koji može biti Aplikacija, Korisnik, Sistem ili _SandboxProfile
koji može definisati sandbox ili _AllowedClients
koji može ukazivati na prava ili ID potrebne za kontaktiranje servisa. Ove i druge konfiguracione opcije će biti korisne za konfiguraciju servisa prilikom pokretanja.
Aplikacija pokušava da poveže sa XPC servisom koristeći xpc_connection_create_mach_service
, zatim launchd locira daemon i pokreće xpcproxy
. xpcproxy
sprovodi konfigurisana ograničenja i pokreće servis sa obezbeđenim FDs i Mach portovima.
Kako bi se poboljšala brzina pretrage XPC servisa, koristi se keš.
Moguće je pratiti akcije xpcproxy
koristeći:
XPC библиотека користи kdebug
за логовање акција позивајући xpc_ktrace_pid0
и xpc_ktrace_pid1
. Кодови које користи нису документовани, па је потребно додати их у /usr/share/misc/trace.codes
. Имају префикс 0x29
, а на пример један је 0x29000004
: XPC_serializer_pack
.
Утилита xpcproxy
користи префикс 0x22
, на пример: 0x2200001c: xpcproxy:will_do_preexec
.
Апликације могу пријавити различите догађајне поруке, омогућавајући им да буду инициране на захтев када се такви догађаји догоде. Подешавање за ове услуге се ради у launchd plist датотекама, смештеним у истим директоријумима као и претходне и садрже додатни LaunchEvent
кључ.
Када процес покуша да позове методу преко XPC везе, XPC услуга треба да провери да ли је том процесу дозвољено да се повеже. Ево уобичајених начина да се то провери и уобичајених замки:
Apple такође омогућава апликацијама да конфигуришу нека права и како их добити, тако да ако позивни процес има та права, биће дозвољено да позове методу из XPC услуге:
Ova funkcionalnost koju pruža RemoteXPC.framework
(iz libxpc
) omogućava komunikaciju putem XPC između različitih hostova.
Usluge koje podržavaju daljinski XPC će imati u svom plist ključ UsesRemoteXPC kao što je slučaj sa /System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist
. Međutim, iako će usluga biti registrovana sa launchd
, to je UserEventAgent
sa pluginovima com.apple.remoted.plugin
i com.apple.remoteservicediscovery.events.plugin
koji pruža funkcionalnost.
Štaviše, RemoteServiceDiscovery.framework
omogućava dobijanje informacija iz com.apple.remoted.plugin
izlažući funkcije kao što su get_device
, get_unique_device
, connect
...
Kada se koristi connect i socket fd
usluge se prikupi, moguće je koristiti klasu remote_xpc_connection_*
.
Moguće je dobiti informacije o daljinskim uslugama koristeći cli alat /usr/libexec/remotectl
koristeći parametre kao:
Komunikacija između BridgeOS-a i hosta se odvija putem posvećenog IPv6 interfejsa. MultiverseSupport.framework
omogućava uspostavljanje soketa čiji će fd
biti korišćen za komunikaciju.
Moguće je pronaći ove komunikacije koristeći netstat
, nettop
ili otvorenu opciju, netbottom
.
Да бисте прислушкивали XPC поруке, можете користити који користи Frida.
Još jedan mogući alat za korišćenje je .
Učite i vežbajte AWS Hacking: Učite i vežbajte GCP Hacking:
Proverite !
Pridružite se 💬 ili ili pratite nas na Twitteru 🐦 .
Podelite hakerske trikove slanjem PR-ova na i github repozitorijume.