macOS xpc_connection_get_audit_token Attack
Reading time: 9 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Za više informacija pogledajte originalni post: https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/. Ovo je sažetak:
Mach Messages Basic Info
Ako ne znate šta su Mach poruke, počnite da proveravate ovu stranicu:
macOS IPC - Inter Process Communication
Za sada zapamtite da (definicija odavde):
Mach poruke se šalju preko mach porta, koji je kanal komunikacije sa jednim prijemnikom i više pošiljalaca ugrađen u mach kernel. Više procesa može slati poruke na mach port, ali u bilo kojem trenutku samo jedan proces može čitati sa njega. Baš kao i deskriptori datoteka i soketi, mach portovi se dodeljuju i upravljaju od strane kernela, a procesi vide samo ceo broj, koji mogu koristiti da označe kernelu koji od svojih mach portova žele da koriste.
XPC Connection
Ako ne znate kako se uspostavlja XPC veza, proverite:
Vuln Summary
Ono što je zanimljivo za vas da znate je da je XPC-ova apstrakcija veza jedan-na-jedan, ali se zasniva na tehnologiji koja može imati više pošiljalaca, tako da:
- Mach portovi su jedini prijemnik, više pošiljalaca.
- Audit token XPC veze je audit token kopiran iz najnovije primljene poruke.
- Dobijanje audit token-a XPC veze je ključno za mnoge provere bezbednosti.
Iako prethodna situacija zvuči obećavajuće, postoje neki scenariji gde to neće izazvati probleme (odavde):
- Audit tokeni se često koriste za proveru autorizacije da bi se odlučilo da li da se prihvati veza. Kako se to dešava koristeći poruku na servisnom portu, veza još nije uspostavljena. Više poruka na ovom portu će se samo obraditi kao dodatni zahtevi za vezu. Dakle, sve provere pre prihvatanja veze nisu ranjive (to takođe znači da unutar
-listener:shouldAcceptNewConnection:
audit token nije ugrožen). Stoga tražimo XPC veze koje verifikuju specifične akcije. - XPC rukovaoci događajima se obrađuju sinhrono. To znači da rukovalac događajem za jednu poruku mora biti završen pre nego što se pozove za sledeću, čak i na konkurentnim redovima za raspodelu. Dakle, unutar XPC rukovaoca događajem audit token ne može biti prepisan drugim normalnim (ne-odgovor!) porukama.
Dve različite metode koje bi mogle biti ranjive:
- Variant1:
- Eksploit se povezuje na servis A i servis B
- Servis B može pozvati privilegovanu funkcionalnost u servisu A koju korisnik ne može
- Servis A poziva
xpc_connection_get_audit_token
dok nije unutar rukovaoca događajem za vezu udispatch_async
. - Tako bi druga poruka mogla prepisati Audit Token jer se šalje asinhrono van rukovaoca događajem.
- Eksploit prosleđuje servisu B pravo SLANJA servisu A.
- Tako će svc B zapravo slati poruke servisu A.
- Eksploit pokušava da pozove privilegovanu akciju. U RC svc A proverava autorizaciju ove akcije dok svc B prepisuje Audit token (dajući eksploitu pristup da pozove privilegovanu akciju).
- Variant 2:
- Servis B može pozvati privilegovanu funkcionalnost u servisu A koju korisnik ne može
- Eksploit se povezuje sa servisom A koji šalje eksploitu poruku očekujući odgovor na specifičnom portu za odgovor.
- Eksploit šalje servisu B poruku prosleđujući taj port za odgovor.
- Kada servis B odgovara, on šalje poruku servisu A, dok eksploit šalje drugačiju poruku servisu A pokušavajući da dođe do privilegovane funkcionalnosti i očekujući da će odgovor servisa B prepisati Audit token u savršenom trenutku (Race Condition).
Variant 1: calling xpc_connection_get_audit_token outside of an event handler
Scenario:
- Dva mach servisa
A
iB
na koja se možemo povezati (na osnovu sandbox profila i provere autorizacije pre prihvatanja veze). - A mora imati proveru autorizacije za specifičnu akciju koju
B
može proći (ali naša aplikacija ne može). - Na primer, ako B ima neka prava ili radi kao root, to bi mu moglo omogućiti da zatraži od A da izvrši privilegovanu akciju.
- Za ovu proveru autorizacije,
A
dobija audit token asinhrono, na primer pozivajućixpc_connection_get_audit_token
izdispatch_async
.
caution
U ovom slučaju, napadač bi mogao izazvati Race Condition praveći eksploit koji traži od A da izvrši akciju nekoliko puta dok B šalje poruke A
. Kada je RC uspešan, audit token B će biti kopiran u memoriji dok se zahtev našeg eksploita obrađuje od strane A, dajući mu pristup privilegovanoj akciji koju je samo B mogao zatražiti.
Ovo se dogodilo sa A
kao smd
i B
kao diagnosticd
. Funkcija SMJobBless
iz smb može se koristiti za instalaciju novog privilegovanog pomoćnog alata (kao root). Ako proces koji radi kao root kontaktira smd, neće se izvršiti druge provere.
Stoga, servis B je diagnosticd
jer radi kao root i može se koristiti za praćenje procesa, tako da kada praćenje počne, on će slati više poruka u sekundi.
Da bi se izvršio napad:
- Inicirajte vezu sa servisom nazvanim
smd
koristeći standardni XPC protokol. - Formirajte sekundarnu vezu sa
diagnosticd
. Suprotno normalnoj proceduri, umesto da kreirate i šaljete dva nova mach porta, pravo slanja klijentskog porta se zamenjuje duplikatom prava slanja povezanog sasmd
vezom. - Kao rezultat, XPC poruke mogu biti poslati
diagnosticd
, ali odgovori oddiagnosticd
se preusmeravaju nasmd
. Zasmd
, izgleda kao da poruke od korisnika idiagnosticd
potiču iz iste veze.
- Sledeći korak uključuje davanje instrukcija
diagnosticd
da započne praćenje odabranog procesa (potencijalno korisnikovog). Paralelno, poplava rutinskih 1004 poruka se šaljesmd
. Cilj ovde je instalirati alat sa povišenim privilegijama. - Ova akcija pokreće trku unutar funkcije
handle_bless
. Vreme je ključno: poziv funkcijexpc_connection_get_pid
mora vratiti PID korisnikovog procesa (jer se privilegovani alat nalazi u korisničkom paketu aplikacije). Međutim, funkcijaxpc_connection_get_audit_token
, posebno unutar podrutineconnection_is_authorized
, mora se pozivati na audit token koji pripadadiagnosticd
.
Variant 2: reply forwarding
U XPC (Cross-Process Communication) okruženju, iako rukovaoci događajima ne izvršavaju se konkurentno, obrada odgovarajućih poruka ima jedinstveno ponašanje. Konkretno, postoje dve različite metode za slanje poruka koje očekuju odgovor:
xpc_connection_send_message_with_reply
: Ovde se XPC poruka prima i obrađuje na određenoj redi.xpc_connection_send_message_with_reply_sync
: Suprotno tome, u ovoj metodi, XPC poruka se prima i obrađuje na trenutnoj redi za raspodelu.
Ova razlika je ključna jer omogućava mogućnost da paketi odgovora budu obrađeni konkurentno sa izvršenjem XPC rukovaoca događajem. Imajte na umu da, iako _xpc_connection_set_creds
implementira zaključavanje kako bi se zaštitilo od delimičnog prepisivanja audit token-a, ova zaštita se ne proširuje na ceo objekat veze. Kao rezultat, to stvara ranjivost gde audit token može biti zamenjen tokom intervala između obrade paketa i izvršenja njegovog rukovaoca događajem.
Da bi se iskoristila ova ranjivost, potrebna je sledeća postavka:
- Dva mach servisa, nazvana
A
iB
, oba od kojih mogu uspostaviti vezu. - Servis
A
treba da uključuje proveru autorizacije za specifičnu akciju koju samoB
može izvršiti (korisnička aplikacija ne može). - Servis
A
treba da pošalje poruku koja očekuje odgovor. - Korisnik može poslati poruku
B
na koju će on odgovoriti.
Proces eksploatacije uključuje sledeće korake:
- Sačekajte da servis
A
pošalje poruku koja očekuje odgovor. - Umesto da direktno odgovara
A
, port za odgovor se otima i koristi za slanje poruke servisuB
. - Nakon toga, šalje se poruka koja uključuje zabranjenu akciju, uz očekivanje da će biti obrađena konkurentno sa odgovorom od
B
.
Ispod je vizuelna reprezentacija opisane napadnute situacije:
 (1) (1) (1) (1) (1) (1).png)
.png)
Discovery Problems
- Teškoće u pronalaženju instanci: Pretraživanje instanci korišćenja
xpc_connection_get_audit_token
bilo je izazovno, kako statički tako i dinamički. - Metodologija: Frida je korišćena za povezivanje funkcije
xpc_connection_get_audit_token
, filtrirajući pozive koji ne potiču iz rukovaoca događajem. Međutim, ova metoda je bila ograničena na povezani proces i zahtevala je aktivnu upotrebu. - Analiza alata: Alati poput IDA/Ghidra korišćeni su za ispitivanje dostupnih mach servisa, ali je proces bio vremenski zahtevan, otežan pozivima koji uključuju dyld deljenu keš memoriju.
- Ograničenja skriptiranja: Pokušaji skriptiranja analize za pozive
xpc_connection_get_audit_token
izdispatch_async
blokova bili su ometeni složenostima u analizi blokova i interakcijama sa dyld deljenom keš memorijom.
The fix
- Prijavljeni problemi: Izveštaj je podnet Apple-u koji detaljno opisuje opšte i specifične probleme pronađene unutar
smd
. - Apple-ov odgovor: Apple je rešio problem u
smd
zamenomxpc_connection_get_audit_token
saxpc_dictionary_get_audit_token
. - Priroda popravke: Funkcija
xpc_dictionary_get_audit_token
se smatra sigurnom jer direktno preuzima audit token iz mach poruke vezane za primljenu XPC poruku. Međutim, nije deo javnog API-ja, slično kaoxpc_connection_get_audit_token
. - Odsustvo šire popravke: Ostaje nejasno zašto Apple nije implementirao sveobuhvatniju popravku, kao što je odbacivanje poruka koje se ne poklapaju sa sačuvanim audit token-om veze. Mogućnost legitimnih promena audit token-a u određenim scenarijima (npr. korišćenje
setuid
) može biti faktor. - Trenutni status: Problem i dalje postoji u iOS 17 i macOS 14, predstavljajući izazov za one koji žele da ga identifikuju i razumeju.
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.