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
Outils
Comparer tous les outils- KnowledgeC ParserNavigateur
- APOLLOCLI · open source
- PlasoCLI · open source
- sqlite3CLI · intégré à macOS
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ée | Chemin | Protection |
|---|---|---|
| Système | /private/var/db/CoreDuet/Knowledge/knowledgeC.db | Appartient à root, restreint par SIP. UAC indique ne collecter ce fichier en live que lorsque SIP est désactivé |
| Utilisateur | ~/Library/Application Support/Knowledge/knowledgeC.db | Proté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) :
| Colonne | Signification |
|---|---|
ZSTREAMNAME | Flux, par exemple /app/usage, /display/isBacklit |
ZVALUESTRING | Valeur texte principale, en général un bundle ID ou une URL |
ZVALUEINTEGER / ZVALUEDOUBLE | Valeur numérique pour les flux booléens ou mesurés (1 = actif) |
ZSTARTDATE / ZENDDATE | Début et fin de l'intervalle |
ZCREATIONDATE | Moment où la ligne a été écrite |
ZSECONDSFROMGMT | Décalage UTC de l'appareil en secondes au moment de l'événement |
ZSTARTDAYOFWEEK | Jour de la semaine, 1 = dimanche |
ZUUID | UUID de l'événement |
ZSOURCE | Clé étrangère vers ZSOURCE.Z_PK |
ZSTRUCTUREDMETADATA | Clé é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
knowledgecpour les deux chemins, mais il ne collecte queknowledgeC.db, sans les fichiers-walet-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 ZOBJECTet.schema ZSOURCEavant de lancer des requêtes toutes faites ; les colonnes évoluent d'une version à l'autre. - Un flux
/app/inFocusclairsemé 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/isBacklitet 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
-walest la cause la plus fréquente d'une « absence d'activité récente ». Indiquez dans votre rapport s'ils ont été collectés. - Un
ZSECONDSFROMGMTqui 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
Artefacts liés
Guides détaillés
Glossaire
- knowledgeC.dbAnglais
- Mac Absolute TimeAnglais
- BiomeAnglais
- TCC (Transparency, Consent, and Control)Anglais