macOS TCC Bypasses
Par fonctionnalité
Contournement d'écriture
Ce n'est pas un contournement, c'est simplement comment fonctionne TCC : Il ne protège pas contre l'écriture. Si le Terminal n'a pas accès en lecture au Bureau d'un utilisateur, il peut toujours écrire dedans :
L'attribut étendu com.apple.macl
est ajouté au nouveau fichier pour donner accès à l'application créatrice pour le lire.
TCC ClickJacking
Il est possible de placer une fenêtre sur la boîte de dialogue TCC pour que l'utilisateur l'accepte sans le remarquer. Vous pouvez trouver une preuve de concept dans TCC-ClickJacking.
Demande TCC par nom arbitraire
Un attaquant peut créer des applications avec n'importe quel nom (par exemple Finder, Google Chrome...) dans le Info.plist
et les faire demander l'accès à un emplacement protégé par TCC. L'utilisateur pensera que l'application légitime est celle qui demande cet accès.
De plus, il est possible de retirer l'application légitime du Dock et mettre la fausse à sa place, ainsi lorsque l'utilisateur clique sur la fausse (qui peut utiliser le même icône), elle pourrait appeler la légitime, demander les permissions TCC et exécuter un logiciel malveillant, faisant croire à l'utilisateur que l'application légitime a demandé l'accès.
Plus d'informations et une preuve de concept dans :
macOS Privilege EscalationContournement SSH
Par défaut, un accès via SSH avait "Accès complet au disque". Pour le désactiver, vous devez le lister mais le désactiver (le supprimer de la liste ne supprimera pas ces privilèges) :
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2088318145-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Frq9WIQinJaxpWMvakjIQ%252Fuploads%252Fgit-blob-ad3b620063ff4facc92f512216320cee1a440ae2%252Fimage%2520%28569%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=c60d0c66&sv=1)
Vous trouverez ici des exemples de la manière dont certains logiciels malveillants ont pu contourner cette protection :
Notez que maintenant, pour pouvoir activer SSH, vous avez besoin d'Accès complet au disque
Gérer les extensions - CVE-2022-26767
L'attribut com.apple.macl
est donné aux fichiers pour donner à une certaine application des autorisations pour le lire. Cet attribut est défini lorsque l'utilisateur fait glisser-déposer un fichier sur une application, ou lorsque l'utilisateur double-clique sur un fichier pour l'ouvrir avec l'application par défaut.
Par conséquent, un utilisateur pourrait enregistrer une application malveillante pour gérer toutes les extensions et appeler les Services de lancement pour ouvrir n'importe quel fichier (ainsi le fichier malveillant aura l'autorisation de le lire).
iCloud
L'entitlement com.apple.private.icloud-account-access
permet de communiquer avec le service XPC com.apple.iCloudHelper
qui fournira des jetons iCloud.
iMovie et Garageband avaient cet entitlement et d'autres qui le permettaient.
Pour plus d'informations sur l'exploit pour obtenir des jetons iCloud à partir de cet entitlement, consultez la présentation : #OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula
kTCCServiceAppleEvents / Automation
Une application avec l'autorisation kTCCServiceAppleEvents
pourra contrôler d'autres applications. Cela signifie qu'elle pourrait être en mesure d'abuser des autorisations accordées aux autres applications.
Pour plus d'informations sur les Scripts Apple, consultez :
macOS Apple ScriptsPar exemple, si une application a l'autorisation d'automatisation sur iTerm
, par exemple dans cet exemple Terminal
a accès à iTerm :
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2088318145-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Frq9WIQinJaxpWMvakjIQ%252Fuploads%252Fgit-blob-9d8662682315363dcef60f168b14ee3101fb9a47%252Fimage%2520%282%29%2520%282%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=a53b926d&sv=1)
Sur iTerm
Terminal, qui n'a pas FDA, peut appeler iTerm, qui l'a, et l'utiliser pour effectuer des actions :
Par le biais de Finder
Ou si une application a accès à Finder, elle pourrait exécuter un script comme celui-ci :
Par comportement de l'application
CVE-2020–9934 - TCC
Le démon tccd de l'espace utilisateur utilise la variable d'environnement HOME
pour accéder à la base de données des utilisateurs TCC à partir de : $HOME/Library/Application Support/com.apple.TCC/TCC.db
Selon cette publication sur Stack Exchange et parce que le démon TCC s'exécute via launchd
dans le domaine de l'utilisateur actuel, il est possible de contrôler toutes les variables d'environnement qui lui sont transmises.
Ainsi, un attaquant pourrait définir la variable d'environnement $HOME
dans launchctl
pour pointer vers un répertoire contrôlé, redémarrer le démon TCC, puis modifier directement la base de données TCC pour s'attribuer tous les droits TCC disponibles sans jamais demander l'autorisation à l'utilisateur final.
PoC:
CVE-2021-30761 - Notes
Les notes avaient accès aux emplacements protégés par TCC mais lorsqu'une note est créée, elle est créée dans un emplacement non protégé. Ainsi, vous pouviez demander aux notes de copier un fichier protégé dans une note (donc dans un emplacement non protégé) et ensuite accéder au fichier :
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2088318145-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Frq9WIQinJaxpWMvakjIQ%252Fuploads%252Fgit-blob-3ae2812255b72c346ffe1fc5c6ce9dd6565ca28a%252Fimage%2520%286%29%2520%281%29%2520%283%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=5d75f2e&sv=1)
CVE-2021-30782 - Translocation
Le binaire /usr/libexec/lsd
avec la bibliothèque libsecurity_translocate
avait l'entitlement com.apple.private.nullfs_allow
qui lui permettait de créer un montage nullfs et avait l'entitlement com.apple.private.tcc.allow
avec kTCCServiceSystemPolicyAllFiles
pour accéder à tous les fichiers.
Il était possible d'ajouter l'attribut de quarantaine à "Library", d'appeler le service XPC com.apple.security.translocation
et ensuite de mapper Library vers $TMPDIR/AppTranslocation/d/d/Library
où tous les documents à l'intérieur de Library pouvaient être accédés.
CVE-2023-38571 - Musique & TV
Musique
a une fonctionnalité intéressante : lorsqu'elle est en cours d'exécution, elle importe les fichiers déposés dans ~/Musique/Musique/Media.localized/Ajouter automatiquement à Musique.localized
dans la "bibliothèque multimédia" de l'utilisateur. De plus, elle appelle quelque chose comme : **rename(a, b);** où
aet
b` sont :
a = "~/Musique/Musique/Media.localized/Ajouter automatiquement à Musique.localized/monfichier.mp3"
b = "~/Musique/Musique/Media.localized/Ajouter automatiquement à Musique.localized/Non ajouté.localized/2023-09-25 11.06.28/monfichier.mp3
Ce comportement rename(a, b);** est vulnérable à une **Condition de Course**, car il est possible de placer à l'intérieur du dossier
Ajouter automatiquement à Musique.localized un faux fichier **TCC.db** et ensuite lorsque le nouveau dossier (b) est créé pour copier le fichier, le supprimer, et le pointer vers **
~/Bibliothèque/Application Support/com.apple.TCC`/.
SQLITE_SQLLOG_DIR - CVE-2023-32422
Si SQLITE_SQLLOG_DIR="chemin/dossier"
signifie essentiellement que toute base de données ouverte est copiée dans ce chemin. Dans ce CVE, ce contrôle a été abusé pour écrire à l'intérieur d'une base de données SQLite qui va être ouverte par un processus avec la base de données TCC, puis abuser de SQLITE_SQLLOG_DIR
avec un symlink dans le nom de fichier de sorte que lorsque cette base de données est ouverte, la base de données utilisateur TCC.db est écrasée par celle ouverte.
Plus d'informations dans l'analyse et dans la présentation.
SQLITE_AUTO_TRACE
Si la variable d'environnement SQLITE_AUTO_TRACE
est définie, la bibliothèque libsqlite3.dylib
commencera à enregistrer toutes les requêtes SQL. De nombreuses applications utilisaient cette bibliothèque, il était donc possible de journaliser toutes leurs requêtes SQLite.
Plusieurs applications Apple utilisaient cette bibliothèque pour accéder à des informations protégées par TCC.
MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407
Cette variable d'environnement est utilisée par le framework Metal
qui est une dépendance de divers programmes, notamment Music
, qui a FDA.
En définissant ce qui suit : MTL_DUMP_PIPELINES_TO_JSON_FILE="chemin/nom"
. Si chemin
est un répertoire valide, le bug sera déclenché et nous pouvons utiliser fs_usage
pour voir ce qui se passe dans le programme :
un fichier sera
open()
é, appeléchemin/.dat.nosyncXXXX.XXXXXX
(X est aléatoire)un ou plusieurs
write()
s écriront le contenu dans le fichier (nous ne contrôlons pas cela)chemin/.dat.nosyncXXXX.XXXXXX
serarenamed()
enchemin/nom
Il s'agit d'une écriture de fichier temporaire, suivie d'un rename(ancien, nouveau)
qui n'est pas sécurisé.
Ce n'est pas sécurisé car il doit résoudre les anciens et nouveaux chemins séparément, ce qui peut prendre du temps et être vulnérable à une condition de course. Pour plus d'informations, vous pouvez consulter la fonction xnu
renameat_internal()
.
Donc, en gros, si un processus privilégié renomme à partir d'un dossier que vous contrôlez, vous pourriez obtenir une RCE et le faire accéder à un fichier différent ou, comme dans ce CVE, ouvrir le fichier créé par l'application privilégiée et stocker un FD.
Si le renommage accède à un dossier que vous contrôlez, tout en ayant modifié le fichier source ou en ayant un FD vers celui-ci, vous pouvez changer le fichier de destination (ou le dossier) pour pointer vers un lien symbolique, afin que vous puissiez écrire quand vous le souhaitez.
C'était l'attaque dans le CVE : Par exemple, pour écraser la base de données utilisateur TCC.db
, nous pouvons :
créer
/Users/hacker/notrelien
pour pointer vers/Users/hacker/Library/Application Support/com.apple.TCC/
créer le répertoire
/Users/hacker/tmp/
définir
MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db
déclencher le bug en exécutant
Music
avec cette variable d'environnementintercepter l'
open()
de/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX
(X est aléatoire)ici, nous
open()
ons également ce fichier pour l'écriture, et conservons le descripteur de fichierbasculer de manière atomique
/Users/hacker/tmp
avec/Users/hacker/notrelien
dans une bouclenous faisons cela pour maximiser nos chances de réussir car la fenêtre de course est assez étroite, mais perdre la course a des conséquences négligeables
attendre un peu
vérifier si nous avons eu de la chance
sinon, recommencer depuis le début
Plus d'informations sur https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html
Maintenant, si vous essayez d'utiliser la variable d'environnement MTL_DUMP_PIPELINES_TO_JSON_FILE
, les applications ne se lanceront pas
Apple Remote Desktop
En tant que root, vous pourriez activer ce service et l'agent ARD aura un accès complet au disque qui pourrait ensuite être utilisé de manière abusive par un utilisateur pour le faire copier une nouvelle base de données utilisateur TCC.
Par NFSHomeDirectory
TCC utilise une base de données dans le dossier HOME de l'utilisateur pour contrôler l'accès aux ressources spécifiques à l'utilisateur à $HOME/Library/Application Support/com.apple.TCC/TCC.db. Par conséquent, si l'utilisateur parvient à redémarrer TCC avec une variable d'environnement $HOME pointant vers un dossier différent, l'utilisateur pourrait créer une nouvelle base de données TCC dans /Library/Application Support/com.apple.TCC/TCC.db et tromper TCC pour accorder n'importe quelle permission TCC à n'importe quelle application.
Notez qu'Apple utilise le paramètre stocké dans le profil de l'utilisateur dans l'attribut NFSHomeDirectory
pour la valeur de $HOME
, donc si vous compromettez une application avec des autorisations pour modifier cette valeur (kTCCServiceSystemPolicySysAdminFiles
), vous pouvez exploiter cette option avec une contournement de TCC.
CVE-2021-30970 - Powerdir
Le premier POC utilise dsexport et dsimport pour modifier le dossier HOME de l'utilisateur.
Obtenir un blob csreq pour l'application cible.
Implanter un faux fichier TCC.db avec l'accès requis et le blob csreq.
Exporter l'entrée des Services de répertoire de l'utilisateur avec dsexport.
Modifier l'entrée des Services de répertoire pour changer le dossier d'accueil de l'utilisateur.
Importer l'entrée des Services de répertoire modifiée avec dsimport.
Arrêter le tccd de l'utilisateur et redémarrer le processus.
Le deuxième POC utilisait /usr/libexec/configd
qui avait com.apple.private.tcc.allow
avec la valeur kTCCServiceSystemPolicySysAdminFiles
.
Il était possible d'exécuter configd
avec l'option -t
, un attaquant pouvait spécifier un Bundle personnalisé à charger. Par conséquent, l'exploit remplace la méthode dsexport
et dsimport
de changement du dossier d'accueil de l'utilisateur par une injection de code configd
.
Pour plus d'informations, consultez le rapport original.
Par injection de processus
Il existe différentes techniques pour injecter du code dans un processus et abuser de ses privilèges TCC :
macOS Proces AbuseDe plus, l'injection de processus la plus courante pour contourner TCC est via les plugins (chargement de bibliothèque). Les plugins sont du code supplémentaire généralement sous forme de bibliothèques ou de plist, qui seront chargés par l'application principale et s'exécuteront sous son contexte. Par conséquent, si l'application principale avait accès aux fichiers restreints par TCC (via des autorisations accordées ou des entitlements), le code personnalisé l'aura également.
CVE-2020-27937 - Directory Utility
L'application /System/Library/CoreServices/Applications/Directory Utility.app
avait l'entitlement kTCCServiceSystemPolicySysAdminFiles
, chargeait des plugins avec l'extension .daplug
et n'avait pas le runtime renforcé.
Pour exploiter ce CVE, le NFSHomeDirectory
est modifié (en abusant de l'entitlement précédent) afin de pouvoir prendre le contrôle de la base de données TCC des utilisateurs pour contourner TCC.
Pour plus d'informations, consultez le rapport original.
CVE-2020-29621 - Coreaudiod
Le binaire /usr/sbin/coreaudiod
avait les autorisations com.apple.security.cs.disable-library-validation
et com.apple.private.tcc.manager
. Le premier permettant l'injection de code et le second lui donnant accès pour gérer TCC.
Ce binaire permettait de charger des plug-ins tiers depuis le dossier /Library/Audio/Plug-Ins/HAL
. Par conséquent, il était possible de charger un plugin et abuser des permissions TCC avec ce PoC:
Pour plus d'informations, consultez le rapport original.
Modules d'extension de la couche d'abstraction des périphériques (DAL)
Les applications système qui ouvrent un flux de caméra via Core Media I/O (applications avec kTCCServiceCamera
) chargent dans le processus ces plugins situés dans /Library/CoreMediaIO/Plug-Ins/DAL
(non restreint par SIP).
Il suffit de stocker une bibliothèque avec le constructeur commun pour réussir à injecter du code.
Plusieurs applications Apple étaient vulnérables à cela.
Firefox
L'application Firefox avait les autorisations com.apple.security.cs.disable-library-validation
et com.apple.security.cs.allow-dyld-environment-variables
:
Pour plus d'informations sur la façon d'exploiter facilement cela, consultez le rapport original.
CVE-2020-10006
Le binaire /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl
avait les autorisations com.apple.private.tcc.allow
et com.apple.security.get-task-allow
, ce qui permettait d'injecter du code dans le processus et d'utiliser les privilèges TCC.
CVE-2023-26818 - Telegram
Telegram avait les autorisations com.apple.security.cs.allow-dyld-environment-variables
et com.apple.security.cs.disable-library-validation
, il était donc possible de l'exploiter pour accéder à ses permissions telles que l'enregistrement avec la caméra. Vous pouvez trouver la charge utile dans l'analyse.
Notez comment utiliser la variable d'environnement pour charger une bibliothèque, un plist personnalisé a été créé pour injecter cette bibliothèque et launchctl
a été utilisé pour la lancer :
Par invocations ouvertes
Il est possible d'invoquer open
même en étant sandboxé
Scripts Terminal
Il est assez courant de donner un Accès complet au disque (FDA) au terminal, du moins sur les ordinateurs utilisés par des personnes techniques. Et il est possible d'invoquer des scripts .terminal
en l'utilisant.
Les scripts .terminal
sont des fichiers plist comme celui-ci avec la commande à exécuter dans la clé CommandString
:
Une application pourrait écrire un script terminal dans un emplacement tel que /tmp et le lancer avec une commande telle que :
En montant
CVE-2020-9771 - Contournement de TCC et élévation de privilèges de mount_apfs
N'importe quel utilisateur (même non privilégié) peut créer et monter un instantané de machine à remonter le temps et accéder à TOUS les fichiers de cet instantané.
Le seul privilège nécessaire est que l'application utilisée (comme Terminal
) ait un accès Total au disque (FDA) (kTCCServiceSystemPolicyAllfiles
) qui doit être accordé par un administrateur.
Une explication plus détaillée peut être trouvée dans le rapport original.
CVE-2021-1784 & CVE-2021-30808 - Montage sur le fichier TCC
Même si le fichier TCC DB est protégé, il était possible de monter par-dessus le répertoire un nouveau fichier TCC.db :
Consultez l'exploit complet dans le rapport original.
asr
L'outil /usr/sbin/asr
permettait de copier tout le disque et de le monter ailleurs en contournant les protections TCC.
Services de localisation
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 dossier /var/db/locationd/
n'était pas protégé contre le montage de DMG donc il était possible de monter notre propre plist.
Par des applications au démarrage
macOS Auto StartPar grep
À plusieurs reprises, des fichiers stockeront des informations sensibles telles que des e-mails, des numéros de téléphone, des messages... dans des emplacements non protégés (ce qui compte comme une vulnérabilité chez Apple).
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2088318145-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Frq9WIQinJaxpWMvakjIQ%252Fuploads%252Fgit-blob-20ead5c092893b082763dbb5cf7eafea5d2ababe%252Fimage%2520%284%29%2520%283%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=7e38de0b&sv=1)
Clics synthétiques
Cela ne fonctionne plus, mais cela a fonctionné dans le passé:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2088318145-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Frq9WIQinJaxpWMvakjIQ%252Fuploads%252Fgit-blob-7118b03d44e6592f3a2f9747687c001bfe39bfe6%252Fimage%2520%282%29%2520%281%29%2520%281%29%2520%281%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=e1cfefa1&sv=1)
Une autre méthode utilisant les événements CoreGraphics:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2088318145-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Frq9WIQinJaxpWMvakjIQ%252Fuploads%252Fgit-blob-4207464e01539acf21f9a288b90cc9b8fdadd4d3%252Fimage%2520%281%29%2520%281%29%2520%281%29%2520%281%29%2520%281%29%2520%281%29%2520%281%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=5ad43ef7&sv=1)
Référence
Last updated