macOS TCC Bypasses
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
To nie jest bypass, to po prostu sposób działania TCC: Nie chroni przed zapisem. Jeśli Terminal nie ma dostępu do odczytu pulpitu użytkownika, nadal może do niego zapisywać:
The extended attribute com.apple.macl
jest dodawany do nowego pliku, aby dać dostęp do jego odczytu aplikacji twórcy.
Możliwe jest umieszczenie okna nad monitorem TCC, aby użytkownik zaakceptował to bez zauważenia. Możesz znaleźć PoC w TCC-ClickJacking.
Atakujący może tworzyć aplikacje o dowolnej nazwie (np. Finder, Google Chrome...) w Info.plist
i sprawić, że będą one żądały dostępu do chronionej lokalizacji TCC. Użytkownik pomyśli, że to legalna aplikacja żąda tego dostępu.
Co więcej, możliwe jest usunięcie legalnej aplikacji z Docka i umieszczenie na nim fałszywej, więc gdy użytkownik kliknie na fałszywą (która może używać tego samego ikony), może wywołać legalną, poprosić o uprawnienia TCC i uruchomić złośliwe oprogramowanie, sprawiając, że użytkownik uwierzy, że to legalna aplikacja żądała dostępu.
Więcej informacji i PoC w:
macOS Privilege EscalationDomyślnie dostęp przez SSH miał "Pełny dostęp do dysku". Aby to wyłączyć, musisz mieć to wymienione, ale wyłączone (usunięcie go z listy nie usunie tych uprawnień):
Tutaj możesz znaleźć przykłady, jak niektóre złośliwe oprogramowania mogły obejść tę ochronę:
Zauważ, że teraz, aby móc włączyć SSH, potrzebujesz Pełnego dostępu do dysku
Atrybut com.apple.macl
jest nadawany plikom, aby dać pewnej aplikacji uprawnienia do jego odczytu. Ten atrybut jest ustawiany, gdy przeciągasz i upuszczasz plik na aplikację lub gdy użytkownik kliknie dwukrotnie plik, aby otworzyć go w domyślnej aplikacji.
Dlatego użytkownik mógłby zarejestrować złośliwą aplikację do obsługi wszystkich rozszerzeń i wywołać usługi uruchamiania, aby otworzyć dowolny plik (tak, aby złośliwy plik uzyskał dostęp do jego odczytu).
Uprawnienie com.apple.private.icloud-account-access
umożliwia komunikację z com.apple.iCloudHelper
usługą XPC, która dostarczy tokeny iCloud.
iMovie i Garageband miały to uprawnienie i inne, które to umożliwiały.
Aby uzyskać więcej informacji na temat exploita do uzyskania tokenów iCloud z tego uprawnienia, sprawdź wykład: #OBTS v5.0: "Co się dzieje na twoim Macu, zostaje na iCloud Apple'a?!" - Wojciech Regula
Aplikacja z uprawnieniem kTCCServiceAppleEvents
będzie mogła kontrolować inne aplikacje. Oznacza to, że może być w stanie nadużywać uprawnień przyznanych innym aplikacjom.
Aby uzyskać więcej informacji na temat skryptów Apple, sprawdź:
macOS Apple ScriptsNa przykład, jeśli aplikacja ma uprawnienia automatyzacji nad iTerm
, na przykład w tym przykładzie Terminal
ma dostęp do iTerm:
Terminal, który nie ma FDA, może wywołać iTerm, który je ma, i użyć go do wykonania działań:
Lub jeśli aplikacja ma dostęp do Findera, może to być skrypt taki jak ten:
Demon tccd w przestrzeni użytkownika używa zmiennej HOME
env do uzyskania dostępu do bazy danych użytkowników TCC z: $HOME/Library/Application Support/com.apple.TCC/TCC.db
Zgodnie z tym postem na Stack Exchange i ponieważ demon TCC działa za pośrednictwem launchd
w obrębie domeny bieżącego użytkownika, możliwe jest kontrolowanie wszystkich zmiennych środowiskowych przekazywanych do niego.
W ten sposób atakujący mógłby ustawić zmienną środowiskową $HOME
w launchctl
, aby wskazywała na kontrolowany katalog, zrestartować demon TCC i następnie bezpośrednio zmodyfikować bazę danych TCC, aby nadać sobie wszystkie dostępne uprawnienia TCC bez wywoływania żadnych komunikatów dla użytkownika końcowego.
PoC:
Notatki miały dostęp do lokalizacji chronionych przez TCC, ale gdy notatka jest tworzona, jest tworzona w niechronionej lokalizacji. Można więc poprosić notatki o skopiowanie chronionego pliku do notatki (czyli w niechronionej lokalizacji) i następnie uzyskać dostęp do pliku:
Binarne /usr/libexec/lsd
z biblioteką libsecurity_translocate
miało uprawnienie com.apple.private.nullfs_allow
, co pozwalało na utworzenie nullfs montażu i miało uprawnienie com.apple.private.tcc.allow
z kTCCServiceSystemPolicyAllFiles
, aby uzyskać dostęp do każdego pliku.
Można było dodać atrybut kwarantanny do "Biblioteki", wywołać usługę XPC com.apple.security.translocation
, a następnie mapować Bibliotekę do $TMPDIR/AppTranslocation/d/d/Library
, gdzie wszystkie dokumenty w Bibliotece mogły być dostępne.
Muzyka
ma interesującą funkcję: Gdy jest uruchomiona, importuje pliki wrzucone do ~/Music/Music/Media.localized/Automatically Add to Music.localized
do "biblioteki multimedialnej" użytkownika. Ponadto wywołuje coś w rodzaju: rename(a, b);
, gdzie a
i b
to:
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
To rename(a, b);
zachowanie jest podatne na Race Condition, ponieważ możliwe jest umieszczenie w folderze Automatically Add to Music.localized
fałszywego pliku TCC.db, a następnie, gdy nowy folder (b) jest tworzony, skopiowanie pliku, usunięcie go i skierowanie go do ~/Library/Application Support/com.apple.TCC
/.
Jeśli SQLITE_SQLLOG_DIR="path/folder"
, oznacza to zasadniczo, że każda otwarta baza danych jest kopiowana do tej ścieżki. W tym CVE kontrola ta została nadużyta do zapisu wewnątrz bazy danych SQLite, która ma być otwarta przez proces z FDA bazą danych TCC, a następnie nadużycie SQLITE_SQLLOG_DIR
z symlinkiem w nazwie pliku, tak aby, gdy ta baza danych jest otwarta, użytkownik TCC.db jest nadpisywany otwartą.
Więcej informacji w opisie i w wykładzie.
Jeśli zmienna środowiskowa SQLITE_AUTO_TRACE
jest ustawiona, biblioteka libsqlite3.dylib
zacznie rejestrować wszystkie zapytania SQL. Wiele aplikacji używało tej biblioteki, więc możliwe było rejestrowanie wszystkich ich zapytań SQLite.
Kilka aplikacji Apple używało tej biblioteki do uzyskiwania dostępu do chronionych informacji TCC.
Ta zmienna środowiskowa jest używana przez framework Metal
, który jest zależnością dla różnych programów, w szczególności Music
, który ma FDA.
Ustawiając następujące: MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"
. Jeśli path
jest ważnym katalogiem, błąd zostanie wywołany i możemy użyć fs_usage
, aby zobaczyć, co się dzieje w programie:
plik zostanie open()
owany, nazywając go path/.dat.nosyncXXXX.XXXXXX
(X jest losowe)
jedno lub więcej write()
zapisze zawartość do pliku (nie kontrolujemy tego)
path/.dat.nosyncXXXX.XXXXXX
zostanie renamed()
do path/name
To jest tymczasowe zapisanie pliku, po którym następuje rename(old, new)
, co nie jest bezpieczne.
Nie jest to bezpieczne, ponieważ musi rozwiązać stare i nowe ścieżki osobno, co może zająć trochę czasu i może być podatne na warunki wyścigu. Więcej informacji można znaleźć w funkcji xnu
renameat_internal()
.
Więc, zasadniczo, jeśli proces z uprawnieniami zmienia nazwę z folderu, który kontrolujesz, możesz uzyskać RCE i sprawić, że uzyska dostęp do innego pliku lub, jak w tym CVE, otworzyć plik, który utworzył aplikacja z uprawnieniami i przechować FD.
Jeśli zmiana nazwy uzyskuje dostęp do folderu, który kontrolujesz, podczas gdy zmodyfikowałeś plik źródłowy lub masz do niego FD, zmieniasz plik docelowy (lub folder), aby wskazywał na symlink, więc możesz pisać, kiedy chcesz.
To był atak w CVE: Na przykład, aby nadpisać TCC.db
użytkownika, możemy:
utworzyć /Users/hacker/ourlink
, aby wskazywał na /Users/hacker/Library/Application Support/com.apple.TCC/
utworzyć katalog /Users/hacker/tmp/
ustawić MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db
wywołać błąd, uruchamiając Music
z tą zmienną środowiskową
przechwycić open()
/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX
(X jest losowe)
tutaj również open()
ten plik do zapisu i trzymamy uchwyt do deskryptora pliku
atomowo zamienić /Users/hacker/tmp
z /Users/hacker/ourlink
w pętli
robimy to, aby zmaksymalizować nasze szanse na sukces, ponieważ okno wyścigu jest dość wąskie, ale przegranie wyścigu ma znikome negatywne skutki
poczekać chwilę
sprawdzić, czy mieliśmy szczęście
jeśli nie, uruchomić ponownie od początku
Więcej informacji w https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html
Teraz, jeśli spróbujesz użyć zmiennej środowiskowej MTL_DUMP_PIPELINES_TO_JSON_FILE
, aplikacje nie uruchomią się
Jako root możesz włączyć tę usługę, a agent ARD będzie miał pełny dostęp do dysku, co może być nadużywane przez użytkownika do skopiowania nowej bazy danych użytkowników TCC.
TCC używa bazy danych w folderze HOME użytkownika do kontrolowania dostępu do zasobów specyficznych dla użytkownika w $HOME/Library/Application Support/com.apple.TCC/TCC.db. Dlatego, jeśli użytkownik zdoła ponownie uruchomić TCC z zmienną środowiskową $HOME wskazującą na inny folder, użytkownik może utworzyć nową bazę danych TCC w /Library/Application Support/com.apple.TCC/TCC.db i oszukać TCC, aby przyznać dowolne uprawnienie TCC dowolnej aplikacji.
Zauważ, że Apple używa ustawienia przechowywanego w profilu użytkownika w atrybucie NFSHomeDirectory
dla wartości $HOME
, więc jeśli skompromitujesz aplikację z uprawnieniami do modyfikacji tej wartości (kTCCServiceSystemPolicySysAdminFiles
), możesz uzbroić tę opcję z obejściem TCC.
Pierwszy POC używa dsexport i dsimport, aby zmodyfikować folder HOME użytkownika.
Uzyskaj blob csreq dla docelowej aplikacji.
Zasiej fałszywy plik TCC.db z wymaganym dostępem i blobem csreq.
Eksportuj wpis usługi katalogowej użytkownika za pomocą dsexport.
Zmodyfikuj wpis usługi katalogowej, aby zmienić katalog domowy użytkownika.
Importuj zmodyfikowany wpis usługi katalogowej za pomocą dsimport.
Zatrzymaj tccd użytkownika i zrestartuj proces.
Drugi POC użył /usr/libexec/configd
, który miał com.apple.private.tcc.allow
z wartością kTCCServiceSystemPolicySysAdminFiles
.
Możliwe było uruchomienie configd
z opcją -t
, atakujący mógł określić niestandardowy pakiet do załadowania. Dlatego exploit zastępuje metodę dsexport
i dsimport
zmiany katalogu domowego użytkownika za pomocą wstrzyknięcia kodu configd.
Więcej informacji można znaleźć w oryginalnym raporcie.
Istnieją różne techniki wstrzykiwania kodu do procesu i nadużywania jego uprawnień TCC:
macOS Process AbuseCo więcej, najczęstszym wstrzyknięciem procesu, aby obejść TCC, jest przez pluginy (ładuj bibliotekę). Pluginy to dodatkowy kod, zazwyczaj w formie bibliotek lub plist, który będzie ładowany przez główną aplikację i będzie wykonywany w jej kontekście. Dlatego, jeśli główna aplikacja miała dostęp do plików ograniczonych przez TCC (poprzez przyznane uprawnienia lub uprawnienia), niestandardowy kod również je będzie miał.
Aplikacja /System/Library/CoreServices/Applications/Directory Utility.app
miała uprawnienie kTCCServiceSystemPolicySysAdminFiles
, ładowała pluginy z rozszerzeniem .daplug
i nie miała wzmocnionego czasu wykonywania.
Aby uzbroić ten CVE, NFSHomeDirectory
jest zmieniane (nadużywając poprzedniego uprawnienia), aby móc przejąć bazę danych TCC użytkowników w celu obejścia TCC.
Więcej informacji można znaleźć w oryginalnym raporcie.
Binarny /usr/sbin/coreaudiod
miał uprawnienia com.apple.security.cs.disable-library-validation
i com.apple.private.tcc.manager
. Pierwsze pozwala na wstrzyknięcie kodu, a drugie daje dostęp do zarządzania TCC.
Ten binarny plik pozwalał na ładowanie pluginów firm trzecich z folderu /Library/Audio/Plug-Ins/HAL
. Dlatego możliwe było załadowanie pluginu i nadużycie uprawnień TCC z tym PoC:
For more info check the original report.
Aplikacje systemowe, które otwierają strumień kamery za pomocą Core Media I/O (aplikacje z kTCCServiceCamera
) ładują w procesie te wtyczki znajdujące się w /Library/CoreMediaIO/Plug-Ins/DAL
(nie są ograniczone przez SIP).
Samo przechowywanie tam biblioteki z wspólnym konstruktorem zadziała, aby wstrzyknąć kod.
Kilka aplikacji Apple było na to podatnych.
Aplikacja Firefox miała uprawnienia com.apple.security.cs.disable-library-validation
i com.apple.security.cs.allow-dyld-environment-variables
:
Fore more info about how to easily exploit this sprawdź oryginalny raport.
Plik binarny /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl
miał uprawnienia com.apple.private.tcc.allow
i com.apple.security.get-task-allow
, co pozwalało na wstrzykiwanie kodu do procesu i korzystanie z uprawnień TCC.
Telegram miał uprawnienia com.apple.security.cs.allow-dyld-environment-variables
i com.apple.security.cs.disable-library-validation
, więc możliwe było nadużycie tego, aby uzyskać dostęp do jego uprawnień, takich jak nagrywanie za pomocą kamery. Możesz znaleźć ładunek w opisie.
Zauważ, jak użyć zmiennej env do załadowania biblioteki, stworzono niestandardowy plist, aby wstrzyknąć tę bibliotekę, a launchctl
został użyty do jej uruchomienia:
Możliwe jest wywołanie open
nawet w trybie piaskownicy
Jest dość powszechne, aby przyznać terminalowi Pełny dostęp do dysku (FDA), przynajmniej w komputerach używanych przez osoby z branży technologicznej. I możliwe jest wywołanie skryptów .terminal
z jego użyciem.
Skrypty .terminal
to pliki plist, takie jak ten, z poleceniem do wykonania w kluczu CommandString
:
Aplikacja mogłaby napisać skrypt terminalowy w lokalizacji takiej jak /tmp i uruchomić go za pomocą polecenia takiego jak:
Każdy użytkownik (nawet nieuprzywilejowany) może utworzyć i zamontować migawkę Time Machine oraz uzyskać dostęp do WSZYSTKICH plików tej migawki.
Jedynym wymaganym uprawnieniem jest to, aby aplikacja używana (jak Terminal
) miała dostęp Full Disk Access (FDA) (kTCCServiceSystemPolicyAllfiles
), co musi być przyznane przez administratora.
Bardziej szczegółowe wyjaśnienie można znaleźć w oryginalnym raporcie.
Nawet jeśli plik bazy danych TCC jest chroniony, możliwe było zamontowanie nowego pliku TCC.db nad katalogiem:
Sprawdź pełny exploit w oryginalnym opisie.
Narzędzie /usr/sbin/asr
pozwalało na skopiowanie całego dysku i zamontowanie go w innym miejscu, omijając zabezpieczenia TCC.
Istnieje trzecia baza danych TCC w /var/db/locationd/clients.plist
, aby wskazać klientów, którzy mają dostęp do usług lokalizacyjnych.
Folder /var/db/locationd/
nie był chroniony przed montowaniem DMG, więc możliwe było zamontowanie naszego własnego plist.
W kilku przypadkach pliki będą przechowywać wrażliwe informacje, takie jak e-maile, numery telefonów, wiadomości... w niechronionych lokalizacjach (co liczy się jako luka w Apple).
To już nie działa, ale działało w przeszłości:
Inny sposób używając zdarzeń CoreGraphics:
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)