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 (inizialmente chiamato Seatbelt) limita le applicazioni in esecuzione all'interno della sandbox alle azioni consentite specificate nel profilo Sandbox con cui l'app è in esecuzione. Questo aiuta a garantire che l'applicazione accederà solo alle risorse previste.
Qualsiasi app con l'entitlement com.apple.security.app-sandbox
verrà eseguita all'interno della sandbox. I binari Apple vengono solitamente eseguiti all'interno di una Sandbox, e tutte le applicazioni dell'App Store hanno quell'entitlement. Quindi diverse applicazioni verranno eseguite all'interno della sandbox.
Per controllare cosa un processo può o non può fare, la Sandbox ha hook in quasi ogni operazione che un processo potrebbe tentare (inclusi la maggior parte delle syscalls) utilizzando MACF. Tuttavia, dipendendo dagli entitlements dell'app, la Sandbox potrebbe essere più permissiva con il processo.
Alcuni componenti importanti della Sandbox sono:
L'estensione del kernel /System/Library/Extensions/Sandbox.kext
Il framework privato /System/Library/PrivateFrameworks/AppSandbox.framework
Un daemon in esecuzione in userland /usr/libexec/sandboxd
I contenitori ~/Library/Containers
Ogni applicazione sandboxed avrà il proprio contenitore in ~/Library/Containers/{CFBundleIdentifier}
:
All'interno di ogni cartella dell'ID bundle puoi trovare il plist e la directory Data dell'App con una struttura che imita la cartella Home:
Nota che anche se i symlink sono presenti per "uscire" dal Sandbox e accedere ad altre cartelle, l'App deve comunque avere permessi per accedervi. Questi permessi sono all'interno del .plist
in RedirectablePaths
.
Il SandboxProfileData
è il profilo sandbox compilato CFData codificato in B64.
Tutto ciò che viene creato/modificato da un'applicazione in Sandbox riceverà l'attributo di quarantena. Questo impedirà a uno spazio sandbox di attivare Gatekeeper se l'app sandbox tenta di eseguire qualcosa con open
.
I profili Sandbox sono file di configurazione che indicano cosa sarà consentito/vietato in quel Sandbox. Utilizza il Sandbox Profile Language (SBPL), che utilizza il linguaggio di programmazione Scheme.
Qui puoi trovare un esempio:
Controlla questa ricerca per verificare ulteriori azioni che potrebbero essere consentite o negate.
Nota che nella versione compilata di un profilo, i nomi delle operazioni sono sostituiti dalle loro voci in un array conosciuto dalla dylib e dal kext, rendendo la versione compilata più corta e più difficile da leggere.
Importanti servizi di sistema vengono eseguiti all'interno del proprio sandbox personalizzato, come il servizio mdnsresponder
. Puoi visualizzare questi profili sandbox personalizzati all'interno di:
/usr/share/sandbox
/System/Library/Sandbox/Profiles
Altri profili sandbox possono essere controllati su https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles.
Le app dell'App Store utilizzano il profilo /System/Library/Sandbox/Profiles/application.sb
. Puoi controllare in questo profilo come i diritti, come com.apple.security.network.server
, consentono a un processo di utilizzare la rete.
SIP è un profilo Sandbox chiamato platform_profile in /System/Library/Sandbox/rootless.conf
Per avviare un'applicazione con un profilo sandbox specifico puoi usare:
Nota che il software autorizzato da Apple che gira su Windows non ha precauzioni di sicurezza aggiuntive, come il sandboxing delle applicazioni.
Esempi di bypass:
https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c (sono in grado di scrivere file al di fuori del sandbox il cui nome inizia con ~$
).
È possibile tracciare tutti i controlli che il sandbox esegue ogni volta che viene verificata un'azione. Per farlo, crea semplicemente il seguente profilo:
E poi esegui semplicemente qualcosa utilizzando quel profilo:
In /tmp/trace.out
potrai vedere ogni controllo sandbox eseguito ogni volta che è stato chiamato (quindi, molti duplicati).
È anche possibile tracciare la sandbox utilizzando il parametro -t
: sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls
La funzione sandbox_set_trace_path
esportata da libsystem_sandbox.dylib
consente di specificare un nome file di traccia in cui verranno scritti i controlli sandbox.
È anche possibile fare qualcosa di simile chiamando sandbox_vtrace_enable()
e poi ottenendo i log di errore dal buffer chiamando sandbox_vtrace_report()
.
libsandbox.dylib
esporta una funzione chiamata sandbox_inspect_pid che fornisce un elenco dello stato della sandbox di un processo (inclusi le estensioni). Tuttavia, solo i binari della piattaforma possono utilizzare questa funzione.
MacOS memorizza i profili sandbox di sistema in due posizioni: /usr/share/sandbox/ e /System/Library/Sandbox/Profiles.
E se un'applicazione di terze parti porta il diritto com.apple.security.app-sandbox, il sistema applica il profilo /System/Library/Sandbox/Profiles/application.sb a quel processo.
In iOS, il profilo predefinito si chiama container e non abbiamo la rappresentazione testuale SBPL. In memoria, questa sandbox è rappresentata come un albero binario Allow/Deny per ciascun permesso della sandbox.
Potrebbe essere possibile per le aziende far funzionare le loro app con profili Sandbox personalizzati (invece di quello predefinito). Devono utilizzare il diritto com.apple.security.temporary-exception.sbpl
che deve essere autorizzato da Apple.
È possibile controllare la definizione di questo diritto in /System/Library/Sandbox/Profiles/application.sb:
Questo valuterà la stringa dopo questo diritto come un profilo Sandbox.
Il sandbox-exec
utilizza le funzioni sandbox_compile_*
da libsandbox.dylib
. Le principali funzioni esportate sono: sandbox_compile_file
(si aspetta un percorso di file, parametro -f
), sandbox_compile_string
(si aspetta una stringa, parametro -p
), sandbox_compile_name
(si aspetta un nome di un contenitore, parametro -n
), sandbox_compile_entitlements
(si aspetta un plist di diritti).
Questa versione invertita e open source dello strumento sandbox-exec consente di far scrivere a sandbox-exec
in un file il profilo sandbox compilato.
Inoltre, per confinare un processo all'interno di un contenitore, potrebbe chiamare sandbox_spawnattrs_set[container/profilename]
e passare un contenitore o un profilo preesistente.
Su macOS, a differenza di iOS dove i processi sono sandboxati fin dall'inizio dal kernel, i processi devono optare per la sandbox da soli. Ciò significa che su macOS, un processo non è limitato dalla sandbox fino a quando non decide attivamente di entrarvi, anche se le app dell'App Store sono sempre sandboxate.
I processi sono automaticamente sandboxati dal userland quando iniziano se hanno il diritto: com.apple.security.app-sandbox
. Per una spiegazione dettagliata di questo processo controlla:
Le estensioni consentono di dare ulteriori privilegi a un oggetto e vengono attivate chiamando una delle funzioni:
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
Le estensioni sono memorizzate nel secondo slot di etichetta MACF accessibile dalle credenziali del processo. Il seguente sbtool
può accedere a queste informazioni.
Nota che le estensioni sono solitamente concesse dai processi autorizzati, ad esempio, tccd
concederà il token di estensione di com.apple.tcc.kTCCServicePhotos
quando un processo tenta di accedere alle foto ed è stato autorizzato in un messaggio XPC. Poi, il processo dovrà consumare il token di estensione affinché venga aggiunto a esso.
Nota che i token di estensione sono lunghi esadecimali che codificano i permessi concessi. Tuttavia, non hanno il PID autorizzato hardcoded, il che significa che qualsiasi processo con accesso al token potrebbe essere consumato da più processi.
Nota che le estensioni sono molto correlate ai diritti, quindi avere determinati diritti potrebbe automaticamente concedere determinate estensioni.
Secondo questo, le funzioni sandbox_check
(è un __mac_syscall
), possono controllare se un'operazione è consentita o meno dalla sandbox in un certo PID, audit token o ID unico.
Il tool sbtool (trovalo compilato qui) può controllare se un PID può eseguire determinate azioni:
È anche possibile sospendere e riattivare il sandbox utilizzando le funzioni sandbox_suspend
e sandbox_unsuspend
da libsystem_sandbox.dylib
.
Nota che per chiamare la funzione di sospensione vengono controllati alcuni diritti per autorizzare il chiamante a chiamarla come:
com.apple.private.security.sandbox-manager
com.apple.security.print
com.apple.security.temporary-exception.audio-unit-host
Questa chiamata di sistema (#381) si aspetta un primo argomento stringa che indicherà il modulo da eseguire, e poi un codice nel secondo argomento che indicherà la funzione da eseguire. Poi il terzo argomento dipenderà dalla funzione eseguita.
La funzione ___sandbox_ms
chiama mac_syscall
indicando nel primo argomento "Sandbox"
proprio come ___sandbox_msp
è un wrapper di mac_set_proc
(#387). Poi, alcuni dei codici supportati da ___sandbox_ms
possono essere trovati in questa tabella:
set_profile (#0): Applica un profilo compilato o nominato a un processo.
platform_policy (#1): Applica controlli di policy specifici per la piattaforma (varia tra macOS e iOS).
check_sandbox (#2): Esegue un controllo manuale di un'operazione sandbox specifica.
note (#3): Aggiunge una notazione a un Sandbox
container (#4): Attacca un'annotazione a un sandbox, tipicamente per il debug o identificazione.
extension_issue (#5): Genera una nuova estensione per un processo.
extension_consume (#6): Consuma un'estensione data.
extension_release (#7): Rilascia la memoria legata a un'estensione consumata.
extension_update_file (#8): Modifica i parametri di un'estensione di file esistente all'interno del sandbox.
extension_twiddle (#9): Regola o modifica un'estensione di file esistente (es. TextEdit, rtf, rtfd).
suspend (#10): Sospende temporaneamente tutti i controlli del sandbox (richiede diritti appropriati).
unsuspend (#11): Riprende tutti i controlli del sandbox precedentemente sospesi.
passthrough_access (#12): Consente l'accesso diretto a una risorsa, bypassando i controlli del sandbox.
set_container_path (#13): (solo iOS) Imposta un percorso del contenitore per un gruppo di app o ID di firma.
container_map (#14): (solo iOS) Recupera un percorso del contenitore da containermanagerd
.
sandbox_user_state_item_buffer_send (#15): (iOS 10+) Imposta i metadati della modalità utente nel sandbox.
inspect (#16): Fornisce informazioni di debug su un processo sandboxed.
dump (#18): (macOS 11) Dump del profilo attuale di un sandbox per analisi.
vtrace (#19): Traccia le operazioni del sandbox per monitoraggio o debug.
builtin_profile_deactivate (#20): (macOS < 11) Disattiva profili nominati (es. pe_i_can_has_debugger
).
check_bulk (#21): Esegue più operazioni sandbox_check
in una singola chiamata.
reference_retain_by_audit_token (#28): Crea un riferimento per un token di audit da utilizzare nei controlli del sandbox.
reference_release (#29): Rilascia un riferimento di token di audit precedentemente mantenuto.
rootless_allows_task_for_pid (#30): Verifica se task_for_pid
è consentito (simile ai controlli csr
).
rootless_whitelist_push (#31): (macOS) Applica un file di manifest di System Integrity Protection (SIP).
rootless_whitelist_check (preflight) (#32): Controlla il file di manifest SIP prima dell'esecuzione.
rootless_protected_volume (#33): (macOS) Applica protezioni SIP a un disco o partizione.
rootless_mkdir_protected (#34): Applica protezione SIP/DataVault a un processo di creazione di directory.
Nota che in iOS l'estensione del kernel contiene tutti i profili hardcoded all'interno del segmento __TEXT.__const
per evitare che vengano modificati. Le seguenti sono alcune funzioni interessanti dall'estensione del kernel:
hook_policy_init
: Collega mpo_policy_init
ed è chiamato dopo mac_policy_register
. Esegue la maggior parte delle inizializzazioni del Sandbox. Inizializza anche SIP.
hook_policy_initbsd
: Imposta l'interfaccia sysctl registrando security.mac.sandbox.sentinel
, security.mac.sandbox.audio_active
e security.mac.sandbox.debug_mode
(se avviato con PE_i_can_has_debugger
).
hook_policy_syscall
: È chiamato da mac_syscall
con "Sandbox" come primo argomento e codice che indica l'operazione nel secondo. Viene utilizzato uno switch per trovare il codice da eseguire in base al codice richiesto.
Sandbox.kext
utilizza più di un centinaio di hook tramite MACF. La maggior parte degli hook controllerà solo alcuni casi banali che consentono di eseguire l'azione, altrimenti chiameranno cred_sb_evalutate
con le credenziali da MACF e un numero corrispondente all'operazione da eseguire e un buffer per l'output.
Un buon esempio di ciò è la funzione _mpo_file_check_mmap
che ha agganciato mmap
e che inizierà a controllare se la nuova memoria sarà scrivibile (e se non lo è, consentirà l'esecuzione), poi controllerà se è utilizzata per la cache condivisa dyld e, se sì, consentirà l'esecuzione, e infine chiamerà sb_evaluate_internal
(o uno dei suoi wrapper) per eseguire ulteriori controlli di autorizzazione.
Inoltre, tra i centinaia di hook utilizzati dal Sandbox, ce ne sono 3 in particolare che sono molto interessanti:
mpo_proc_check_for
: Applica il profilo se necessario e se non era stato precedentemente applicato
mpo_vnode_check_exec
: Chiamato quando un processo carica il binario associato, quindi viene eseguito un controllo del profilo e anche un controllo che vieta le esecuzioni SUID/SGID.
mpo_cred_label_update_execve
: Questo viene chiamato quando l'etichetta viene assegnata. Questo è il più lungo poiché viene chiamato quando il binario è completamente caricato ma non è ancora stato eseguito. Eseguirà azioni come la creazione dell'oggetto sandbox, l'attacco della struttura sandbox alle credenziali kauth, la rimozione dell'accesso alle porte mach...
Nota che _cred_sb_evalutate
è un wrapper su sb_evaluate_internal
e questa funzione ottiene le credenziali passate e poi esegue la valutazione utilizzando la funzione eval
che di solito valuta il profilo della piattaforma che è per impostazione predefinita applicato a tutti i processi e poi il profilo del processo specifico. Nota che il profilo della piattaforma è uno dei principali componenti di SIP in macOS.
Il Sandbox ha anche un demone utente in esecuzione che espone il servizio XPC Mach com.apple.sandboxd
e lega la porta speciale 14 (HOST_SEATBELT_PORT
) che l'estensione del kernel utilizza per comunicare con esso. Espone alcune funzioni utilizzando MIG.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)