Skip to content

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.

Publié le 7 min de lecture

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

FichierCheminNotes
TCC.db système/Library/Application Support/com.apple.TCC/TCC.dbAccè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.dbUne par compte ; caméra, micro, Automatisation, dossiers, en général
WALTCC.db-wal à côté de chaque baseModifications validées pas encore reportées par un checkpoint, plus des versions plus anciennes des pages
Index de mémoire partagéeTCC.db-shm à côté de chaque baseReconstructible ; à collecter par souci d'exhaustivité
Autorisations MDM/Library/Application Support/com.apple.TCC/MDMOverrides.plistMac gérés ; autorisations PPPC par client et par service
REG.db/Library/Application Support/com.apple.TCC/REG.dbPré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écanismeCe qu'il bloqueCe 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 comprisLa 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 rootSa 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

OutilCe qu'il collectePiège
UACartifacts/files/system/tcc.yaml : exactement les TCC.db système et par utilisateurN'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.TCCInterroge les deux bases en live et renvoie les lignesSa 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.FileLes fichiers bruts correspondant à vos globsVous choisissez les globs, vous pouvez donc inclure le WAL
mac_aptAnalyse 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.

Articles liés

Articles liés

Pas à pas : charger les TCC.db de macOS et leur WAL dans un parseur gratuit, lire constats, autorisations et historique, filtrer une période, exporter.
Ce que la base TCC de macOS enregistre, ce qu'elle prouve ou non, les services qui comptent et une méthode reproductible pour analyser TCC.db.
Comment attaquants et malwares abusent des autorisations TCC de macOS, leurs traces dans TCC.db et les pivots : journal unifié, launchd, quarantaine, shell.