macOS TCC Bypasses
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)
Ovo nije zaobilaženje, to je samo način na koji TCC funkcioniše: Ne štiti od pisanja. Ako Terminal nema pristup da pročita Desktop korisnika, i dalje može da piše u njega:
The proširena atribut com.apple.macl
se dodaje novom fajlu kako bi se aplikaciji kreatora omogućio pristup za čitanje.
Moguće je staviti prozor preko TCC prompta kako bi korisnik prihvatio to bez da primeti. Možete pronaći PoC u TCC-ClickJacking.
Napadač može napraviti aplikacije sa bilo kojim imenom (npr. Finder, Google Chrome...) u Info.plist
i učiniti da zatraži pristup nekoj TCC zaštićenoj lokaciji. Korisnik će pomisliti da je legitimna aplikacija ta koja traži ovaj pristup.
Štaviše, moguće je ukloniti legitimnu aplikaciju iz Dock-a i staviti lažnu umesto nje, tako da kada korisnik klikne na lažnu (koja može koristiti istu ikonu) može pozvati legitimnu, zatražiti TCC dozvole i izvršiti malware, navodeći korisnika da veruje da je legitimna aplikacija tražila pristup.
Više informacija i PoC u:
Podrazumevano, pristup putem SSH je imao "Full Disk Access". Da biste onemogućili ovo, potrebno je da bude navedeno, ali onemogućeno (uklanjanje sa liste neće ukloniti te privilegije):
Ovde možete pronaći primere kako su neki malware-ovi mogli da zaobiđu ovu zaštitu:
Napomena da sada, da biste mogli da omogućite SSH, potrebna vam je Full Disk Access
Atribut com.apple.macl
se dodeljuje fajlovima kako bi se određenoj aplikaciji omogućile dozvole za čitanje. Ovaj atribut se postavlja kada se prevuče i ispusti fajl preko aplikacije, ili kada korisnik duplo klikne na fajl da ga otvori sa podrazumevanom aplikacijom.
Stoga, korisnik može registrovati zloćudnu aplikaciju da upravlja svim ekstenzijama i pozvati Launch Services da otvori bilo koji fajl (tako da će zloćudni fajl dobiti pristup za čitanje).
Pravo com.apple.private.icloud-account-access
omogućava komunikaciju sa com.apple.iCloudHelper
XPC servisom koji će obezbediti iCloud tokene.
iMovie i Garageband su imale ovo pravo i druge koje su to omogućavale.
Za više informacija o eksploatu za dobijanje iCloud tokena iz tog prava, pogledajte predavanje: #OBTS v5.0: "Šta se dešava na vašem Mac-u, ostaje na Apple-ovom iCloud-u?!" - Wojciech Regula
Aplikacija sa kTCCServiceAppleEvents
dozvolom će moći da kontroliše druge aplikacije. To znači da bi mogla da zloupotrebi dozvole dodeljene drugim aplikacijama.
Za više informacija o Apple skriptama, pogledajte:
Na primer, ako aplikacija ima dozvolu za automatizaciju nad iTerm
, na primer u ovom primeru Terminal
ima pristup nad iTerm:
Terminal, koji nema FDA, može pozvati iTerm, koji ga ima, i koristiti ga za izvršavanje akcija:
Ili ako aplikacija ima pristup preko Findera, mogla bi koristiti skriptu poput ove:
Korisnički tccd daemon koristi HOME
env promenljivu za pristup TCC korisničkoj bazi podataka iz: $HOME/Library/Application Support/com.apple.TCC/TCC.db
Prema ovom Stack Exchange postu i zato što TCC daemon radi putem launchd
unutar domena trenutnog korisnika, moguće je kontrolisati sve promenljive okruženja koje se prosleđuju njemu.
Tako, napadač može postaviti $HOME
promenljivu okruženja u launchctl
da pokazuje na kontrolisanu direktoriju, ponovo pokrenuti TCC daemon, i zatim direktno izmeniti TCC bazu podataka da bi sebi dao svaku dostupnu TCC privilegiju bez ikakvog obaveštavanja krajnjeg korisnika.
PoC:
Beleške su imale pristup TCC zaštićenim lokacijama, ali kada se beleška kreira, ona se kreira na nezaštićenoj lokaciji. Dakle, mogli biste tražiti od beleški da kopira zaštićenu datoteku u belešku (tako u nezaštićenoj lokaciji) i zatim pristupiti datoteci:
Binarni fajl /usr/libexec/lsd
sa bibliotekom libsecurity_translocate
imao je pravo com.apple.private.nullfs_allow
koje mu je omogućilo da kreira nullfs montiranje i imao je pravo com.apple.private.tcc.allow
sa kTCCServiceSystemPolicyAllFiles
da pristupi svakoj datoteci.
Bilo je moguće dodati atribut karantina na "Biblioteku", pozvati com.apple.security.translocation
XPC servis i tada bi se Biblioteka mapirala na $TMPDIR/AppTranslocation/d/d/Library
gde su svi dokumenti unutar Biblioteke mogli biti pristupani.
Muzika
ima zanimljivu funkciju: Kada se pokrene, uvozi datoteke koje su bačene u ~/Music/Music/Media.localized/Automatically Add to Music.localized
u korisničku "medijsku biblioteku". Štaviše, poziva nešto poput: rename(a, b);
gde su a
i b
:
a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"
b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3
Ovo rename(a, b);
ponašanje je ranjivo na Race Condition, jer je moguće staviti unutar foldera Automatically Add to Music.localized
lažni TCC.db fajl i zatim, kada se novi folder (b) kreira, kopirati datoteku, obrisati je i usmeriti je na ~/Library/Application Support/com.apple.TCC
/.
Ako SQLITE_SQLLOG_DIR="putanja/folder"
to u suštini znači da se baza podataka koja je otvorena kopira na tu putanju. U ovom CVE-u ova kontrola je zloupotrebljena da se piše unutar SQLite baze podataka koja će biti otvorena od strane procesa sa FDA TCC bazom podataka, a zatim zloupotrebi SQLITE_SQLLOG_DIR
sa symlink-om u imenu fajla tako da kada je ta baza podataka otvorena, korisnička TCC.db se prepisuje sa otvorenom.
Više informacija u izveštaju i u predavanju.
Ako je promenljiva okruženja SQLITE_AUTO_TRACE
postavljena, biblioteka libsqlite3.dylib
će početi da beleži sve SQL upite. Mnoge aplikacije su koristile ovu biblioteku, tako da je bilo moguće zabeležiti sve njihove SQLite upite.
Nekoliko Apple aplikacija koristilo je ovu biblioteku za pristup TCC zaštićenim informacijama.
Ova env varijabla se koristi od strane Metal
okvira koji je zavisnost raznih programa, najistaknutije Music
, koji ima FDA.
Postavljanje sledećeg: MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"
. Ako je path
važeći direktorijum, greška će se aktivirati i možemo koristiti fs_usage
da vidimo šta se dešava u programu:
fajl će biti open()
ovan, nazvan path/.dat.nosyncXXXX.XXXXXX
(X je nasumičan)
jedan ili više write()
će napisati sadržaj u fajl (mi to ne kontrolišemo)
path/.dat.nosyncXXXX.XXXXXX
će biti renamed()
u path/name
To je privremeno pisanje fajla, praćeno rename(old, new)
koje nije sigurno.
Nije sigurno jer mora da reši stare i nove putanje odvojeno, što može potrajati i može biti ranjivo na Race Condition. Za više informacija možete proveriti xnu
funkciju renameat_internal()
.
Dakle, u suštini, ako privilegovani proces preimenuje iz foldera koji kontrolišete, mogli biste dobiti RCE i naterati ga da pristupi drugom fajlu ili, kao u ovom CVE, otvorite fajl koji je privilegovana aplikacija kreirala i sačuvate FD.
Ako preimenovanje pristupa folderu koji kontrolišete, dok ste izmenili izvorni fajl ili imate FD za njega, menjate odredišni fajl (ili folder) da pokazuje na symlink, tako da možete pisati kad god želite.
Ovo je bio napad u CVE: Na primer, da bismo prepisali korisnikov TCC.db
, možemo:
kreirati /Users/hacker/ourlink
da pokazuje na /Users/hacker/Library/Application Support/com.apple.TCC/
kreirati direktorijum /Users/hacker/tmp/
postaviti MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db
aktivirati grešku pokretanjem Music
sa ovom env varijablom
uhvatiti open()
od /Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX
(X je nasumičan)
ovde takođe open()
ovaj fajl za pisanje, i zadržati deskriptor fajla
atomatski zameniti /Users/hacker/tmp
sa /Users/hacker/ourlink
u petlji
radimo ovo da bismo maksimizovali naše šanse za uspeh jer je prozor trke prilično mali, ali gubitak trke ima zanemarljivu negativnu stranu
malo sačekati
testirati da li smo imali sreće
ako ne, ponovo pokrenuti od vrha
Više informacija na https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html
Sada, ako pokušate da koristite env varijablu MTL_DUMP_PIPELINES_TO_JSON_FILE
, aplikacije se neće pokrenuti
Kao root mogli biste omogućiti ovu uslugu i ARD agent će imati pun pristup disku koji bi zatim mogao biti zloupotrebljen od strane korisnika da napravi kopiju nove TCC korisničke baze podataka.
TCC koristi bazu podataka u korisnikovom HOME folderu da kontroliše pristup resursima specifičnim za korisnika na $HOME/Library/Application Support/com.apple.TCC/TCC.db. Stoga, ako korisnik uspe da ponovo pokrene TCC sa $HOME env varijablom koja pokazuje na drugi folder, korisnik bi mogao da kreira novu TCC bazu podataka u /Library/Application Support/com.apple.TCC/TCC.db i prevari TCC da dodeli bilo koju TCC dozvolu bilo kojoj aplikaciji.
Napomena da Apple koristi podešavanje smešteno unutar korisničkog profila u NFSHomeDirectory
atributu za vrednost $HOME
, tako da ako kompromitujete aplikaciju sa dozvolama za izmenu ove vrednosti (kTCCServiceSystemPolicySysAdminFiles
), možete oružati ovu opciju sa TCC zaobilaženjem.
Prvi POC koristi dsexport i dsimport da izmeni HOME folder korisnika.
Dobiti csreq blob za ciljan app.
Postaviti lažni TCC.db fajl sa potrebnim pristupom i csreq blob.
Izvesti korisnički Directory Services unos sa dsexport.
Izmeniti Directory Services unos da promeni korisnikov home direktorijum.
Uvesti izmenjeni Directory Services unos sa dsimport.
Zaustaviti korisnikov tccd i ponovo pokrenuti proces.
Drugi POC je koristio /usr/libexec/configd
koji je imao com.apple.private.tcc.allow
sa vrednošću kTCCServiceSystemPolicySysAdminFiles
.
Bilo je moguće pokrenuti configd
sa -t
opcijom, napadač je mogao da specificira prilagođeni Bundle za učitavanje. Stoga, eksploatacija menja dsexport
i dsimport
metodu promene korisnikovog home direktorijuma sa configd
kod injekcijom.
Za više informacija pogledajte originalni izveštaj.
Postoje različite tehnike za injekciju koda unutar procesa i zloupotrebu njegovih TCC privilegija:
Štaviše, najčešća injekcija procesa za zaobilaženje TCC koja je pronađena je putem pluginova (load library). Pluginovi su dodatni kod obično u obliku biblioteka ili plist, koji će biti učitani od strane glavne aplikacije i izvršavaće se pod njenim kontekstom. Stoga, ako je glavna aplikacija imala pristup TCC ograničenim fajlovima (putem dodeljenih dozvola ili prava), prilagođeni kod će takođe imati pristup.
Aplikacija /System/Library/CoreServices/Applications/Directory Utility.app
imala je pravo kTCCServiceSystemPolicySysAdminFiles
, učitavala je pluginove sa .daplug
ekstenzijom i nije imala pojačanu runtime zaštitu.
Da bi se oružala ova CVE, NFSHomeDirectory
je promenjen (zloupotrebljavajući prethodno pravo) kako bi se moglo preuzeti korisničku TCC bazu podataka za zaobilaženje TCC.
Za više informacija pogledajte originalni izveštaj.
Binarni fajl /usr/sbin/coreaudiod
imao je prava com.apple.security.cs.disable-library-validation
i com.apple.private.tcc.manager
. Prvo dozvoljava injekciju koda a drugo mu daje pristup da upravlja TCC.
Ovaj binarni fajl je omogućio učitavanje pluginova trećih strana iz foldera /Library/Audio/Plug-Ins/HAL
. Stoga, bilo je moguće učitati plugin i zloupotrebljavati TCC dozvole sa ovim PoC:
Za više informacija pogledajte originalni izveštaj.
Sistemske aplikacije koje otvaraju kameru putem Core Media I/O (aplikacije sa kTCCServiceCamera
) učitavaju u procesu ove plug-inove smeštene u /Library/CoreMediaIO/Plug-Ins/DAL
(nije pod SIP restrikcijama).
Samo čuvanje biblioteke sa zajedničkim konstruktorom će raditi za injekciju koda.
Nekoliko Apple aplikacija je bilo ranjivo na ovo.
Aplikacija Firefox je imala com.apple.security.cs.disable-library-validation
i com.apple.security.cs.allow-dyld-environment-variables
privilegije:
Za više informacija o tome kako lako iskoristiti ovo proverite originalni izveštaj.
Binarni fajl /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl
imao je ovlašćenja com.apple.private.tcc.allow
i com.apple.security.get-task-allow
, što je omogućilo injektovanje koda unutar procesa i korišćenje TCC privilegija.
Telegram je imao ovlašćenja com.apple.security.cs.allow-dyld-environment-variables
i com.apple.security.cs.disable-library-validation
, tako da je bilo moguće zloupotrebiti ga da dobijete pristup njegovim dozvolama kao što je snimanje kamerom. Možete pronaći payload u izveštaju.
Napomena kako koristiti env varijablu za učitavanje biblioteke, custom plist je kreiran za injektovanje ove biblioteke i launchctl
je korišćen za pokretanje:
open
Moguće je pozvati open
čak i dok je u sandboxu
Uobičajeno je dati terminalu Full Disk Access (FDA), barem na računarima koje koriste tehnički ljudi. I moguće je pozvati .terminal
skripte koristeći to.
.terminal
skripte su plist datoteke kao što je ova sa komandom za izvršavanje u CommandString
ključiću:
Jedna aplikacija može napisati terminalski skript na lokaciji kao što je /tmp i pokrenuti ga sa komandom kao što je:
Bilo koji korisnik (čak i oni bez privilegija) može da kreira i montira snapshot vremenske mašine i pristupi SVI datotekama tog snapshot-a.
Jedina privilegija koja je potrebna je da aplikacija koja se koristi (kao što je Terminal
) ima Pristup celom disku (FDA) (kTCCServiceSystemPolicyAllfiles
) koji mora da odobri administrator.
Detaljnije objašnjenje može se pronaći u originalnom izveštaju.
Čak i ako je TCC DB datoteka zaštićena, bilo je moguće montirati novu TCC.db datoteku preko direktorijuma:
Check the full exploit in the original writeup.
Alat /usr/sbin/asr
omogućava kopiranje celog diska i montiranje na drugo mesto, zaobilazeći TCC zaštite.
Postoji treća TCC baza podataka u /var/db/locationd/clients.plist
koja označava klijente kojima je dozvoljen pristup uslugama lokacije.
Folder /var/db/locationd/
nije bio zaštićen od DMG montiranja, tako da je bilo moguće montirati našu plist datoteku.
U nekoliko slučajeva datoteke će čuvati osetljive informacije kao što su emailovi, brojevi telefona, poruke... na nezaštićenim mestima (što se smatra ranjivošću u Apple-u).
Ovo više ne funkcioniše, ali je funkcionisalo u prošlosti:
Drugi način koristeći CoreGraphics događaje:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)