Skip to content

Comment analyser TCC.db dans votre navigateur

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.

Publié le 8 min de lecture

En bref. Collectez les dossiers com.apple.TCC (système et chaque utilisateur, avec le WAL), déposez-les dans TCC Parser, puis parcourez les onglets : Findings (constats), Permissions (autorisations), Apps (applications), Timeline (chronologie), History (historique), Sources. Définissez une plage de temps pour concentrer chaque vue sur la fenêtre qui vous intéresse, puis exportez en CSV, CSV Timesketch ou JSON. L'analyse s'exécute en WebAssembly dans un Web Worker, à l'intérieur de votre navigateur : les fichiers ne sont jamais envoyés.

Cet article est le complément pratique du guide d'analyse forensique de TCC.db. Les exemples utilisent l'échantillon intégré, synthétique et fictif : un portable du service financier, FIN-MBP-03, utilisateur dana.whitlock, sur lequel un attaquant utilisant une session volée a opéré entre environ 10:05 et 10:50 UTC le 2026-09-14. Il appartient à la même intrusion fictive que le poste Windows FIN-WKS-07 utilisé sur nos outils associés.

Apple et macOS sont des marques d'Apple Inc. TCC Parser est indépendant et n'est pas affilié à Apple.

Avant de commencer

Il vous fautPourquoi
Le dossier com.apple.TCC systèmeAccès complet au disque, Accessibilité, enregistrement de l'écran et autorisations MDM
Le dossier com.apple.TCC de chaque utilisateurAutomatisation, dossiers, caméra, micro
Les fichiers -walModifications récentes et versions antérieures des lignes
Le dossier utilisateur dans le cheminRattache chaque base à un compte
Un navigateur de bureau récentLe parseur s'exécute en WebAssembly

Étape 1 : Collecter les dossiers com.apple.TCC

Sur un Mac allumé, accordez d'abord l'accès complet au disque (Full Disk Access) à Terminal (ou à votre agent), puis copiez les dossiers :

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

Les mêmes commandes, ainsi que les options UAC, Aftermath, Velociraptor et à froid, figurent dans le guide How to get your data (comment récupérer vos données) sous la zone de dépôt et dans TCC.db sous macOS : emplacement et acquisition. Si votre collecteur n'a copié que TCC.db sans TCC.db-wal, le parseur fonctionne quand même, mais l'onglet History aura moins à montrer.

Étape 2 : Charger les fichiers

Ouvrez la page d'accueil. Dans la zone de dépôt, vous pouvez :

  • déposer des fichiers, un dossier ou une archive de collecte : un ZIP (Velociraptor, copies tcc_root / tcc_<user> d'Aftermath, ou un dossier zippé) ou un .tar.gz d'UAC, qu'il n'est pas nécessaire d'extraire au préalable ;
  • cliquer sur Choose files (choisir des fichiers) ou Choose a folder (choisir un dossier) ;
  • cliquer sur Try a sample (essayer un échantillon) pour charger FIN-MBP-03.

Le parseur reconnaît les fichiers TCC.db et associe chacun à son -wal, lit MDMOverrides.plist, et charge REG.db ainsi que tout autre fichier SQLite du dossier sous forme de tables brutes. L'espace de travail s'ouvre en plein écran ; appuyez sur Échap pour quitter le plein écran.

Étape 3 : Lire l'onglet Findings

Les constats invitent à regarder de plus près, ce ne sont pas des verdicts. Dans l'échantillon, vous verrez notamment :

ConstatLigne de l'échantillon
Autorisation à fort impact accordée à un terminalAccès complet au disque pour com.apple.Terminal, 10:11:37 UTC
Client identifié par chemin dans un dossier caché, exigence de code ad hoc/Users/dana.whitlock/Library/Caches/.sync/sync-helper
Autorisation supprimée (visible uniquement dans le WAL)Accessibilité pour cet utilitaire, accordée à 10:19:05, supprimée plus tard
Demande refusée provenant d'un client inhabituelEnregistrement de l'écran pour l'utilitaire, refusé à 10:24:40
Automatisation de System Events et du FinderTerminal, 10:14:02 et 10:16:48
Rafale de modifications d'autorisationsModifications de 10:11:37 à 10:24:40, puis un intervalle de 14 minutes avant 10:38:55
Ligne accordée par le MDM à vérifierAccès complet au disque pour com.example.edr.agent via un profil PPPC

La ligne MDM est attendue sur un Mac géré ; elle est listée pour que vous la confirmiez, pas parce qu'elle est suspecte. D'autres types de constats couvrent les clients situés dans /tmp, /private/var/tmp, /Users/Shared ou Téléchargements, et les horodatages dans le futur.

Étape 4 : Examiner les onglets Permissions et Apps

Permissions liste chaque ligne de chaque base, décodée, dans les colonnes suivantes :

ColonneContenu
Last modifiedlast_modified en UTC
DecisionAutorisé, refusé, inconnu ou limité
PermissionNom lisible et identifiant brut, par exemple Full Disk Access et kTCCServiceSystemPolicyAllFiles
App/programLe client, plus la cible d'Automatisation le cas échéant
Reasonauth_reason, décodé
DatabaseBase système ou base de l'utilisateur, si bien qu'une ligne par utilisateur reste rattachée à son compte
Review flagsLes constats qui s'appliquent à la ligne

Cliquez sur une ligne pour ouvrir son panneau de détail : client_type, l'auth_value brut, le csreq décodé en texte d'exigence, auth_version, flags, la politique, le stockage (une page de TCC.db ou une copie dans le WAL), et des boutons pour définir la plage de temps autour de cette décision.

Apps pivote par client. Ouvrez com.apple.Terminal dans l'échantillon et vous voyez toute son empreinte au même endroit : l'accès complet au disque dans la base système ; l'Automatisation de System Events et du Finder, l'accès à Documents et Bureau, et l'accès aux volumes amovibles (10:38:55, le volume USB « EXFIL » du scénario) dans la base de dana.whitlock. C'est ce tableau qu'il faut faire figurer dans le rapport : une app, de nombreuses capacités, le tout en l'espace de 30 minutes.

Étape 5 : Définir une plage de temps sur la Timeline

L'onglet Timeline classe chaque horodatage. Pour le cibler, lui et tout le reste, utilisez la barre de plage de temps placée au-dessus de tous les onglets :

  • From et To, à la seconde près ;
  • un sélecteur de champ de temps : Last modified, Last reminded, Expired at ou Any of these times (n'importe lequel de ces horodatages) ;
  • des préréglages calculés à partir des données ;
  • un sélecteur Around… (autour de…) ;
  • une bande de densité qui montre où les modifications se concentrent, et sur laquelle vous pouvez faire glisser la souris pour sélectionner une fenêtre.

Depuis le panneau de détail d'une ligne, vous pouvez aussi définir la plage autour de cette décision. La plage s'applique à chaque vue, compteur, constat et export, et elle est conservée dans l'URL : vous pouvez donc mettre en favori ou partager la vue exacte avec un collègue qui charge les mêmes fichiers. Dans l'échantillon, une plage de 10:05:00 à 10:50:00 UTC isole l'intrusion des autorisations plus anciennes et légitimes (caméra et micro pour Zoom et Teams, etc.) ; une fois l'échantillon chargé, le bouton Use the sample's incident window (utiliser la fenêtre d'incident de l'échantillon) de l'onglet Findings la définit pour vous.

Étape 6 : Vérifier History et Sources

History affiche les lignes récupérées dans les trames du WAL (commits plus anciens, trames non validées et trames d'une génération plus ancienne du WAL) et dans les pages libérées, comparées à l'état courant. Dans l'échantillon, il montre l'autorisation Accessibilité du sync-helper qui n'existe plus dans la base courante. Le comment et le pourquoi sont expliqués dans récupérer des autorisations TCC supprimées dans le WAL.

Sources liste ce qui a été chargé : chaque base, si un WAL a été trouvé et rejoué, MDMOverrides.plist, et les tables brutes des autres fichiers SQLite. Consultez-le avant de vous fier à une absence : si la base d'un utilisateur manque, l'explication est une lacune de collecte, pas un compte sain.

Étape 7 : Exporter les éléments de preuve

Entrée du menu d'exportUsage
Permissions (CSV, incl. history)Les lignes décodées, y compris les lignes d'historique récupérées, avec une colonne d'état (current, expired, removed ou earlier : courante, expirée, supprimée ou antérieure)
Timeline (CSV)La chronologie, pour la chronologie du dossier
Timeline for Timesketch (CSV)Import dans Timesketch aux côtés d'autres sources
Everything (JSON)L'ensemble, y compris les exigences décodées et l'historique récupéré

Lorsqu'une plage de temps est définie, elle figure dans les noms de fichiers : un export indique toujours la fenêtre qu'il couvre. Consignez les empreintes des fichiers sources chargés à côté des exports.

Et ensuite

L'échantillon ne s'arrête pas à TCC.db : dans le même scénario, on trouve un téléchargement mis en quarantaine, tools.zip, provenant de https://files.example/…, un faux LaunchAgent com.example.updater.plist, des fichiers préparés dans ~/Library/Caches/.sync/ et une visite sur transfer.example. Le passage des lignes TCC à ces artefacts est traité dans enquêter sur l'abus des autorisations TCC.

Articles liés

Articles liés

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.
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.
Comment attaquants et malwares abusent des autorisations TCC de macOS, leurs traces dans TCC.db et les pivots : journal unifié, launchd, quarantaine, shell.