macOS Sandbox
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)
MacOS Sandbox (prvobitno nazvan Seatbelt) ograničava aplikacije koje se izvršavaju unutar sandboxes na dozvoljene radnje specificirane u Sandbox profilu sa kojim aplikacija radi. Ovo pomaže da se osigura da aplikacija pristupa samo očekivanim resursima.
Svaka aplikacija sa entitlement com.apple.security.app-sandbox
će biti izvršena unutar sandboxes. Apple binarni programi se obično izvršavaju unutar Sandbox-a, a sve aplikacije iz App Store-a imaju tu dozvolu. Tako će nekoliko aplikacija biti izvršeno unutar sandboxes.
Da bi kontrolisao šta proces može ili ne može da radi, Sandbox ima hook-ove u skoro svakoj operaciji koju proces može pokušati (uključujući većinu syscalls) koristeći MACF. Međutim, zavisno od entitlements aplikacije, Sandbox može biti permisivniji prema procesu.
Neki važni sastavni delovi Sandbox-a su:
kernel ekstenzija /System/Library/Extensions/Sandbox.kext
privatni framework /System/Library/PrivateFrameworks/AppSandbox.framework
daemon koji se izvršava u userland-u /usr/libexec/sandboxd
kontejneri ~/Library/Containers
Svaka sandboxovana aplikacija će imati svoj vlastiti kontejner u ~/Library/Containers/{CFBundleIdentifier}
:
Unutar svake fascikle sa bundle id možete pronaći plist i Data direktorijum aplikacije sa strukturom koja oponaša Home fasciklu:
Imajte na umu da čak i ako su simboličke veze prisutne da "pobegnu" iz Sandbox-a i pristupe drugim folderima, aplikacija i dalje mora imati dozvole da im pristupi. Ove dozvole su unutar .plist
u RedirectablePaths
.
SandboxProfileData
je kompajlirani sandbox profil CFData kodiran u B64.
Sve što kreira/menja aplikacija u Sandbox-u će dobiti atribut karantina. To će sprečiti prostor sandboksiranja aktiviranjem Gatekeeper-a ako aplikacija u sandboksu pokuša da izvrši nešto sa open
.
Sandbox profili su konfiguracione datoteke koje označavaju šta će biti dozvoljeno/zabranjeno u tom Sandbox-u. Koristi Sandbox Profile Language (SBPL), koja koristi Scheme programski jezik.
Ovde možete pronaći primer:
Proverite ovo istraživanje da biste proverili više akcija koje mogu biti dozvoljene ili zabranjene.
Imajte na umu da su u kompajliranoj verziji profila imena operacija zamenjena njihovim unosima u nizu poznatom dylib-u i kext-u, što čini kompajliranu verziju kraćom i teže čitljivom.
Važne sistemske usluge takođe rade unutar svojih prilagođenih sandbox-a kao što je usluga mdnsresponder
. Možete pregledati ove prilagođene sandbox profile unutar:
/usr/share/sandbox
/System/Library/Sandbox/Profiles
Ostale sandbox profile možete proveriti na https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles.
App Store aplikacije koriste profil /System/Library/Sandbox/Profiles/application.sb
. Možete proveriti u ovom profilu kako privilegije kao što je com.apple.security.network.server
omogućavaju procesu da koristi mrežu.
SIP je Sandbox profil nazvan platform_profile u /System/Library/Sandbox/rootless.conf
Da biste pokrenuli aplikaciju sa specifičnim sandbox profilom možete koristiti:
Napomena da Apple-ov softver koji radi na Windows-u nema dodatne bezbednosne mere, kao što je sandboxing aplikacija.
Primeri zaobilaženja:
https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c (mogu da pišu datoteke van sandbox-a čije ime počinje sa ~$
).
Moguće je pratiti sve provere koje sandbox obavlja svaki put kada se akcija proverava. Za to jednostavno kreirajte sledeći profil:
Zatim jednostavno izvršite nešto koristeći taj profil:
U /tmp/trace.out
moći ćete da vidite svaku proveru sandboxes koja je izvršena svaki put kada je pozvana (dakle, puno duplikata).
Takođe je moguće pratiti sandbox koristeći -t
parametar: sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls
Funkcija sandbox_set_trace_path
koju izlaže libsystem_sandbox.dylib
omogućava da se odredi ime datoteke za praćenje u koju će se zapisivati provere sandboxes.
Takođe je moguće uraditi nešto slično pozivom sandbox_vtrace_enable()
i zatim dobiti logove grešaka iz bafera pozivom sandbox_vtrace_report()
.
libsandbox.dylib
izlaže funkciju pod nazivom sandbox_inspect_pid koja daje listu stanja sandboxes procesa (uključujući ekstenzije). Međutim, samo platforme binarnih datoteka mogu koristiti ovu funkciju.
MacOS čuva sistemske sandbox profile na dve lokacije: /usr/share/sandbox/ i /System/Library/Sandbox/Profiles.
I ako treća strana aplikacija nosi com.apple.security.app-sandbox pravo, sistem primenjuje /System/Library/Sandbox/Profiles/application.sb profil na taj proces.
U iOS-u, podrazumevani profil se zove container i nemamo SBPL tekstualnu reprezentaciju. U memoriji, ovaj sandbox je predstavljen kao binarno stablo Dozvoli/Zabranjeno za svaku dozvolu iz sandboxes.
Moguće je da kompanije učine da njihove aplikacije rade sa prilagođenim Sandbox profilima (umesto sa podrazumevanim). Moraju koristiti pravo com.apple.security.temporary-exception.sbpl
koje mora biti odobreno od strane Apple-a.
Moguće je proveriti definiciju ovog prava u /System/Library/Sandbox/Profiles/application.sb:
Ovo će evalirati string nakon ovog prava kao Sandbox profil.
sandbox-exec
alat koristi funkcije sandbox_compile_*
iz libsandbox.dylib
. Glavne funkcije koje se izvoze su: sandbox_compile_file
(očekuje putanju do datoteke, parametar -f
), sandbox_compile_string
(očekuje string, parametar -p
), sandbox_compile_name
(očekuje ime kontejnera, parametar -n
), sandbox_compile_entitlements
(očekuje entitlements plist).
Ova obrnuta i open sourced verzija alata sandbox-exec omogućava da sandbox-exec
piše u datoteku kompajlirani sandbox profil.
Pored toga, da bi se proces zatvorio unutar kontejnera, može pozvati sandbox_spawnattrs_set[container/profilename]
i proslediti kontejner ili prethodno postojeći profil.
Na macOS-u, za razliku od iOS-a gde su procesi od početka sandboxovani od strane kernela, procesi moraju sami da se prijave za sandbox. To znači da na macOS-u, proces nije ograničen sandbox-om dok aktivno ne odluči da uđe u njega, iako su aplikacije iz App Store-a uvek sandboxovane.
Procesi se automatski sandboxuju iz userlanda kada počnu ako imaju pravo: com.apple.security.app-sandbox
. Za detaljno objašnjenje ovog procesa pogledajte:
Ekstenzije omogućavaju dodatne privilegije objektu i pozivaju jednu od funkcija:
sandbox_issue_extension
sandbox_extension_issue_file[_with_new_type]
sandbox_extension_issue_mach
sandbox_extension_issue_iokit_user_client_class
sandbox_extension_issue_iokit_registry_rentry_class
sandbox_extension_issue_generic
sandbox_extension_issue_posix_ipc
Ekstenzije se čuvaju u drugom MACF label slotu koji je dostupan iz kredencijala procesa. Sledeći sbtool
može pristupiti ovim informacijama.
Napomena da se ekstenzije obično dodeljuju odobrenim procesima, na primer, tccd
će dodeliti token ekstenzije com.apple.tcc.kTCCServicePhotos
kada je proces pokušao da pristupi fotografijama i bio je odobren u XPC poruci. Tada će proces morati da konzumira token ekstenzije kako bi bio dodat njemu.
Napomena da su tokeni ekstenzije dugi heksadecimalni brojevi koji kodiraju dodeljene dozvole. Međutim, nemaju hardkodirani dozvoljeni PID, što znači da bilo koji proces sa pristupom tokenu može biti konzumiran od strane više procesa.
Napomena da su ekstenzije veoma povezane sa pravima, tako da posedovanje određenih prava može automatski dodeliti određene ekstenzije.
Prema ovome, sandbox_check
funkcije (to je __mac_syscall
), mogu proveriti da li je operacija dozvoljena ili ne od strane sandbox-a u određenom PID-u, audit tokenu ili jedinstvenom ID-u.
Alat sbtool (pronađite ga kompajliran ovde) može proveriti da li PID može izvršiti određene akcije:
Takođe je moguće suspendovati i ponovo aktivirati sandbox koristeći funkcije sandbox_suspend
i sandbox_unsuspend
iz libsystem_sandbox.dylib
.
Napomena: da bi se pozvala funkcija suspend, proveravaju se neka prava kako bi se autorizovao pozivalac da je pozove, kao što su:
com.apple.private.security.sandbox-manager
com.apple.security.print
com.apple.security.temporary-exception.audio-unit-host
Ovaj sistemski poziv (#381) očekuje jedan string kao prvi argument koji će označiti modul koji treba pokrenuti, a zatim kod u drugom argumentu koji će označiti funkciju koja treba da se izvrši. Tada će treći argument zavisiti od izvršene funkcije.
Funkcija ___sandbox_ms
obavija mac_syscall
označavajući u prvom argumentu "Sandbox"
baš kao što je ___sandbox_msp
obavijač mac_set_proc
(#387). Tada se neki od podržanih kodova od strane ___sandbox_ms
mogu naći u ovoj tabeli:
set_profile (#0): Primeni kompajlirani ili imenovani profil na proces.
platform_policy (#1): Sprovodi provere politike specifične za platformu (razlikuje se između macOS i iOS).
check_sandbox (#2): Izvrši ručnu proveru specifične sandbox operacije.
note (#3): Dodaje anotaciju sandboxu.
container (#4): Priključuje anotaciju sandboxu, obično za debagovanje ili identifikaciju.
extension_issue (#5): Generiše novu ekstenziju za proces.
extension_consume (#6): Potroši zadatu ekstenziju.
extension_release (#7): Oslobađa memoriju vezanu za potrošenu ekstenziju.
extension_update_file (#8): Menja parametre postojeće ekstenzije datoteke unutar sandboxa.
extension_twiddle (#9): Prilagođava ili menja postojeću ekstenziju datoteke (npr. TextEdit, rtf, rtfd).
suspend (#10): Privremeno suspenduje sve sandbox provere (zahteva odgovarajuća prava).
unsuspend (#11): Nastavlja sve prethodno suspendovane sandbox provere.
passthrough_access (#12): Omogućava direktan pristup resursu, zaobilazeći sandbox provere.
set_container_path (#13): (samo iOS) Postavlja putanju kontejnera za grupu aplikacija ili ID potpisivanja.
container_map (#14): (samo iOS) Preuzima putanju kontejnera iz containermanagerd
.
sandbox_user_state_item_buffer_send (#15): (iOS 10+) Postavlja metapodatke korisničkog režima u sandboxu.
inspect (#16): Pruža informacije za debagovanje o sandboxovanom procesu.
dump (#18): (macOS 11) Dumpuje trenutni profil sandboxa za analizu.
vtrace (#19): Prati sandbox operacije za monitoring ili debagovanje.
builtin_profile_deactivate (#20): (macOS < 11) Deaktivira imenovane profile (npr. pe_i_can_has_debugger
).
check_bulk (#21): Izvršava više sandbox_check
operacija u jednom pozivu.
reference_retain_by_audit_token (#28): Kreira referencu za audit token za korišćenje u sandbox proverama.
reference_release (#29): Oslobađa prethodno zadržanu referencu audit tokena.
rootless_allows_task_for_pid (#30): Proverava da li je task_for_pid
dozvoljen (slično csr
proverama).
rootless_whitelist_push (#31): (macOS) Primeni manifest fajl za zaštitu integriteta sistema (SIP).
rootless_whitelist_check (preflight) (#32): Proverava SIP manifest fajl pre izvršenja.
rootless_protected_volume (#33): (macOS) Primeni SIP zaštite na disk ili particiju.
rootless_mkdir_protected (#34): Primeni SIP/DataVault zaštitu na proces kreiranja direktorijuma.
Napomena: u iOS, kernel ekstenzija sadrži hardkodirane sve profile unutar __TEXT.__const
segmenta kako bi se izbegle izmene. Sledeće su neke zanimljive funkcije iz kernel ekstenzije:
hook_policy_init
: Hookuje mpo_policy_init
i poziva se nakon mac_policy_register
. Izvršava većinu inicijalizacija Sandboxa. Takođe inicijalizuje SIP.
hook_policy_initbsd
: Postavlja sysctl interfejs registrujući security.mac.sandbox.sentinel
, security.mac.sandbox.audio_active
i security.mac.sandbox.debug_mode
(ako je bootovan sa PE_i_can_has_debugger
).
hook_policy_syscall
: Poziva se od strane mac_syscall
sa "Sandbox" kao prvim argumentom i kodom koji označava operaciju u drugom. Koristi se switch za pronalaženje koda koji treba izvršiti prema traženom kodu.
Sandbox.kext
koristi više od stotinu hookova putem MACF. Većina hookova će samo proveriti neke trivijalne slučajeve koji omogućavaju izvršenje akcije, ako ne, pozvaće cred_sb_evalutate
sa akreditivima iz MACF i brojem koji odgovara operaciji koja treba da se izvrši i baferom za izlaz.
Dobar primer toga je funkcija _mpo_file_check_mmap
koja hookuje mmap
i koja će početi da proverava da li nova memorija može biti zapisiva (i ako ne, dozvoliti izvršenje), zatim će proveriti da li se koristi za dyld deljenu keš memoriju i ako je tako, dozvoliti izvršenje, i na kraju će pozvati sb_evaluate_internal
(ili jedan od njegovih obavijača) da izvrši dalja provere dozvola.
Pored toga, od stotina hookova koje Sandbox koristi, postoje 3 koja su posebno zanimljiva:
mpo_proc_check_for
: Primeni profil ako je potrebno i ako prethodno nije primenjen.
mpo_vnode_check_exec
: Poziva se kada proces učita povezanu binarnu datoteku, zatim se vrši provera profila i takođe provera koja zabranjuje SUID/SGID izvršenja.
mpo_cred_label_update_execve
: Ovo se poziva kada se dodeljuje oznaka. Ovo je najduže jer se poziva kada je bina potpuno učitana, ali još nije izvršena. Izvršiće akcije kao što su kreiranje sandbox objekta, povezivanje sandbox strukture sa kauth akreditivima, uklanjanje pristupa mach portovima...
Napomena: _cred_sb_evalutate
je obavijač nad sb_evaluate_internal
i ova funkcija uzima akreditive koji su prosleđeni i zatim vrši evaluaciju koristeći eval
funkciju koja obično evaluira platformski profil koji se po defaultu primenjuje na sve procese, a zatim specifični procesni profil. Napomena: platformski profil je jedna od glavnih komponenti SIP u macOS.
Sandbox takođe ima korisnički demon koji radi i izlaže XPC Mach servis com.apple.sandboxd
i vezuje poseban port 14 (HOST_SEATBELT_PORT
) koji kernel ekstenzija koristi za komunikaciju sa njim. Izlaže neke funkcije koristeći MIG.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)