Aller au contenu

Activité utilisateurExécution

knowledgeC.db : usage des apps et activité sous macOS

Base SQLite CoreDuet qui enregistre usage des apps, focus, écran et alimentation sous macOS, pour savoir quand et combien de temps une app a servi.

Emplacement
/private/var/db/CoreDuet/Knowledge/knowledgeC.db
Prouve
Quelles applications étaient utilisées, quand et combien de temps, et si l'écran était allumé à ce moment-là
Horodatages
Temps absolu Mac (secondes depuis le 2001-01-01 UTC), plus le décalage ZSECONDSFROMGMT
Accès
root plus restrictions SIP (base système) ; accès complet au disque (base utilisateur)
Rétention
Environ quatre semaines d'événements sur un système typique (variable selon le flux)
Collecte
UAC, Disk image, cp

Ce que c'est

knowledgeC.db est une base SQLite écrite par le framework CoreDuet d'Apple. Elle enregistre des événements de « pattern of life » sous forme d'intervalles : une application en cours d'utilisation, l'écran allumé, le Mac sur secteur, un domaine web visité, etc. Chaque événement appartient à un flux nommé, comme /app/usage, et porte une heure de début et de fin : c'est pourquoi elle répond à des questions de durée que les horodatages du système de fichiers ne peuvent pas trancher.

La base est un magasin Core Data, d'où le préfixe Z des tables et colonnes. Sur les versions récentes de macOS, Apple a déplacé de nombreux flux vers Biome : une knowledgeC.db moderne peut donc être clairsemée. Examinez toujours les deux.

Où il se trouve

PortéeCheminProtection
Système/private/var/db/CoreDuet/Knowledge/knowledgeC.dbAppartient à root, restreint par SIP. UAC indique ne collecter ce fichier en live que lorsque SIP est désactivé
Utilisateur~/Library/Application Support/Knowledge/knowledgeC.dbProtégé par TCC : le processus de collecte a besoin de l'accès complet au disque

Les deux bases fonctionnent en mode WAL. Collectez knowledgeC.db-wal et knowledgeC.db-shm avec le fichier principal : les événements les plus récents ne se trouvent souvent que dans le WAL.

Ce qu'il prouve

  • Quels bundle IDs étaient utilisés (/app/usage) ou au premier plan (/app/inFocus), et pendant combien de secondes.
  • Quand l'écran était allumé (/display/isBacklit) et quand le Mac était branché sur secteur (/device/isPluggedIn).
  • L'usage web et multimédia par application (/app/webUsage, /app/mediaUsage) et des entrées d'historique Safari (/safari/history) lorsque ces flux existent.
  • L'activité d'autres appareils liés au même compte Apple, lorsque des lignes synchronisées sont présentes (voir les conseils).

Elle ne prouve pas qu'une personne précise était au clavier, et n'enregistre ni noms de fichiers ni lignes de commande. Une application « en cours d'utilisation » peut n'être qu'une fenêtre restée ouverte devant un écran inactif.

Champs clés

Table principale ZOBJECT (une ligne par événement) :

ColonneSignification
ZSTREAMNAMEFlux, par exemple /app/usage, /display/isBacklit
ZVALUESTRINGValeur texte principale, en général un bundle ID ou une URL
ZVALUEINTEGER / ZVALUEDOUBLEValeur numérique pour les flux booléens ou mesurés (1 = actif)
ZSTARTDATE / ZENDDATEDébut et fin de l'intervalle
ZCREATIONDATEMoment où la ligne a été écrite
ZSECONDSFROMGMTDécalage UTC de l'appareil en secondes au moment de l'événement
ZSTARTDAYOFWEEKJour de la semaine, 1 = dimanche
ZUUIDUUID de l'événement
ZSOURCEClé étrangère vers ZSOURCE.Z_PK
ZSTRUCTUREDMETADATAClé étrangère vers ZSTRUCTUREDMETADATA.Z_PK

ZSOURCE décrit le producteur ; APOLLO interprète ZSOURCE.ZDEVICEID comme l'UUID matériel de l'appareil d'origine. ZSTRUCTUREDMETADATA contient des colonnes supplémentaires propres à chaque flux, qui varient selon les versions.

Les flux couverts par les modules macOS d'APOLLO incluent /app/usage, /app/inFocus, /app/activity, /app/intents, /app/webUsage, /app/mediaUsage, /safari/history, /display/isBacklit, /device/isPluggedIn, /device/isLocked et /bluetooth/isConnected. Tous les Mac ne possèdent pas tous les flux.

Horodatages

ZSTARTDATE, ZENDDATE et ZCREATIONDATE sont en temps absolu Mac : des secondes (souvent fractionnaires) depuis le 2001-01-01 00:00:00 UTC. Ajoutez 978307200 pour obtenir des secondes Unix. Les valeurs stockées sont en UTC ; ZSECONDSFROMGMT donne le décalage local utilisé par l'appareil.

SELECT datetime(ZSTARTDATE + 978307200, 'unixepoch') AS start_utc,
       datetime(ZSTARTDATE + ZSECONDSFROMGMT + 978307200, 'unixepoch') AS start_local
FROM ZOBJECT LIMIT 5;
date -u -r $((694224000 + 978307200))   # macOS date: Mac absolute 694224000 -> UTC

Rétention

Sarah Edwards (mac4n6) a documenté environ quatre semaines d'événements dans ZOBJECT. L'élagage se fait par flux et dépend de la version : mesurez-le sur la preuve elle-même. Le ZSTARTDATE le plus ancien de chaque flux constitue la fenêtre de rétention effective et doit figurer dans votre rapport.

Collecte

En live, avec l'accès complet au disque accordé au Terminal ou à l'outil de collecte :

mkdir -p case/knowledgec_user
cp -p ~/Library/Application\ Support/Knowledge/knowledgeC.db* case/knowledgec_user/
shasum -a 256 case/knowledgec_user/*
  • UAC dispose d'un artefact knowledgec pour les deux chemins, mais il ne collecte que knowledgeC.db, sans les fichiers -wal et -shm ; ses propres notes précisent que la copie système n'est collectée que lorsque SIP est désactivé. Ne désactivez pas SIP pour la collecter : privilégiez une image complète du disque ou du volume Data et extrayez-en /private/var/db/CoreDuet/Knowledge/.
  • mac_apt peut exporter des fichiers depuis une image ; ouvrez la copie, jamais l'original, car ouvrir une base WAL sur place peut déclencher un checkpoint et la modifier.

Analyse

  • APOLLO exécute des modules SQL (knowledge_app_usage, knowledge_app_inFocus, knowledge_device_is_backlit, etc.) et les fusionne en une chronologie :
python3 apollo.py extract -o csv -p apple -v yolo -k modules/ case/knowledgec_user/
  • Plaso inclut le plugin SQLite mac_knowledgec (--parsers sqlite/mac_knowledgec).
  • En SQL brut, énumérez d'abord les flux, puis interrogez :
SELECT ZSTREAMNAME, COUNT(*),
       datetime(MIN(ZSTARTDATE)+978307200,'unixepoch') AS first_utc,
       datetime(MAX(ZSTARTDATE)+978307200,'unixepoch') AS last_utc
FROM ZOBJECT GROUP BY ZSTREAMNAME ORDER BY 2 DESC;

SELECT datetime(o.ZSTARTDATE+978307200,'unixepoch') AS start_utc,
       o.ZENDDATE - o.ZSTARTDATE AS seconds,
       o.ZVALUESTRING AS bundle_id,
       s.ZDEVICEID AS device_id
FROM ZOBJECT o LEFT JOIN ZSOURCE s ON o.ZSOURCE = s.Z_PK
WHERE o.ZSTREAMNAME = '/app/usage'
ORDER BY o.ZSTARTDATE;

KnowledgeC Parser lit dans le navigateur knowledgeC.db avec son -wal appliqué (les lignes présentes seulement dans le WAL sont signalées) et les flux Biome SEGB, avec sessions, totaux par application et export CSV ou Timesketch ; rien n'est envoyé.

Conseils d'investigation

  • Vérifiez .schema ZOBJECT et .schema ZSOURCE avant de lancer des requêtes toutes faites ; les colonnes évoluent d'une version à l'autre.
  • Un flux /app/inFocus clairsemé ou vide sur un Mac récent est normal, ce n'est pas une preuve d'effacement. Regardez dans Biome (App.InFocus) avant de conclure. Voir knowledgeC et Biome.
  • Regroupez les événements par ZSOURCE.ZDEVICEID : les lignes synchronisées depuis un iPhone ou un autre Mac du même compte ne doivent pas être attribuées à la machine examinée.
  • Associez les intervalles d'applications à /display/isBacklit et aux événements de connexion des Unified Logs : une application au premier plan alors que l'écran était éteint est un indice faible d'utilisation.
  • L'absence des fichiers -wal est la cause la plus fréquente d'une « absence d'activité récente ». Indiquez dans votre rapport s'ils ont été collectés.
  • Un ZSECONDSFROMGMT qui change d'un événement à l'autre est un bon indicateur de voyage ou de changement de fuseau horaire.
  • Croisez avec les totaux d'usage de Temps d'écran et avec l'historique des notifications.

Voir aussi