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)
Αυτή δεν είναι μια παράκαμψη, είναι απλώς πώς λειτουργεί το TCC: Δεν προστατεύει από την εγγραφή. Αν το Terminal δεν έχει πρόσβαση για να διαβάσει την επιφάνεια εργασίας ενός χρήστη, μπορεί ακόμα να γράψει σε αυτήν:
The extended attribute com.apple.macl
προστίθεται στο νέο αρχείο για να δώσει στην εφαρμογή του δημιουργού πρόσβαση για να το διαβάσει.
Είναι δυνατόν να τοποθετήσετε ένα παράθυρο πάνω από το προειδοποιητικό μήνυμα TCC ώστε ο χρήστης να το αποδεχτεί χωρίς να το προσέξει. Μπορείτε να βρείτε ένα PoC στο TCC-ClickJacking.
Ο επιτιθέμενος μπορεί να δημιουργήσει εφαρμογές με οποιοδήποτε όνομα (π.χ. Finder, Google Chrome...) στο Info.plist
και να ζητήσει πρόσβαση σε κάποια προστατευμένη τοποθεσία TCC. Ο χρήστης θα νομίζει ότι η νόμιμη εφαρμογή είναι αυτή που ζητά αυτή την πρόσβαση.
Επιπλέον, είναι δυνατόν να αφαιρεθεί η νόμιμη εφαρμογή από το Dock και να τοποθετηθεί η ψεύτικη, έτσι όταν ο χρήστης κάνει κλικ στην ψεύτικη (η οποία μπορεί να χρησιμοποιεί το ίδιο εικονίδιο) μπορεί να καλέσει την νόμιμη, να ζητήσει άδειες TCC και να εκτελέσει κακόβουλο λογισμικό, κάνοντάς τον χρήστη να πιστεύει ότι η νόμιμη εφαρμογή ζήτησε την πρόσβαση.
Περισσότερες πληροφορίες και PoC στο:
macOS Privilege EscalationΑπό προεπιλογή, η πρόσβαση μέσω SSH είχε "Πλήρη Πρόσβαση Δίσκου". Για να το απενεργοποιήσετε, πρέπει να είναι καταχωρημένο αλλά απενεργοποιημένο (η αφαίρεση από τη λίστα δεν θα αφαιρέσει αυτά τα προνόμια):
Εδώ μπορείτε να βρείτε παραδείγματα για το πώς κάποια κακόβουλα λογισμικά έχουν καταφέρει να παρακάμψουν αυτή την προστασία:
Σημειώστε ότι τώρα, για να μπορέσετε να ενεργοποιήσετε το SSH χρειάζεστε Πλήρη Πρόσβαση Δίσκου
Το χαρακτηριστικό com.apple.macl
δίνεται σε αρχεία για να δώσει σε μια ορισμένη εφαρμογή άδειες να το διαβάσει. Αυτό το χαρακτηριστικό ορίζεται όταν σύρετε και αποθέτετε ένα αρχείο πάνω από μια εφαρμογή, ή όταν ένας χρήστης διπλοκλικάρει ένα αρχείο για να το ανοίξει με την προεπιλεγμένη εφαρμογή.
Επομένως, ένας χρήστης θα μπορούσε να καταχωρήσει μια κακόβουλη εφαρμογή για να χειρίζεται όλες τις επεκτάσεις και να καλέσει τις Υπηρεσίες Εκκίνησης για να ανοίξει οποιοδήποτε αρχείο (έτσι το κακόβουλο αρχείο θα αποκτήσει πρόσβαση για να το διαβάσει).
Η εξουσιοδότηση com.apple.private.icloud-account-access
είναι δυνατή για να επικοινωνήσει με την υπηρεσία XPC com.apple.iCloudHelper
που θα παρέχει tokens iCloud.
iMovie και Garageband είχαν αυτή την εξουσιοδότηση και άλλες που επιτρέπουν.
Για περισσότερες πληροφορίες σχετικά με την εκμετάλλευση για να αποκτήσετε tokens icloud από αυτή την εξουσιοδότηση, ελέγξτε την ομιλία: #OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula
Μια εφαρμογή με την άδεια kTCCServiceAppleEvents
θα είναι σε θέση να ελέγχει άλλες εφαρμογές. Αυτό σημαίνει ότι θα μπορούσε να καταχραστεί τις άδειες που έχουν παραχωρηθεί σε άλλες εφαρμογές.
Για περισσότερες πληροφορίες σχετικά με τα Apple Scripts, ελέγξτε:
macOS Apple ScriptsΓια παράδειγμα, αν μια εφαρμογή έχει άδεια Αυτοματοποίησης πάνω στο iTerm
, για παράδειγμα σε αυτό το παράδειγμα Terminal
έχει πρόσβαση στο iTerm:
Το Terminal, που δεν έχει FDA, μπορεί να καλέσει το iTerm, το οποίο το έχει, και να το χρησιμοποιήσει για να εκτελέσει ενέργειες:
Ή αν μια εφαρμογή έχει πρόσβαση μέσω του Finder, θα μπορούσε να είναι ένα σενάριο όπως αυτό:
Ο χρήστης tccd daemon χρησιμοποιεί τη μεταβλητή HOME
env για να έχει πρόσβαση στη βάση δεδομένων χρηστών TCC από: $HOME/Library/Application Support/com.apple.TCC/TCC.db
Σύμφωνα με αυτή την ανάρτηση στο Stack Exchange και επειδή ο daemon TCC εκτελείται μέσω του launchd
εντός του τομέα του τρέχοντος χρήστη, είναι δυνατό να ελέγξει όλες τις μεταβλητές περιβάλλοντος που του μεταβιβάζονται.
Έτσι, ένας επιτιθέμενος θα μπορούσε να ρυθμίσει τη μεταβλητή περιβάλλοντος $HOME
στο launchctl
ώστε να δείχνει σε έναν ελεγχόμενο φάκελο, να επανεκκινήσει τον daemon TCC, και στη συνέχεια να τροποποιήσει άμεσα τη βάση δεδομένων TCC για να δώσει στον εαυτό του όλες τις διαθέσιμες εξουσιοδοτήσεις TCC χωρίς ποτέ να ζητήσει από τον τελικό χρήστη.
PoC:
Οι Σημειώσεις είχαν πρόσβαση σε τοποθεσίες προστατευμένες από TCC, αλλά όταν δημιουργείται μια σημείωση, αυτή δημιουργείται σε μια μη προστατευμένη τοποθεσία. Έτσι, θα μπορούσατε να ζητήσετε από τις Σημειώσεις να αντιγράψουν ένα προστατευμένο αρχείο σε μια σημείωση (δηλαδή σε μια μη προστατευμένη τοποθεσία) και στη συνέχεια να αποκτήσετε πρόσβαση στο αρχείο:
Ο δυαδικός κώδικας /usr/libexec/lsd
με τη βιβλιοθήκη libsecurity_translocate
είχε την εξουσία com.apple.private.nullfs_allow
, η οποία του επέτρεπε να δημιουργήσει nullfs mount και είχε την εξουσία com.apple.private.tcc.allow
με kTCCServiceSystemPolicyAllFiles
για να αποκτήσει πρόσβαση σε κάθε αρχείο.
Ήταν δυνατό να προστεθεί το χαρακτηριστικό καραντίνας στη "Βιβλιοθήκη", να κληθεί η υπηρεσία XPC com.apple.security.translocation
και στη συνέχεια θα χαρτογραφούσε τη Βιβλιοθήκη σε $TMPDIR/AppTranslocation/d/d/Library
όπου όλα τα έγγραφα μέσα στη Βιβλιοθήκη θα μπορούσαν να είναι προσβάσιμα.
Music
έχει μια ενδιαφέρουσα δυνατότητα: Όταν είναι σε λειτουργία, θα εισάγει τα αρχεία που ρίχνονται στο ~/Music/Music/Media.localized/Automatically Add to Music.localized
στη "βιβλιοθήκη μέσων" του χρήστη. Επιπλέον, καλεί κάτι σαν: rename(a, b);
όπου a
και 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
Αυτή η συμπεριφορά rename(a, b);
είναι ευάλωτη σε Race Condition, καθώς είναι δυνατό να τοποθετηθεί μέσα στον φάκελο Automatically Add to Music.localized
ένα ψεύτικο αρχείο TCC.db και στη συνέχεια, όταν δημιουργηθεί ο νέος φάκελος (b) να αντιγραφεί το αρχείο, να διαγραφεί και να δείξει σε ~/Library/Application Support/com.apple.TCC
/.
Εάν SQLITE_SQLLOG_DIR="path/folder"
σημαίνει βασικά ότι κάθε ανοιχτή βάση δεδομένων αντιγράφεται σε αυτήν την τοποθεσία. Σε αυτήν την CVE, αυτός ο έλεγχος καταχράστηκε για να γράψει μέσα σε μια βάση δεδομένων SQLite που πρόκειται να ανοιχτεί από μια διαδικασία με FDA τη βάση δεδομένων TCC, και στη συνέχεια να καταχραστεί SQLITE_SQLLOG_DIR
με ένα symlink στο όνομα αρχείου έτσι ώστε όταν αυτή η βάση δεδομένων είναι ανοιχτή, ο χρήστης TCC.db αντικαθίσταται με την ανοιγμένη.
Περισσότερες πληροφορίες στην ανάλυση και στην ομιλία.
Εάν η μεταβλητή περιβάλλοντος SQLITE_AUTO_TRACE
είναι ρυθμισμένη, η βιβλιοθήκη libsqlite3.dylib
θα αρχίσει να καταγράφει όλα τα SQL ερωτήματα. Πολλές εφαρμογές χρησιμοποίησαν αυτή τη βιβλιοθήκη, οπότε ήταν δυνατό να καταγραφούν όλα τα SQLite ερωτήματα τους.
Πολλές εφαρμογές της Apple χρησιμοποίησαν αυτή τη βιβλιοθήκη για να αποκτήσουν πρόσβαση σε πληροφορίες προστατευμένες από TCC.
Αυτή η μεταβλητή περιβάλλοντος χρησιμοποιείται από το Metal
framework το οποίο είναι εξάρτηση για διάφορα προγράμματα, κυρίως το Music
, το οποίο έχει FDA.
Ρυθμίζοντας το εξής: MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"
. Αν το path
είναι έγκυρος φάκελος, το σφάλμα θα ενεργοποιηθεί και μπορούμε να χρησιμοποιήσουμε το fs_usage
για να δούμε τι συμβαίνει στο πρόγραμμα:
ένα αρχείο θα open()
εται, που ονομάζεται path/.dat.nosyncXXXX.XXXXXX
(X είναι τυχαίος)
ένα ή περισσότερα write()
θα γράψουν τα περιεχόμενα στο αρχείο (δεν ελέγχουμε αυτό)
το path/.dat.nosyncXXXX.XXXXXX
θα renamed()
σε path/name
Είναι μια προσωρινή εγγραφή αρχείου, ακολουθούμενη από μια rename(old, new)
η οποία δεν είναι ασφαλής.
Δεν είναι ασφαλής γιατί πρέπει να λύσει τους παλιούς και νέους φακέλους ξεχωριστά, κάτι που μπορεί να πάρει κάποιο χρόνο και μπορεί να είναι ευάλωτο σε Race Condition. Για περισσότερες πληροφορίες μπορείτε να ελέγξετε τη συνάρτηση xnu
renameat_internal()
.
Έτσι, βασικά, αν μια προνομιακή διαδικασία μετονομάζει από έναν φάκελο που ελέγχετε, θα μπορούσατε να κερδίσετε ένα RCE και να την κάνετε να έχει πρόσβαση σε ένα διαφορετικό αρχείο ή, όπως σε αυτήν την CVE, να ανοίξετε το αρχείο που δημιούργησε η προνομιακή εφαρμογή και να αποθηκεύσετε ένα FD.
Αν η μετονομασία έχει πρόσβαση σε έναν φάκελο που ελέγχετε, ενώ έχετε τροποποιήσει το αρχικό αρχείο ή έχετε ένα FD σε αυτό, αλλάζετε το αρχείο (ή φάκελο) προορισμού για να δείχνει σε ένα symlink, ώστε να μπορείτε να γράφετε όποτε θέλετε.
Αυτή ήταν η επίθεση στην CVE: Για παράδειγμα, για να αντικαταστήσουμε τη βάση δεδομένων TCC.db
του χρήστη, μπορούμε:
να δημιουργήσουμε /Users/hacker/ourlink
για να δείχνει στο /Users/hacker/Library/Application Support/com.apple.TCC/
να δημιουργήσουμε το φάκελο /Users/hacker/tmp/
να ρυθμίσουμε MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db
να ενεργοποιήσουμε το σφάλμα εκτελώντας το Music
με αυτή τη μεταβλητή περιβάλλοντος
να πιάσουμε το open()
του /Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX
(X είναι τυχαίος)
εδώ επίσης open()
αυτό το αρχείο για εγγραφή, και να κρατήσουμε τον περιγραφέα αρχείου
να αλλάξουμε ατομικά το /Users/hacker/tmp
με το /Users/hacker/ourlink
σε έναν βρόχο
το κάνουμε αυτό για να μεγιστοποιήσουμε τις πιθανότητες επιτυχίας μας καθώς το παράθυρο αγώνα είναι αρκετά στενό, αλλά η απώλεια του αγώνα έχει αμελητέα αρνητική πλευρά
να περιμένουμε λίγο
να δοκιμάσουμε αν είχαμε τύχη
αν όχι, να τρέξουμε ξανά από την αρχή
Περισσότερες πληροφορίες στο https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html
Τώρα, αν προσπαθήσετε να χρησιμοποιήσετε τη μεταβλητή περιβάλλοντος MTL_DUMP_PIPELINES_TO_JSON_FILE
, οι εφαρμογές δεν θα εκκινηθούν
Ως root θα μπορούσατε να ενεργοποιήσετε αυτή την υπηρεσία και ο ARD agent θα έχει πλήρη πρόσβαση στο δίσκο που θα μπορούσε στη συνέχεια να καταχραστεί από έναν χρήστη για να το κάνει να αντιγράψει μια νέα βάση δεδομένων TCC χρήστη.
Το TCC χρησιμοποιεί μια βάση δεδομένων στον φάκελο HOME του χρήστη για να ελέγξει την πρόσβαση σε πόρους συγκεκριμένους για τον χρήστη στο $HOME/Library/Application Support/com.apple.TCC/TCC.db. Επομένως, αν ο χρήστης καταφέρει να επανεκκινήσει το TCC με μια μεταβλητή περιβάλλοντος $HOME που δείχνει σε διαφορετικό φάκελο, ο χρήστης θα μπορούσε να δημιουργήσει μια νέα βάση δεδομένων TCC στο /Library/Application Support/com.apple.TCC/TCC.db και να ξεγελάσει το TCC να παραχωρήσει οποιαδήποτε άδεια TCC σε οποιαδήποτε εφαρμογή.
Σημειώστε ότι η Apple χρησιμοποιεί τη ρύθμιση που αποθηκεύεται μέσα στο προφίλ του χρήστη στο NFSHomeDirectory
χαρακτηριστικό για την τιμή του $HOME
, οπότε αν παραβιάσετε μια εφαρμογή με άδειες να τροποποιήσει αυτή την τιμή (kTCCServiceSystemPolicySysAdminFiles
), μπορείτε να οπλίσετε αυτή την επιλογή με μια παράκαμψη TCC.
Η πρώτη POC χρησιμοποιεί dsexport και dsimport για να τροποποιήσει το HOME φάκελο του χρήστη.
Πάρτε ένα csreq blob για την στοχοθετημένη εφαρμογή.
Φυτέψτε ένα ψεύτικο αρχείο TCC.db με απαιτούμενη πρόσβαση και το csreq blob.
Εξάγετε την εγγραφή Υπηρεσιών Καταλόγου του χρήστη με dsexport.
Τροποποιήστε την εγγραφή Υπηρεσιών Καταλόγου για να αλλάξετε τον φάκελο του χρήστη.
Εισάγετε την τροποποιημένη εγγραφή Υπηρεσιών Καταλόγου με dsimport.
Σταματήστε το tccd του χρήστη και επανεκκινήστε τη διαδικασία.
Η δεύτερη POC χρησιμοποίησε /usr/libexec/configd
που είχε com.apple.private.tcc.allow
με την τιμή kTCCServiceSystemPolicySysAdminFiles
.
Ήταν δυνατό να εκτελέσετε το configd
με την επιλογή -t
, ένας επιτιθέμενος θα μπορούσε να καθορίσει ένα προσαρμοσμένο Bundle για φόρτωση. Επομένως, η εκμετάλλευση αντικαθιστά τη μέθοδο dsexport
και dsimport
για την αλλαγή του φακέλου του χρήστη με μια ένεση κώδικα configd.
Για περισσότερες πληροφορίες ελέγξτε την αρχική αναφορά.
Υπάρχουν διάφορες τεχνικές για να εγχύσετε κώδικα μέσα σε μια διαδικασία και να καταχραστείτε τα προνόμια TCC της:
macOS Process AbuseΕπιπλέον, η πιο κοινή ένεση διαδικασίας για να παρακάμψετε το TCC που βρέθηκε είναι μέσω plugins (load library). Τα plugins είναι επιπλέον κώδικας συνήθως με τη μορφή βιβλιοθηκών ή plist, που θα φορτωθούν από την κύρια εφαρμογή και θα εκτελούνται υπό το πλαίσιο της. Επομένως, αν η κύρια εφαρμογή είχε πρόσβαση σε αρχεία περιορισμένα από το TCC (μέσω παραχωρημένων αδειών ή δικαιωμάτων), ο προσαρμοσμένος κώδικας θα έχει επίσης πρόσβαση.
Η εφαρμογή /System/Library/CoreServices/Applications/Directory Utility.app
είχε την άδεια kTCCServiceSystemPolicySysAdminFiles
, φόρτωσε plugins με επέκταση .daplug
και δεν είχε σκληρή εκτέλεση.
Για να οπλίσετε αυτή την CVE, το NFSHomeDirectory
αλλάζει (καταχρώντας την προηγούμενη άδεια) προκειμένου να μπορέσετε να αναλάβετε τη βάση δεδομένων TCC των χρηστών για να παρακάμψετε το TCC.
Για περισσότερες πληροφορίες ελέγξτε την αρχική αναφορά.
Το δυαδικό /usr/sbin/coreaudiod
είχε τις άδειες com.apple.security.cs.disable-library-validation
και com.apple.private.tcc.manager
. Η πρώτη επιτρέπει την ένεση κώδικα και η δεύτερη του δίνει πρόσβαση για διαχείριση του TCC.
Αυτό το δυαδικό επέτρεπε τη φόρτωση τρίτων plugins από το φάκελο /Library/Audio/Plug-Ins/HAL
. Επομένως, ήταν δυνατό να φορτώσετε ένα plugin και να καταχραστείτε τις άδειες TCC με αυτό το PoC:
Για περισσότερες πληροφορίες, ελέγξτε την πρωτότυπη αναφορά.
Οι εφαρμογές συστήματος που ανοίγουν ροή κάμερας μέσω Core Media I/O (εφαρμογές με kTCCServiceCamera
) φορτώνουν στη διαδικασία αυτά τα πρόσθετα που βρίσκονται στο /Library/CoreMediaIO/Plug-Ins/DAL
(όχι περιορισμένα από SIP).
Απλά αποθηκεύοντας εκεί μια βιβλιοθήκη με τον κοινό κατασκευαστή θα λειτουργήσει για εισαγωγή κώδικα.
Πολλές εφαρμογές της Apple ήταν ευάλωτες σε αυτό.
Η εφαρμογή Firefox είχε τα δικαιώματα com.apple.security.cs.disable-library-validation
και com.apple.security.cs.allow-dyld-environment-variables
:
Για περισσότερες πληροφορίες σχετικά με το πώς να εκμεταλλευτείτε εύκολα αυτό ελέγξτε την αρχική αναφορά.
Το δυαδικό αρχείο /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl
είχε τα δικαιώματα com.apple.private.tcc.allow
και com.apple.security.get-task-allow
, που επέτρεπαν την έγχυση κώδικα μέσα στη διαδικασία και τη χρήση των δικαιωμάτων TCC.
Το Telegram είχε τα δικαιώματα com.apple.security.cs.allow-dyld-environment-variables
και com.apple.security.cs.disable-library-validation
, οπότε ήταν δυνατό να το εκμεταλλευτεί κανείς για να αποκτήσει πρόσβαση στα δικαιώματά του όπως η καταγραφή με την κάμερα. Μπορείτε να βρείτε το payload στην αναφορά.
Σημειώστε πώς να χρησιμοποιήσετε τη μεταβλητή env για να φορτώσετε μια βιβλιοθήκη, δημιουργήθηκε μια προσαρμοσμένη plist για να εγχυθεί αυτή η βιβλιοθήκη και χρησιμοποιήθηκε το launchctl
για να την εκκινήσει:
Είναι δυνατόν να καλέσετε open
ακόμη και ενώ είστε σε sandbox
Είναι αρκετά συνηθισμένο να δίνετε στο τερματικό Πλήρη Πρόσβαση Δίσκου (FDA), τουλάχιστον σε υπολογιστές που χρησιμοποιούνται από τεχνικούς. Και είναι δυνατόν να καλέσετε σενάρια .terminal
χρησιμοποιώντας το.
Τα σενάρια .terminal
είναι αρχεία plist όπως αυτό με την εντολή που θα εκτελεστεί στο κλειδί CommandString
:
Μια εφαρμογή θα μπορούσε να γράψει ένα σενάριο τερματικού σε μια τοποθεσία όπως το /tmp και να το εκκινήσει με μια εντολή όπως:
Οποιοσδήποτε χρήστης (ακόμα και οι μη προνομιούχοι) μπορεί να δημιουργήσει και να προσαρτήσει ένα στιγμιότυπο χρονομηχανής και να έχει πρόσβαση σε ΟΛΑ τα αρχεία αυτού του στιγμιότυπου.
Η μόνη προϋπόθεση είναι η εφαρμογή που χρησιμοποιείται (όπως το Terminal
) να έχει Πλήρη Πρόσβαση Δίσκου (FDA) (kTCCServiceSystemPolicyAllfiles
), η οποία πρέπει να παραχωρηθεί από έναν διαχειριστή.
Μια πιο λεπτομερής εξήγηση μπορεί να βρεθεί στην αρχική αναφορά.
Ακόμα και αν το αρχείο DB του TCC είναι προστατευμένο, ήταν δυνατό να τοποθετηθεί πάνω από τον κατάλογο ένα νέο αρχείο TCC.db:
Check the full exploit in the original writeup.
Το εργαλείο /usr/sbin/asr
επέτρεπε την αντιγραφή ολόκληρου του δίσκου και την τοποθέτησή του σε άλλη θέση παρακάμπτοντας τις προστασίες TCC.
Υπάρχει μια τρίτη βάση δεδομένων TCC στο /var/db/locationd/clients.plist
για να υποδεικνύει τους πελάτες που επιτρέπεται να έχουν πρόσβαση στις υπηρεσίες τοποθεσίας.
Ο φάκελος /var/db/locationd/
δεν προστατευόταν από την τοποθέτηση DMG οπότε ήταν δυνατή η τοποθέτηση του δικού μας plist.
Σε πολλές περιπτώσεις, αρχεία θα αποθηκεύουν ευαίσθητες πληροφορίες όπως emails, αριθμούς τηλεφώνων, μηνύματα... σε μη προστατευμένες τοποθεσίες (που μετράνε ως ευπάθεια στην Apple).
Αυτό δεν λειτουργεί πια, αλλά λειτούργησε στο παρελθόν:
Ένας άλλος τρόπος χρησιμοποιώντας CoreGraphics events:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)