TCC.db sous macOS : emplacement et acquisition
Où sont les TCC.db système et utilisateur, rôle de l'accès complet au disque et de SIP, collecte avec le WAL via UAC, Aftermath, Velociraptor ou mac_apt.
En bref. Collectez l'intégralité du dossier com.apple.TCC, pas seulement TCC.db : depuis /Library/Application Support/ pour le système et depuis ~/Library/Application Support/ pour chaque utilisateur, en conservant TCC.db-wal, TCC.db-shm et MDMOverrides.plist. Sur un Mac allumé, le processus qui copie doit disposer de l'accès complet au disque. Plusieurs collecteurs répandus ne copient que TCC.db, ce qui peut faire manquer des modifications récentes encore présentes dans le WAL. Déposez ensuite le résultat dans TCC Parser ; le guide How to get your data (comment récupérer vos données) de la page d'accueil reprend les commandes ci-dessous.
Une fiche de référence d'une page sur cet artefact est disponible dans l'aide-mémoire TCC.db. Cet article approfondit la collecte.
Ce qu'il faut collecter
| Fichier | Chemin | Notes |
|---|---|---|
| TCC.db système | /Library/Application Support/com.apple.TCC/TCC.db | Accès complet au disque, Accessibilité, enregistrement de l'écran et services similaires, en général |
| TCC.db par utilisateur | /Users/<user>/Library/Application Support/com.apple.TCC/TCC.db | Une par compte ; caméra, micro, Automatisation, dossiers, en général |
| WAL | TCC.db-wal à côté de chaque base | Modifications validées pas encore reportées par un checkpoint, plus des versions plus anciennes des pages |
| Index de mémoire partagée | TCC.db-shm à côté de chaque base | Reconstructible ; à collecter par souci d'exhaustivité |
| Autorisations MDM | /Library/Application Support/com.apple.TCC/MDMOverrides.plist | Mac gérés ; autorisations PPPC par client et par service |
| REG.db | /Library/Application Support/com.apple.TCC/REG.db | Présent sur de nombreux systèmes ; son rôle est mal documenté |
MDMOverrides.plist est un dictionnaire indexé par identifiant de client ; chaque entrée est un dictionnaire indexé par nom de service, qui contient des clés comme Allowed, CodeRequirement, CodeRequirementData et IdentifierType. Les entrées Apple Events sont imbriquées d'un niveau supplémentaire, par app destinataire. Lisez-le avec plutil -p.
Ne vous arrêtez pas aux comptes attendus. Les comptes de service, un second compte administrateur ou un compte créé pendant l'intrusion ont tous leur propre base. Énumérez /Users et collectez chacun d'eux.
Protections : accès complet au disque et SIP
Deux mécanismes gênent sur un système allumé, et on les confond souvent :
| Mécanisme | Ce qu'il bloque | Ce qu'il ne bloque pas |
|---|---|---|
| TCC lui-même (accès complet au disque) | La lecture de l'une ou l'autre base par un processus qui n'a pas l'accès complet au disque, root compris | La lecture par un processus qui détient l'accès complet au disque |
| Protection de l'intégrité du système (SIP) | La modification de la base système, même par root | Sa lecture, par un processus disposant de l'accès complet au disque |
En pratique : accordez l'accès complet au disque au programme exact qui effectuera la copie. Si vous lancez un collecteur depuis Terminal, c'est Terminal qui en a besoin ; si un agent collecte, c'est l'agent. sudo ne le remplace pas. Notez quel processus détenait l'accès complet au disque et quand vous l'avez accordé : cette autorisation est elle-même une nouvelle ligne dans la base système, avec un last_modified pendant votre collecte. Mentionnez-le dans votre rapport pour que personne ne la prenne pour une activité de l'attaquant.
Collecte manuelle sur système allumé
Avec l'accès complet au disque accordé à Terminal, ditto copie chaque dossier avec ses fichiers compagnons :
sudo ditto "/Library/Application Support/com.apple.TCC" ./case/tcc_system
for u in /Users/*; do
[ -d "$u/Library/Application Support/com.apple.TCC" ] && \
sudo ditto "$u/Library/Application Support/com.apple.TCC" "./case/tcc_$(basename "$u")"
done
shasum -a 256 ./case/tcc_*/* > ./case/tcc_hashes.txt
Copier le dossier plutôt qu'un seul fichier conserve le WAL, le SHM, MDMOverrides.plist et tout ce que tccd y range d'autre. Zippez le dossier case si vous voulez le charger d'un seul bloc.
Outils de collecte et leurs pièges
| Outil | Ce qu'il collecte | Piège |
|---|---|---|
| UAC | artifacts/files/system/tcc.yaml : exactement les TCC.db système et par utilisateur | N'inclut pas -wal/-shm. Inclus dans le profil ir_triage via files/system/* |
| Aftermath (Jamf) | Le module TCC copie la TCC.db système et celle de chaque utilisateur dans le dossier de cas sous les noms tcc_root et tcc_<username> | Copies brutes du seul fichier principal, sans le WAL. Doit tourner en root avec l'accès complet au disque |
Velociraptor MacOS.System.TCC | Interroge les deux bases en live et renvoie les lignes | Sa description indique qu'il a été testé sur Big Sur ; les versions plus anciennes nécessitent la structure allowed/prompt_count. Il renvoie des lignes, pas les fichiers |
Velociraptor Generic.Collectors.File | Les fichiers bruts correspondant à vos globs | Vous choisissez les globs, vous pouvez donc inclure le WAL |
| mac_apt | Analyse TCC depuis une image ou depuis un fichier isolé | Analyse au lieu de préserver les fichiers bruts ; conservez aussi la source |
UAC
sudo ./uac -p ir_triage /tmp
# or only the TCC artifact
sudo ./uac -a ./artifacts/files/system/tcc.yaml /tmp
Comme l'artefact liste exactement TCC.db, ajoutez un ditto manuel des dossiers ci-dessus si vous avez besoin du WAL. TCC Parser accepte directement la sortie .tar.gz d'UAC ; inutile de l'extraire.
Aftermath
sudo ./aftermath # output to /tmp by default
sudo ./aftermath -o /Volumes/CASE
Cherchez les copies tcc_root et tcc_<username> dans l'archive. TCC Parser reconnaît ces noms quand vous déposez le ZIP d'Aftermath.
Velociraptor
Pour obtenir les lignes sur tout un parc, MacOS.System.TCC (glob par défaut /Library/Application Support/com.apple.TCC/TCC.db,/Users/*/Library/Application Support/com.apple.TCC/TCC.db). Pour les fichiers bruts, Generic.Collectors.File avec Root / et des globs comme :
Library/Application Support/com.apple.TCC/TCC.db*
Users/*/Library/Application Support/com.apple.TCC/TCC.db*
Le * final récupère -wal et -shm. Le client Velociraptor doit disposer de l'accès complet au disque sur le poste.
mac_apt
python mac_apt.py -o out -c E01 /path/mac.E01 TCC
python mac_apt_artifact_only.py -i TCC.db -o out -c TCC
Le plugin TCC prend en charge les structures de Catalina et de Big Sur et ultérieur.
Acquisition à froid
À partir d'une image complète, montez le volume Data en lecture seule sur une machine d'analyse. TCC et SIP n'y restreignent pas la lecture. Les chemins sont les mêmes, relativement à la racine du volume : Library/Application Support/com.apple.TCC/ et Users/*/Library/Application Support/com.apple.TCC/. Copiez les dossiers, calculez leurs empreintes et travaillez sur les copies.
Cherchez aussi des copies plus anciennes : les snapshots APFS locaux et les sauvegardes Time Machine peuvent contenir des versions antérieures des mêmes bases, ce qui est le moyen le plus fiable de voir des autorisations supprimées par la suite.
Manipuler les copies
- N'ouvrez jamais l'original avec un outil qui écrit. SQLite peut reporter le WAL dans le fichier principal (checkpoint) à la fermeture de la dernière connexion, ce qui réécrit les deux fichiers. Travaillez sur une seconde copie.
- Gardez le WAL à côté de sa base, avec le même nom de base. Les parseurs les associent par leur nom.
- Conservez le chemin. C'est le dossier utilisateur dans le chemin qui rattache une base par utilisateur à un compte.
- Notez l'heure et les privilèges. Votre propre autorisation d'accès complet au disque et toute invite que vous déclenchez deviennent des lignes.
Charger les fichiers dans TCC Parser
Déposez les dossiers, des fichiers isolés, un ZIP (Velociraptor, Aftermath, dossiers zippés) ou un .tar.gz d'UAC (inutile de l'extraire) dans la zone de dépôt, ou utilisez Choose files (choisir des fichiers) ou Choose a folder (choisir un dossier). Le parseur rejoue les trames validées du WAL, lit MDMOverrides.plist et affiche REG.db ainsi que tout autre fichier SQLite du dossier sous forme de tables brutes. La prise en main se trouve dans comment analyser TCC.db dans votre navigateur.
Questions fréquentes
Où se trouve TCC.db sous macOS ?
La base système est /Library/Application Support/com.apple.TCC/TCC.db. Chaque utilisateur possède la sienne dans ~/Library/Application Support/com.apple.TCC/TCC.db. Les Mac gérés ont aussi /Library/Application Support/com.apple.TCC/MDMOverrides.plist.
Pourquoi ma copie de TCC.db est-elle vide ou absente ?
Sur un Mac allumé, le processus qui effectue la copie (Terminal, un agent de collecte, le binaire de l'outil) doit disposer de l'accès complet au disque. Sans lui, les copies échouent ou reviennent vides, même en root.
Ai-je besoin de TCC.db-wal et TCC.db-shm ?
Collectez le fichier -wal chaque fois qu'il existe : des modifications récentes peuvent ne pas encore figurer dans le fichier principal, et il peut contenir des versions antérieures de lignes. Le fichier -shm est un index qui peut être reconstruit ; collectez-le par souci d'exhaustivité, mais un parseur n'en a pas besoin.
SIP m'empêche-t-il de lire la TCC.db système ?
Non. La protection de l'intégrité du système protège la base système contre toute modification, même par root. La lire sur un système allumé exige l'accès complet au disque. Sur une image montée sur une machine d'analyse, aucune de ces deux restrictions ne s'applique.