macOS Sandbox

Reading time: 15 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

Basic Information

MacOS Sandbox (prvobitno nazvan Seatbelt) ograničava aplikacije koje se pokreću unutar sandboxes-a 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-a. Apple binarni obično se izvršavaju unutar Sandbox-a, a sve aplikacije iz App Store-a imaju tu entitlement. Tako će nekoliko aplikacija biti izvršeno unutar sandboxes-a.

Kako bi se kontrolisalo šta proces može ili ne može da radi, Sandbox ima hooks 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

Containers

Svaka sandboxed aplikacija će imati svoj vlastiti kontejner u ~/Library/Containers/{CFBundleIdentifier} :

bash
ls -l ~/Library/Containers
total 0
drwx------@ 4 username  staff  128 May 23 20:20 com.apple.AMPArtworkAgent
drwx------@ 4 username  staff  128 May 23 20:13 com.apple.AMPDeviceDiscoveryAgent
drwx------@ 4 username  staff  128 Mar 24 18:03 com.apple.AVConference.Diagnostic
drwx------@ 4 username  staff  128 Mar 25 14:14 com.apple.Accessibility-Settings.extension
drwx------@ 4 username  staff  128 Mar 25 14:10 com.apple.ActionKit.BundledIntentHandler
[...]

Unutar svake fascikle sa bundle id možete pronaći plist i Data direktorijum aplikacije sa strukturom koja oponaša Home fasciklu:

bash
cd /Users/username/Library/Containers/com.apple.Safari
ls -la
total 104
drwx------@   4 username  staff    128 Mar 24 18:08 .
drwx------  348 username  staff  11136 May 23 20:57 ..
-rw-r--r--    1 username  staff  50214 Mar 24 18:08 .com.apple.containermanagerd.metadata.plist
drwx------   13 username  staff    416 Mar 24 18:05 Data

ls -l Data
total 0
drwxr-xr-x@  8 username  staff   256 Mar 24 18:08 CloudKit
lrwxr-xr-x   1 username  staff    19 Mar 24 18:02 Desktop -> ../../../../Desktop
drwx------   2 username  staff    64 Mar 24 18:02 Documents
lrwxr-xr-x   1 username  staff    21 Mar 24 18:02 Downloads -> ../../../../Downloads
drwx------  35 username  staff  1120 Mar 24 18:08 Library
lrwxr-xr-x   1 username  staff    18 Mar 24 18:02 Movies -> ../../../../Movies
lrwxr-xr-x   1 username  staff    17 Mar 24 18:02 Music -> ../../../../Music
lrwxr-xr-x   1 username  staff    20 Mar 24 18:02 Pictures -> ../../../../Pictures
drwx------   2 username  staff    64 Mar 24 18:02 SystemData
drwx------   2 username  staff    64 Mar 24 18:02 tmp

caution

Imajte na umu da čak i ako su simboličke veze tu 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.

bash
# Get container config
## You need FDA to access the file, not even just root can read it
plutil -convert xml1 .com.apple.containermanagerd.metadata.plist -o -

# Binary sandbox profile
<key>SandboxProfileData</key>
<data>
AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...

# In this file you can find the entitlements:
<key>Entitlements</key>
<dict>
<key>com.apple.MobileAsset.PhishingImageClassifier2</key>
<true/>
<key>com.apple.accounts.appleaccount.fullaccess</key>
<true/>
<key>com.apple.appattest.spi</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>6N38VWS5BX.ru.keepcoder.Telegram</string>
<string>6N38VWS5BX.ru.keepcoder.TelegramShare</string>
</array>
[...]

# Some parameters
<key>Parameters</key>
<dict>
<key>_HOME</key>
<string>/Users/username</string>
<key>_UID</key>
<string>501</string>
<key>_USER</key>
<string>username</string>
[...]

# The paths it can access
<key>RedirectablePaths</key>
<array>
<string>/Users/username/Downloads</string>
<string>/Users/username/Documents</string>
<string>/Users/username/Library/Calendars</string>
<string>/Users/username/Desktop</string>
<key>RedirectedPaths</key>
<array/>
[...]

warning

Sve što kreira/menja aplikacija u Sandbox-u dobiće atribut karantina. To će sprečiti prostor sandboksovanja aktiviranjem Gatekeeper-a ako aplikacija u sandboksu pokuša da izvrši nešto sa open.

Sandbox Profili

Sandbox profili su konfiguracione datoteke koje označavaju šta će biti dozvoljeno/zabranjeno u tom Sandbox-u. Koristi Sandbox Profile Language (SBPL), koji koristi Scheme programski jezik.

Ovde možete pronaći primer:

scheme
(version 1) ; First you get the version

(deny default) ; Then you shuold indicate the default action when no rule applies

(allow network*) ; You can use wildcards and allow everything

(allow file-read* ; You can specify where to apply the rule
(subpath "/Users/username/")
(literal "/tmp/afile")
(regex #"^/private/etc/.*")
)

(allow mach-lookup
(global-name "com.apple.analyticsd")
)

tip

Proverite ovo istraživanje da biste proverili više akcija koje mogu biti dozvoljene ili odbijene.

Imajte na umu da su u kompajliranoj verziji profila imena operacija zamenjena njihovim unosima u nizu poznatom od strane dylib i kext, š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. Ove prilagođene sandbox profile možete pregledati unutar:

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 korišćenje mreže.

Zatim, neki Apple daemon servisi koriste različite profile smeštene u /System/Library/Sandbox/Profiles/*.sb ili /usr/share/sandbox/*.sb. Ovi sandbox-i se primenjuju u glavnoj funkciji koja poziva API sandbox_init_XXX.

SIP je Sandbox profil nazvan platform_profile u /System/Library/Sandbox/rootless.conf.

Primeri Sandbox Profila

Da biste pokrenuli aplikaciju sa specifičnim sandbox profilom možete koristiti:

bash
sandbox-exec -f example.sb /Path/To/The/Application
touch.sb
(version 1)
(deny default)
(allow file* (literal "/tmp/hacktricks.txt"))
bash
# This will fail because default is denied, so it cannot execute touch
sandbox-exec -f touch.sb touch /tmp/hacktricks.txt
# Check logs
log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last 30s
[...]
2023-05-26 13:42:44.136082+0200  localhost kernel[0]: (Sandbox) Sandbox: sandbox-exec(41398) deny(1) process-exec* /usr/bin/touch
2023-05-26 13:42:44.136100+0200  localhost kernel[0]: (Sandbox) Sandbox: sandbox-exec(41398) deny(1) file-read-metadata /usr/bin/touch
2023-05-26 13:42:44.136321+0200  localhost kernel[0]: (Sandbox) Sandbox: sandbox-exec(41398) deny(1) file-read-metadata /var
2023-05-26 13:42:52.701382+0200  localhost kernel[0]: (Sandbox) 5 duplicate reports for Sandbox: sandbox-exec(41398) deny(1) file-read-metadata /var
[...]
touch2.sb
(version 1)
(deny default)
(allow file* (literal "/tmp/hacktricks.txt"))
(allow process* (literal "/usr/bin/touch"))
; This will also fail because:
; 2023-05-26 13:44:59.840002+0200  localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-metadata /usr/bin/touch
; 2023-05-26 13:44:59.840016+0200  localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-data /usr/bin/touch
; 2023-05-26 13:44:59.840028+0200  localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-data /usr/bin
; 2023-05-26 13:44:59.840034+0200  localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-metadata /usr/lib/dyld
; 2023-05-26 13:44:59.840050+0200  localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) sysctl-read kern.bootargs
; 2023-05-26 13:44:59.840061+0200  localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-data /
touch3.sb
(version 1)
(deny default)
(allow file* (literal "/private/tmp/hacktricks.txt"))
(allow process* (literal "/usr/bin/touch"))
(allow file-read-data (literal "/"))
; This one will work

note

Imajte na umu da softver koji je napisao Apple koji radi na Windows-u nema dodatne bezbednosne mere, kao što je aplikaciono sandboxing.

Primeri zaobilaženja:

Praćenje Sandbox-a

Putem profila

Moguće je pratiti sve provere koje sandbox obavlja svaki put kada se akcija proverava. Za to jednostavno kreirajte sledeći profil:

trace.sb
(version 1)
(trace /tmp/trace.out)

Zatim jednostavno izvršite nešto koristeći taj profil:

bash
sandbox-exec -f /tmp/trace.sb /bin/ls

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

Putem API-ja

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 pozivajući sandbox_vtrace_enable() i zatim dobijajući logove grešaka iz bafera pozivajući sandbox_vtrace_report().

Inspekcija Sandboxes

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 & iOS Sandbox profili

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.

Prilagođeni SBPL u aplikacijama App Store-a

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:

scheme
(sandbox-array-entitlement
"com.apple.security.temporary-exception.sbpl"
(lambda (string)
(let* ((port (open-input-string string)) (sbpl (read port)))
(with-transparent-redirection (eval sbpl)))))

Ovo će evalirati string nakon ovog prava kao Sandbox profil.

Kompilacija i dekompilacija Sandbox profila

Alat sandbox-exec 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 ograničio unutar kontejnera, može pozvati sandbox_spawnattrs_set[container/profilename] i proslediti kontejner ili prethodno postojeći profil.

Debug & Bypass Sandbox

Na macOS-u, za razliku od iOS-a gde su procesi od samog 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 proverite:

macOS Sandbox Debug & Bypass

Sandbox Ekstenzije

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 iskoristi 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 iskorišćen 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.

Proveri PID privilegije

Prema ovome, funkcije sandbox_check (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:

bash
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
sbtool <pid> file /tmp #Check file access
sbtool <pid> inspect #Gives you an explanation of the sandbox profile and extensions
sbtool <pid> all

[un]suspend

Takođe je moguće suspendovati i ponovo aktivirati sandbox koristeći funkcije sandbox_suspend i sandbox_unsuspend iz libsystem_sandbox.dylib.

Napomena da se prilikom pozivanja funkcije suspend proveravaju 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

mac_syscall

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 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.

Sandbox.kext

Napomena da 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: Hook-uje mpo_policy_init i poziva se nakon mac_policy_register. Izvršava većinu inicijalizacija Sandbox-a. 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 podignut 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.

MACF Hooks

Sandbox.kext koristi više od stotinu hook-ova putem MACF. Većina hook-ova ć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 hook-uje 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 jeste, 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 hook-ova 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 povezani binarni fajl, 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 je oznaka dodeljena. Ovo je najduže jer se poziva kada je binarni fajl potpuno učitan, ali još nije izvršen. Izvršiće akcije kao što su kreiranje sandbox objekta, povezivanje sandbox strukture sa kauth akreditivima, uklanjanje pristupa mach portovima...

Napomena da je _cred_sb_evalutate obavijač preko sb_evaluate_internal i ova funkcija dobija akreditive koji su prosleđeni i zatim vrši evaluaciju koristeći eval funkciju koja obično procenjuje platformski profil koji je po defaultu primenjen na sve procese, a zatim specifični procesni profil. Napomena da je platformski profil jedan od glavnih komponenti SIP u macOS.

Sandboxd

Sandbox takođe ima korisnički daemon 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.

References

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