Zum Inhalt springen

BenutzeraktivitätAusführung

knowledgeC.db: App-Nutzung und Geräteaktivität unter macOS

SQLite-Datenbank von CoreDuet mit App-Nutzung, Fokus, Display- und Stromstatus unter macOS; zeigt, wann und wie lange Apps genutzt wurden.

Speicherort
/private/var/db/CoreDuet/Knowledge/knowledgeC.db
Belegt
Welche Apps wann und wie lange genutzt wurden und ob das Display zu dem Zeitpunkt an war
Zeitstempel
Mac Absolute Time (Sekunden seit 2001-01-01 UTC) plus Offset in ZSECONDSFROMGMT
Zugriff
root plus SIP-Einschränkungen (System-DB); Full Disk Access (Benutzer-DB)
Aufbewahrung
Auf typischen Systemen etwa vier Wochen an Ereignissen (je nach Stream unterschiedlich)
Sicherung
UAC, Disk image, cp

Was es ist

knowledgeC.db ist eine SQLite-Datenbank, die Apples Framework CoreDuet schreibt. Sie erfasst „Pattern of Life“-Ereignisse als Intervalle: eine genutzte Anwendung, ein beleuchtetes Display, ein Mac am Netzteil, eine besuchte Web-Domain und mehr. Jedes Ereignis gehört zu einem benannten Stream wie /app/usage und hat eine Start- und Endzeit. Deshalb beantwortet es Fragen zur Dauer, die Zeitstempel des Dateisystems nicht beantworten können.

Die Datenbank ist ein Core-Data-Speicher, Tabellen und Spalten tragen daher das Präfix Z. Auf neueren macOS-Versionen hat Apple viele Streams nach Biome verlagert, sodass eine moderne knowledgeC.db spärlich gefüllt sein kann. Untersuchen Sie immer beide.

Wo es liegt

BereichPfadSchutz
System/private/var/db/CoreDuet/Knowledge/knowledgeC.dbGehört root, durch SIP eingeschränkt. UAC dokumentiert, dass es diese Datei live nur bei deaktiviertem SIP sichert
Benutzer~/Library/Application Support/Knowledge/knowledgeC.dbDurch TCC geschützt: Der sichernde Prozess benötigt Full Disk Access

Beide Datenbanken laufen im WAL-Modus. Sichern Sie knowledgeC.db-wal und knowledgeC.db-shm zusammen mit der Hauptdatei: Die jüngsten Ereignisse stehen oft nur im WAL.

Was es belegt

  • Welche Bundle-IDs genutzt wurden (/app/usage) oder im Fokus waren (/app/inFocus) und für wie viele Sekunden.
  • Wann der Bildschirm beleuchtet war (/display/isBacklit) und wann der Mac am Netzstrom hing (/device/isPluggedIn).
  • Web- und Mediennutzung pro App (/app/webUsage, /app/mediaUsage) und Safari-Verlaufseinträge (/safari/history), sofern diese Streams existieren.
  • Aktivität anderer Geräte mit demselben Apple Account, sofern synchronisierte Zeilen vorhanden sind (siehe Tipps).

Es belegt nicht, dass eine bestimmte Person an der Tastatur saß, und es erfasst weder Dateinamen noch Befehlszeilen. Eine „genutzte“ App kann ein offenes Fenster vor einem inaktiven Bildschirm sein.

Wichtige Felder

Haupttabelle ZOBJECT (eine Zeile pro Ereignis):

SpalteBedeutung
ZSTREAMNAMEStream, z. B. /app/usage, /display/isBacklit
ZVALUESTRINGHauptwert als String, meist eine Bundle-ID oder URL
ZVALUEINTEGER / ZVALUEDOUBLENumerischer Wert für boolesche oder gemessene Streams (1 = an)
ZSTARTDATE / ZENDDATEBeginn und Ende des Intervalls
ZCREATIONDATEZeitpunkt, zu dem die Zeile geschrieben wurde
ZSECONDSFROMGMTUTC-Offset des Geräts in Sekunden zum Ereigniszeitpunkt
ZSTARTDAYOFWEEKWochentag, 1 = Sonntag
ZUUIDUUID des Ereignisses
ZSOURCEFremdschlüssel auf ZSOURCE.Z_PK
ZSTRUCTUREDMETADATAFremdschlüssel auf ZSTRUCTUREDMETADATA.Z_PK

ZSOURCE beschreibt den Erzeuger; APOLLO liest ZSOURCE.ZDEVICEID als Hardware-UUID des Ursprungsgeräts. ZSTRUCTUREDMETADATA enthält streamspezifische Zusatzspalten, die je nach Version variieren.

Die macOS-Module von APOLLO decken unter anderem folgende Streams ab: /app/usage, /app/inFocus, /app/activity, /app/intents, /app/webUsage, /app/mediaUsage, /safari/history, /display/isBacklit, /device/isPluggedIn, /device/isLocked und /bluetooth/isConnected. Nicht jeder Mac hat jeden Stream.

Zeitstempel

ZSTARTDATE, ZENDDATE und ZCREATIONDATE sind Mac Absolute Time: Sekunden (oft mit Nachkommastellen) seit 2001-01-01 00:00:00 UTC. Addieren Sie 978307200, um Unix-Sekunden zu erhalten. Gespeicherte Werte sind UTC; ZSECONDSFROMGMT gibt den lokalen Offset an, den das Gerät verwendete.

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

Aufbewahrung

Sarah Edwards (mac4n6) dokumentierte etwa vier Wochen an Ereignissen in ZOBJECT. Die Bereinigung erfolgt pro Stream und hängt von der Version ab. Messen Sie sie daher an den Beweismitteln: Das älteste ZSTARTDATE pro Stream ist das tatsächliche Aufbewahrungsfenster und gehört in Ihren Bericht.

Sicherung

Live, mit Full Disk Access für Terminal oder das Sicherungstool:

mkdir -p case/knowledgec_user
cp -p ~/Library/Application\ Support/Knowledge/knowledgeC.db* case/knowledgec_user/
shasum -a 256 case/knowledgec_user/*
  • UAC hat ein Artefakt knowledgec für beide Pfade, sichert aber nur knowledgeC.db, nicht die Dateien -wal und -shm; laut eigenen Hinweisen wird die System-Kopie nur bei deaktiviertem SIP gesichert. Deaktivieren Sie SIP dafür nicht: Erstellen Sie lieber ein Image der gesamten Platte oder des Data-Volumes und extrahieren Sie daraus /private/var/db/CoreDuet/Knowledge/.
  • mac_apt kann Dateien aus einem Image exportieren. Öffnen Sie die Kopie, nie das Original, denn das Öffnen einer WAL-Datenbank an Ort und Stelle kann einen Checkpoint auslösen und sie verändern.

Auswertung

  • APOLLO führt SQL-Module aus (knowledge_app_usage, knowledge_app_inFocus, knowledge_device_is_backlit usw.) und führt sie zu einer Zeitleiste zusammen:
python3 apollo.py extract -o csv -p apple -v yolo -k modules/ case/knowledgec_user/
  • Plaso enthält das SQLite-Plugin mac_knowledgec (--parsers sqlite/mac_knowledgec).
  • Reines SQL: zuerst die Streams auflisten, dann abfragen:
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 liest knowledgeC.db mit angewendetem -wal (Zeilen, die nur im WAL stehen, werden markiert) und Biome-SEGB-Streams im Browser, mit Sitzungen, Summen pro App und CSV- oder Timesketch-Export; es wird nichts hochgeladen.

Tipps für die Untersuchung

  • Prüfen Sie .schema ZOBJECT und .schema ZSOURCE, bevor Sie vorgefertigte Abfragen ausführen; Spalten ändern sich zwischen Versionen.
  • Ein spärliches oder leeres /app/inFocus auf einem aktuellen Mac ist zu erwarten und kein Beleg für eine Löschung. Sehen Sie in Biome (App.InFocus) nach, bevor Sie Schlüsse ziehen. Siehe knowledgeC und Biome.
  • Gruppieren Sie Ereignisse nach ZSOURCE.ZDEVICEID: Von einem iPhone oder einem anderen Mac desselben Accounts synchronisierte Zeilen dürfen nicht dem untersuchten Gerät zugeschrieben werden.
  • Kombinieren Sie App-Intervalle mit /display/isBacklit und Anmeldeereignissen in den Unified Logs: Eine App im Fokus bei ausgeschaltetem Display ist ein schwacher Nutzungsbeleg.
  • Fehlende -wal-Dateien sind der häufigste Grund für „keine jüngste Aktivität“. Vermerken Sie im Bericht, ob sie gesichert wurden.
  • Wechselt ZSECONDSFROMGMT zwischen Ereignissen, ist das ein nützlicher Hinweis auf Reisen oder einen Zeitzonenwechsel.
  • Korrelieren Sie mit den Nutzungssummen der Bildschirmzeit und dem Mitteilungsverlauf.

Siehe auch