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 (αρχικά ονομαζόταν Seatbelt) περιορίζει τις εφαρμογές που εκτελούνται μέσα στο sandbox στις επιτρεπόμενες ενέργειες που καθορίζονται στο προφίλ Sandbox με το οποίο εκτελείται η εφαρμογή. Αυτό βοηθά να διασφαλιστεί ότι η εφαρμογή θα έχει πρόσβαση μόνο σε αναμενόμενους πόρους.
Οποιαδήποτε εφαρμογή με την παροχή com.apple.security.app-sandbox
θα εκτελείται μέσα στο sandbox. Οι δυαδικοί κωδικοί της Apple εκτελούνται συνήθως μέσα σε ένα Sandbox, και όλες οι εφαρμογές από το App Store έχουν αυτή την παροχή. Έτσι, πολλές εφαρμογές θα εκτελούνται μέσα στο sandbox.
Για να ελέγξει τι μπορεί ή δεν μπορεί να κάνει μια διαδικασία, το Sandbox έχει hooks σε σχεδόν οποιαδήποτε λειτουργία μπορεί να προσπαθήσει μια διαδικασία (συμπεριλαμβανομένων των περισσότερων syscalls) χρησιμοποιώντας MACF. Ωστόσο, ανάλογα με τις παροχές της εφαρμογής, το Sandbox μπορεί να είναι πιο επιεικές με τη διαδικασία.
Ορισμένα σημαντικά στοιχεία του Sandbox είναι:
Η επέκταση πυρήνα /System/Library/Extensions/Sandbox.kext
Το ιδιωτικό πλαίσιο /System/Library/PrivateFrameworks/AppSandbox.framework
Ένας daemon που εκτελείται στο userland /usr/libexec/sandboxd
Οι κοντέινερ ~/Library/Containers
Κάθε sandboxed εφαρμογή θα έχει το δικό της κοντέινερ στο ~/Library/Containers/{CFBundleIdentifier}
:
Μέσα σε κάθε φάκελο bundle id μπορείτε να βρείτε το plist και τον φάκελο Δεδομένων της εφαρμογής με μια δομή που μιμείται τον φάκελο Home:
Σημειώστε ότι ακόμη και αν τα symlinks είναι εκεί για να "διαφύγουν" από το Sandbox και να αποκτήσουν πρόσβαση σε άλλους φακέλους, η εφαρμογή πρέπει να έχει άδειες για να τους προσπελάσει. Αυτές οι άδειες βρίσκονται μέσα στο .plist
στο RedirectablePaths
.
Τα SandboxProfileData
είναι το συμπιεσμένο προφίλ sandbox CFData που έχει διαφύγει σε B64.
Ό,τι δημιουργείται/τροποποιείται από μια εφαρμογή που είναι σε Sandbox θα αποκτήσει το quarantine attribute. Αυτό θα αποτρέψει έναν χώρο sandbox ενεργοποιώντας τον Gatekeeper αν η εφαρμογή sandbox προσπαθήσει να εκτελέσει κάτι με open
.
Τα Sandbox profiles είναι αρχεία ρύθμισης που υποδεικνύουν τι θα είναι επιτρεπτό/απαγορευμένο σε αυτό το Sandbox. Χρησιμοποιεί τη Sandbox Profile Language (SBPL), η οποία χρησιμοποιεί τη γλώσσα προγραμματισμού Scheme.
Εδώ μπορείτε να βρείτε ένα παράδειγμα:
Δείτε αυτήν την έρευνα για να ελέγξετε περισσότερες ενέργειες που θα μπορούσαν να επιτραπούν ή να απορριφθούν.
Σημειώστε ότι στην συμπιεσμένη έκδοση ενός προφίλ, τα ονόματα των λειτουργιών αντικαθίστανται από τις καταχωρήσεις τους σε έναν πίνακα που είναι γνωστός από το dylib και το kext, καθιστώντας τη συμπιεσμένη έκδοση πιο σύντομη και πιο δύσκολη στην ανάγνωση.
Σημαντικές υπηρεσίες συστήματος εκτελούνται επίσης μέσα στο δικό τους προσαρμοσμένο sandbox, όπως η υπηρεσία mdnsresponder
. Μπορείτε να δείτε αυτά τα προσαρμοσμένα προφίλ sandbox μέσα σε:
/usr/share/sandbox
/System/Library/Sandbox/Profiles
Άλλα προφίλ sandbox μπορούν να ελεγχθούν στο https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles.
Οι εφαρμογές του App Store χρησιμοποιούν το προφίλ /System/Library/Sandbox/Profiles/application.sb
. Μπορείτε να ελέγξετε σε αυτό το προφίλ πώς οι εξουσιοδοτήσεις όπως com.apple.security.network.server
επιτρέπουν σε μια διαδικασία να χρησιμοποιεί το δίκτυο.
Το SIP είναι ένα προφίλ Sandbox που ονομάζεται platform_profile στο /System/Library/Sandbox/rootless.conf
Για να ξεκινήσετε μια εφαρμογή με ένα συγκεκριμένο προφίλ sandbox, μπορείτε να χρησιμοποιήσετε:
Σημειώστε ότι το λογισμικό που έχει συγγραφεί από την Apple που τρέχει σε Windows δεν έχει επιπλέον μέτρα ασφαλείας, όπως η απομόνωση εφαρμογών.
Παραδείγματα παρακάμψεων:
https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c (μπορούν να γράφουν αρχεία εκτός της απομόνωσης των οποίων το όνομα ξεκινά με ~$
).
Είναι δυνατόν να ιχνηλατήσετε όλους τους ελέγχους που εκτελεί η απομόνωση κάθε φορά που ελέγχεται μια ενέργεια. Για αυτό, απλώς δημιουργήστε το παρακάτω προφίλ:
Και μετά απλώς εκτελέστε κάτι χρησιμοποιώντας αυτό το προφίλ:
Στο /tmp/trace.out
θα μπορείτε να δείτε κάθε έλεγχο sandbox που εκτελέστηκε κάθε φορά που κλήθηκε (οπότε, πολλά διπλότυπα).
Είναι επίσης δυνατό να παρακολουθήσετε το sandbox χρησιμοποιώντας την παράμετρο -t
: sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls
Η συνάρτηση sandbox_set_trace_path
που εξάγεται από το libsystem_sandbox.dylib
επιτρέπει να καθορίσετε ένα όνομα αρχείου καταγραφής όπου θα γράφονται οι έλεγχοι sandbox.
Είναι επίσης δυνατό να κάνετε κάτι παρόμοιο καλώντας sandbox_vtrace_enable()
και στη συνέχεια να αποκτήσετε τα σφάλματα καταγραφής από το buffer καλώντας sandbox_vtrace_report()
.
Το libsandbox.dylib
εξάγει μια συνάρτηση που ονομάζεται sandbox_inspect_pid η οποία δίνει μια λίστα της κατάστασης του sandbox μιας διαδικασίας (συμπεριλαμβανομένων των επεκτάσεων). Ωστόσο, μόνο οι δυαδικοί κωδικοί της πλατφόρμας μπορούν να χρησιμοποιήσουν αυτή τη συνάρτηση.
Το MacOS αποθηκεύει τα προφίλ sandbox του συστήματος σε δύο τοποθεσίες: /usr/share/sandbox/ και /System/Library/Sandbox/Profiles.
Και αν μια εφαρμογή τρίτου μέρους φέρει την com.apple.security.app-sandbox εξουσιοδότηση, το σύστημα εφαρμόζει το προφίλ /System/Library/Sandbox/Profiles/application.sb σε αυτή τη διαδικασία.
Στο iOS, το προεπιλεγμένο προφίλ ονομάζεται container και δεν έχουμε την κειμενική αναπαράσταση SBPL. Στη μνήμη, αυτό το sandbox αναπαρίσταται ως δυαδικό δέντρο Allow/Deny για κάθε άδεια από το sandbox.
Θα μπορούσε να είναι δυνατό για τις εταιρείες να κάνουν τις εφαρμογές τους να εκτελούνται με προσαρμοσμένα προφίλ Sandbox (αντί με το προεπιλεγμένο). Πρέπει να χρησιμοποιήσουν την εξουσιοδότηση com.apple.security.temporary-exception.sbpl
η οποία πρέπει να εγκριθεί από την Apple.
Είναι δυνατό να ελέγξετε τον ορισμό αυτής της εξουσιοδότησης στο /System/Library/Sandbox/Profiles/application.sb:
This will eval the string after this entitlement as an Sandbox profile.
The sandbox-exec
tool uses the functions sandbox_compile_*
from libsandbox.dylib
. The main functions exported are: sandbox_compile_file
(expects a file path, param -f
), sandbox_compile_string
(expects a string, param -p
), sandbox_compile_name
(expects a name of a container, param -n
), sandbox_compile_entitlements
(expects entitlements plist).
This reversed and open sourced version of the tool sandbox-exec allows to make sandbox-exec
write into a file the compiled sandbox profile.
Moreover, to confine a process inside a container it might call sandbox_spawnattrs_set[container/profilename]
and pass a container or pre-existing profile.
On macOS, unlike iOS where processes are sandboxed from the start by the kernel, processes must opt-in to the sandbox themselves. This means on macOS, a process is not restricted by the sandbox until it actively decides to enter it, although App Store apps are always sandboxed.
Processes are automatically Sandboxed from userland when they start if they have the entitlement: com.apple.security.app-sandbox
. For a detailed explanation of this process check:
Extensions allow to give further privileges to an object and are giving calling one of the functions:
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
The extensions are stored in the second MACF label slot accessible from the process credentials. The following sbtool
can access this information.
Note that extensions are usually granted by allowed processes, for example, tccd
will grant the extension token of com.apple.tcc.kTCCServicePhotos
when a process tried to access the photos and was allowed in a XPC message. Then, the process will need to consume the extension token so it gets added to it.
Note that the extension tokens are long hexadecimals that encode the granted permissions. However they don't have the allowed PID hardcoded which means that any process with access to the token might be consumed by multiple processes.
Note that extensions are very related to entitlements also, so having certain entitlements might automatically grant certain extensions.
According to this, the sandbox_check
functions (it's a __mac_syscall
), can check if an operation is allowed or not by the sandbox in a certain PID, audit token or unique ID.
The tool sbtool (find it compiled here) can check if a PID can perform a certain actions:
Είναι επίσης δυνατό να αναστείλετε και να αναιρέσετε την αναστολή του sandbox χρησιμοποιώντας τις συναρτήσεις sandbox_suspend
και sandbox_unsuspend
από το libsystem_sandbox.dylib
.
Σημειώστε ότι για να καλέσετε τη συνάρτηση αναστολής ελέγχονται ορισμένα δικαιώματα προκειμένου να εξουσιοδοτηθεί ο καλών να την καλέσει όπως:
com.apple.private.security.sandbox-manager
com.apple.security.print
com.apple.security.temporary-exception.audio-unit-host
Αυτή η κλήση συστήματος (#381) αναμένει ένα string ως πρώτο επιχείρημα που θα υποδεικνύει το module που θα εκτελεστεί, και στη συνέχεια έναν κωδικό ως δεύτερο επιχείρημα που θα υποδεικνύει τη συνάρτηση που θα εκτελεστεί. Στη συνέχεια, το τρίτο επιχείρημα θα εξαρτάται από τη συνάρτηση που εκτελείται.
Η συνάρτηση ___sandbox_ms
καλεί τη mac_syscall
υποδεικνύοντας στο πρώτο επιχείρημα "Sandbox"
ακριβώς όπως η ___sandbox_msp
είναι μια περιτύλιξη της mac_set_proc
(#387). Στη συνέχεια, μερικοί από τους υποστηριζόμενους κωδικούς από την ___sandbox_ms
μπορούν να βρεθούν σε αυτόν τον πίνακα:
set_profile (#0): Εφαρμόστε ένα συμπιεσμένο ή ονομασμένο προφίλ σε μια διαδικασία.
platform_policy (#1): Επιβάλλετε ελέγχους πολιτικής συγκεκριμένους για την πλατφόρμα (διαφέρει μεταξύ macOS και iOS).
check_sandbox (#2): Εκτελέστε έναν χειροκίνητο έλεγχο μιας συγκεκριμένης λειτουργίας sandbox.
note (#3): Προσθέτει μια σημείωση σε ένα Sandbox
container (#4): Συνδέστε μια σημείωση σε ένα sandbox, συνήθως για αποσφαλμάτωση ή αναγνώριση.
extension_issue (#5): Δημιουργήστε μια νέα επέκταση για μια διαδικασία.
extension_consume (#6): Καταναλώστε μια δεδομένη επέκταση.
extension_release (#7): Απελευθερώστε τη μνήμη που σχετίζεται με μια καταναλωθείσα επέκταση.
extension_update_file (#8): Τροποποιήστε τις παραμέτρους μιας υπάρχουσας επέκτασης αρχείου εντός του sandbox.
extension_twiddle (#9): Ρυθμίστε ή τροποποιήστε μια υπάρχουσα επέκταση αρχείου (π.χ., TextEdit, rtf, rtfd).
suspend (#10): Αναστείλετε προσωρινά όλους τους ελέγχους sandbox (απαιτεί κατάλληλα δικαιώματα).
unsuspend (#11): Επαναφέρετε όλους τους προηγουμένως ανασταλμένους ελέγχους sandbox.
passthrough_access (#12): Επιτρέψτε άμεση πρόσβαση passthrough σε μια πηγή, παρακάμπτοντας τους ελέγχους sandbox.
set_container_path (#13): (μόνο iOS) Ορίστε μια διαδρομή container για μια ομάδα εφαρμογών ή ID υπογραφής.
container_map (#14): (μόνο iOS) Ανακτήστε μια διαδρομή container από το containermanagerd
.
sandbox_user_state_item_buffer_send (#15): (iOS 10+) Ορίστε μεταδεδομένα λειτουργίας χρήστη στο sandbox.
inspect (#16): Παρέχετε πληροφορίες αποσφαλμάτωσης σχετικά με μια διαδικασία που είναι sandboxed.
dump (#18): (macOS 11) Εκτυπώστε το τρέχον προφίλ ενός sandbox για ανάλυση.
vtrace (#19): Παρακολουθήστε τις λειτουργίες sandbox για παρακολούθηση ή αποσφαλμάτωση.
builtin_profile_deactivate (#20): (macOS < 11) Απενεργοποιήστε τα ονομασμένα προφίλ (π.χ., pe_i_can_has_debugger
).
check_bulk (#21): Εκτελέστε πολλές λειτουργίες sandbox_check
σε μία μόνο κλήση.
reference_retain_by_audit_token (#28): Δημιουργήστε μια αναφορά για ένα audit token για χρήση σε ελέγχους sandbox.
reference_release (#29): Απελευθερώστε μια προηγουμένως διατηρημένη αναφορά audit token.
rootless_allows_task_for_pid (#30): Επαληθεύστε εάν επιτρέπεται το task_for_pid
(παρόμοιο με τους ελέγχους csr
).
rootless_whitelist_push (#31): (macOS) Εφαρμόστε ένα αρχείο manifest System Integrity Protection (SIP).
rootless_whitelist_check (preflight) (#32): Ελέγξτε το αρχείο manifest SIP πριν από την εκτέλεση.
rootless_protected_volume (#33): (macOS) Εφαρμόστε SIP προστασίες σε έναν δίσκο ή διαμέρισμα.
rootless_mkdir_protected (#34): Εφαρμόστε SIP/DataVault προστασία σε μια διαδικασία δημιουργίας καταλόγου.
Σημειώστε ότι στο iOS η επέκταση πυρήνα περιέχει σκληρά κωδικοποιημένα όλα τα προφίλ μέσα στο τμήμα __TEXT.__const
για να αποφευχθεί η τροποποίησή τους. Ακολουθούν μερικές ενδιαφέρουσες συναρτήσεις από την επέκταση πυρήνα:
hook_policy_init
: Συνδέει το mpo_policy_init
και καλείται μετά το mac_policy_register
. Εκτελεί τις περισσότερες από τις αρχικοποιήσεις του Sandbox. Επίσης, αρχικοποιεί το SIP.
hook_policy_initbsd
: Ρυθμίζει τη διεπαφή sysctl καταχωρώντας security.mac.sandbox.sentinel
, security.mac.sandbox.audio_active
και security.mac.sandbox.debug_mode
(αν έχει ενεργοποιηθεί με PE_i_can_has_debugger
).
hook_policy_syscall
: Καλείται από τη mac_syscall
με "Sandbox" ως πρώτο επιχείρημα και κωδικό που υποδεικνύει τη λειτουργία στο δεύτερο. Χρησιμοποιείται ένα switch για να βρεθεί ο κωδικός που θα εκτελεστεί σύμφωνα με τον ζητούμενο κωδικό.
Sandbox.kext
χρησιμοποιεί περισσότερους από εκατό hooks μέσω MACF. Οι περισσότεροι από τους hooks θα ελέγξουν απλώς ορισμένες τυπικές περιπτώσεις που επιτρέπουν την εκτέλεση της ενέργειας, αν όχι, θα καλέσουν cred_sb_evalutate
με τα διαπιστευτήρια από το MACF και έναν αριθμό που αντιστοιχεί στην λειτουργία που θα εκτελεστεί και ένα buffer για την έξοδο.
Ένα καλό παράδειγμα αυτού είναι η συνάρτηση _mpo_file_check_mmap
που συνδέει το mmap
και η οποία θα αρχίσει να ελέγχει αν η νέα μνήμη θα είναι εγγράψιμη (και αν όχι να επιτρέψει την εκτέλεση), στη συνέχεια θα ελέγξει αν χρησιμοποιείται για την κοινή μνήμη dyld και αν ναι θα επιτρέψει την εκτέλεση, και τελικά θα καλέσει sb_evaluate_internal
(ή μία από τις περιτυλίξεις της) για να εκτελέσει περαιτέρω ελέγχους επιτρεπόμενης πρόσβασης.
Επιπλέον, από τους εκατοντάδες hooks που χρησιμοποιεί το Sandbox, υπάρχουν 3 που είναι ιδιαίτερα ενδιαφέροντα:
mpo_proc_check_for
: Εφαρμόζει το προφίλ αν χρειάζεται και αν δεν έχει εφαρμοστεί προηγουμένως
mpo_vnode_check_exec
: Καλείται όταν μια διαδικασία φορτώνει το σχετικό δυαδικό, στη συνέχεια εκτελείται έλεγχος προφίλ και επίσης έλεγχος που απαγορεύει τις εκτελέσεις SUID/SGID.
mpo_cred_label_update_execve
: Αυτό καλείται όταν ανατίθεται η ετικέτα. Αυτό είναι το μεγαλύτερο καθώς καλείται όταν το δυαδικό έχει φορτωθεί πλήρως αλλά δεν έχει εκτελεστεί ακόμα. Θα εκτελέσει ενέργειες όπως η δημιουργία του αντικειμένου sandbox, η σύνδεση της δομής sandbox στα διαπιστευτήρια kauth, η αφαίρεση πρόσβασης σε mach ports...
Σημειώστε ότι _cred_sb_evalutate
είναι μια περιτύλιξη πάνω από sb_evaluate_internal
και αυτή η συνάρτηση παίρνει τα διαπιστευτήρια που περνιούνται και στη συνέχεια εκτελεί την αξιολόγηση χρησιμοποιώντας τη συνάρτηση eval
που συνήθως αξιολογεί το προφίλ πλατφόρμας που εφαρμόζεται από προεπιλογή σε όλες τις διαδικασίες και στη συνέχεια το συγκεκριμένο προφίλ διαδικασίας. Σημειώστε ότι το προφίλ πλατφόρμας είναι ένα από τα κύρια συστατικά του SIP στο macOS.
Το Sandbox έχει επίσης έναν daemon χρήστη που εκθέτει την υπηρεσία XPC Mach com.apple.sandboxd
και δένει την ειδική θύρα 14 (HOST_SEATBELT_PORT
) την οποία χρησιμοποιεί η επέκταση πυρήνα για να επικοινωνήσει μαζί της. Εκθέτει ορισμένες συναρτήσεις χρησιμοποιώντας MIG.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)