Skip to content

Forensische Analyse von knowledgeC.db: der macOS-Leitfaden

Was knowledgeC.db unter macOS aufzeichnet, wo sie liegt, wie ZOBJECT und Streams aufgebaut sind, wie Sie Zeitstempel umrechnen und was die Daten nicht beweisen.

Veröffentlicht am 8 Min. Lesezeit

Kurz gesagt. knowledgeC.db ist eine SQLite-Datenbank, die Apples Framework CoreDuet schreibt. Sie zeichnet „Pattern of Life“-Ereignisse unter macOS als Intervalle auf: eine App in Benutzung, das Display beleuchtet, der Mac gesperrt oder am Netzteil, eine besuchte Webdomain. Es gibt eine Systemkopie und eine Kopie pro Benutzer, beide im WAL-Modus. Jede Zeile der Tabelle ZOBJECT gehört zu einem Stream wie /app/usage und trägt Start- und Endzeit in Mac Absolute Time. Die Datenbank sagt Ihnen, welche Apps wann benutzt wurden; sie sagt Ihnen nicht, wer an der Tastatur saß. Unter aktuellem macOS sind viele Streams, darunter der App-Fokus, nach Biome gewandert, untersuchen Sie also beide Quellen.

Was knowledgeC.db ist

Die knowledgeC-Datenbank ist ein Core-Data-Speicher, weshalb ihre Tabellen und Spalten das Präfix Z tragen. CoreDuet schreibt eine Zeile pro Ereignis, gruppiert nach Stream. Anders als Zeitstempel im Dateisystem, die nur sagen, wann sich eine Datei geändert hat, hat jede Zeile einen Anfang und ein Ende. Die Datenbank beantwortet also Fragen nach der Dauer: Wie lange war Terminal in Benutzung, wann wurde der Bildschirm dunkel, hing der Mac nachts am Netzteil?

Damit ist sie eine Quelle für Zeitleisten, nicht für Inhalte. Sie erhalten Bundle-IDs, URLs, Domains und Ein/Aus-Zustände. Sie erhalten keine Dokumente, Tastatureingaben oder Befehle.

Wo sie liegt

BereichPfadSchutz
System/private/var/db/CoreDuet/Knowledge/knowledgeC.dbGehört root, eingeschränkt durch System Integrity Protection
Benutzer~/Library/Application Support/Knowledge/knowledgeC.dbDurch TCC geschützt: Der sichernde Prozess braucht Festplattenvollzugriff

Beide Datenbanken laufen im SQLite-WAL-Modus. Die Begleitdateien knowledgeC.db-wal und knowledgeC.db-shm müssen zusammen mit der Hauptdatei gesichert werden: Die neuesten Ereignisse existieren oft nur im WAL. Befehle zur Sicherung, die Optionen mit UAC und Velociraptor sowie die Abwägungen rund um SIP behandelt knowledgeC.db: Speicherort und Sicherung; was das WAL enthält und wie Sie es auslesen, steht in aktuelle Ereignisse aus knowledgeC.db-wal retten.

Der Aufbau der Datenbank

Drei Tabellen enthalten fast alles, was Sie als Ermittler brauchen.

ZOBJECT: eine Zeile pro Ereignis

ZOBJECT ist die Ereignistabelle.

SpalteBedeutung
ZSTREAMNAMEStream, zum Beispiel /app/usage oder /display/isBacklit
ZVALUESTRINGHaupt-Stringwert, meist eine Bundle-ID oder eine URL
ZVALUEINTEGER / ZVALUEDOUBLENumerischer Wert für Zustands- oder Mess-Streams
ZSTARTDATE / ZENDDATEBeginn und Ende des Intervalls
ZCREATIONDATEZeitpunkt, zu dem die Zeile geschrieben wurde
ZSECONDSFROMGMTUTC-Versatz des Geräts in Sekunden zum Zeitpunkt des Ereignisses
ZSTARTDAYOFWEEKWochentag, 1 = Sonntag
ZUUIDUUID des Ereignisses
ZSOURCEVerweis auf die Tabelle ZSOURCE
ZSTRUCTUREDMETADATAVerweis auf die Tabelle ZSTRUCTUREDMETADATA

ZSOURCE: wer das Ereignis erzeugt hat

ZSOURCE beschreibt den Erzeuger, mit Spalten wie ZBUNDLEID und ZDEVICEID. APOLLO liest ZDEVICEID als Kennung des Ursprungsgeräts. Das ist wichtig, weil Zeilen, die von einem anderen Gerät mit demselben Apple Account synchronisiert wurden, in der Datenbank auftauchen können. Gruppieren Sie nach Gerät, bevor Sie irgendetwas dem untersuchten Mac zuordnen.

ZSTRUCTUREDMETADATA: Zusatzdaten je Stream

ZSTRUCTUREDMETADATA enthält zusätzliche Spalten je Stream, zum Beispiel Z_DKDIGITALHEALTHMETADATAKEY__WEBDOMAIN und Z_DKDIGITALHEALTHMETADATAKEY__WEBPAGEURL für die Webnutzung, Z_DKSAFARIHISTORYMETADATAKEY__TITLE für den Safari-Verlauf oder Z_DKNOTIFICATIONUSAGEMETADATAKEY__BUNDLEID für Mitteilungen.

Die Spalten ändern sich zwischen macOS-Versionen. Lesen Sie das Schema der Kopie, die Ihnen vorliegt, bevor Sie eine vorgefertigte Abfrage ausführen.

Streams, denen Sie begegnen werden

Die folgenden Werte sind die, die die Module von APOLLO verwenden.

StreamWertBedeutung
/app/usageZVALUESTRING = Bundle-IDApp in Benutzung, mit Beginn und Ende
/app/inFocusZVALUESTRING = Bundle-IDApp im Fokus
/device/isLockedZVALUEINTEGER 1 / 01 = gesperrt, 0 = entsperrt
/display/isBacklitZVALUEINTEGER 1 / 01 = Display beleuchtet
/device/isPluggedInZVALUEINTEGER 1 / 01 = am Netzteil
/safari/historyZVALUESTRING = URLSeitentitel in den strukturierten Metadaten
/app/webUsageBundle-IDDomain und URL in den strukturierten Metadaten
/notification/usageZVALUESTRING = MitteilungstypBundle-ID in den strukturierten Metadaten

Die macOS-Module von APOLLO decken außerdem Streams wie /app/activity, /app/intents, /app/mediaUsage und /bluetooth/isConnected ab. Nicht jeder Mac hat jeden Stream, ermitteln Sie also zuerst, was tatsächlich vorhanden ist:

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;

Zeitstempel und Zeitzonen

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.

Die gespeicherten Werte sind UTC. ZSECONDSFROMGMT hält den Versatz fest, den das Gerät zu diesem Zeitpunkt angewendet hat. So können Sie die Ortszeit anzeigen, ohne die Zeitzone zu raten, und eine Änderung dieses Werts zwischen Ereignissen ist ein nützlicher Hinweis auf eine Reise oder einen Zeitzonenwechsel.

SELECT datetime(ZSTARTDATE + 978307200, 'unixepoch') AS start_utc,
       datetime(ZSTARTDATE + ZSECONDSFROMGMT + 978307200, 'unixepoch') AS start_local
FROM ZOBJECT LIMIT 5;

Verwenden Sie UTC als Referenz und zeigen Sie die Ortszeit daneben an. Beides in einer Zeitleiste zu vermischen, ist die häufigste Ursache für Fehler von einer oder zwei Stunden.

Aufbewahrungsdauer

Sarah Edwards (mac4n6) hat für knowledgeC Ereignisse aus etwa vier Wochen dokumentiert. Das Bereinigen erfolgt je Stream und unterscheidet sich zwischen den Versionen. Zitieren Sie in einem Bericht daher keine Zahl aus der Literatur: Der älteste ZSTARTDATE je Stream in der obigen Abfrage ist das tatsächliche Aufbewahrungsfenster in Ihrem Beweismaterial, und es gehört in Ihre Befunde.

knowledgeC und Biome

Unter aktuellen macOS-Versionen hat Apple viele Streams nach Biome verlagert, das sie als SEGB-Dateien mit Protobuf-Datensätzen speichert; der App-Fokus zum Beispiel ist in App.InFocus zu erwarten und nicht in /app/inFocus. Die Zuordnung Stream für Stream und was Sie je Version erwarten können, steht in knowledgeC vs. Biome.

Was sie beweist und was nicht

knowledgeC stützt Aussagen wie:

  • diese Bundle-ID war von diesem bis zu jenem Zeitpunkt in Benutzung oder im Fokus;
  • das Display war beleuchtet, der Mac war entsperrt oder hing am Netzteil, während dieses Intervalls;
  • diese Domain oder URL wurde in dieser App besucht, sofern die Web-Streams vorhanden sind.

Sie beweist nicht:

  • wer an der Tastatur saß. Ein entsperrter Mac mit einer App im Fokus ist damit vereinbar, dass jemand ihn benutzt hat, nicht mit einer namentlich bestimmten Person. Wie Sie diese Argumentation aufbauen und wo ihre Grenzen liegen, steht in wer saß an der Tastatur;
  • was in einer App getan wurde. Es gibt keine Dateinamen und keine Befehlszeilen;
  • aktive Nutzung in jedem Fall. Eine App „in Benutzung“ kann ein Fenster sein, das vor einem untätigen Bildschirm offen blieb. Kombinieren Sie App-Intervalle mit /display/isBacklit und /device/isLocked;
  • eine Löschung, wenn ein Stream leer ist. Auf einem aktuellen Mac ist ein leerer Stream /app/inFocus zu erwarten.

Trennen Sie außerdem lokale Zeilen von Zeilen, die von anderen Geräten synchronisiert wurden, anhand von ZSOURCE.ZDEVICEID.

Werkzeuge zur Auswertung

WerkzeugWas es tut
APOLLOSQL-Module je Stream, zu einer Zeitleiste zusammengeführt
PlasoParser sqlite/mac_knowledgec für Super-Timelines
VelociraptorExchange-Artefakt MacOS.Applications.KnowledgeC, das Zeilen aus /app/activity und /app/inFocus direkt auf dem System auswertet
sqlite3Ad-hoc-SQL, nur auf einer Kopie
KnowledgeC ParserIm Browser: wendet das WAL an, markiert Zeilen, die nur im WAL stehen oder durch das WAL entfernt wurden, führt knowledgeC mit Biome zusammen

Welches Werkzeug Sie auch verwenden, arbeiten Sie mit Kopien. Öffnen Sie eine WAL-Datenbank mit einem normalen SQLite-Client, kann dieser einen Checkpoint auslösen: Er schreibt die Hauptdatei neu und kann das WAL leeren, das Sie untersuchen wollten.

Ein kurzes Beispiel (synthetisch)

Die mit dem Werkzeug ausgelieferte Beispielsammlung ist fiktiv. Auf dem MacBook FIN-MBP-03, Benutzerin dana.whitlock, zeigt die Systemdatenbank am 2026-09-14 um 10:04:31 UTC ein Entsperren in /device/isLocked, mit ZSECONDSFROMGMT = 7200, also 12:04 Uhr Ortszeit, während sie beim Mittagessen war. /app/usage zeigt danach Terminal, Systemeinstellungen und Finder, und die Benutzerdatenbank zeigt /app/webUsage für transfer.example, bevor der Mac um 10:49 UTC gesperrt wird. Jede dieser Zeilen steht in der -wal, nicht in der Hauptdatei. Ohne das WAL sähe das Zeitfenster des Vorfalls leer aus.

Was das belegt: Der Mac war entsperrt, und diese Apps waren in diesem Zeitfenster in Benutzung. Was es nicht belegt: dass Dana oder eine bestimmte andere Person das getan hat. Um das Beispiel zu laden und denselben Schritten zu folgen, lesen Sie knowledgeC und Biome im Browser analysieren.

FAQ

Wo liegt knowledgeC.db unter macOS?

Es gibt zwei Kopien. Die Systemdatenbank ist /private/var/db/CoreDuet/Knowledge/knowledgeC.db (gehört root und ist durch SIP geschützt), die Benutzerdatenbank ist ~/Library/Application Support/Knowledge/knowledgeC.db (durch TCC geschützt, der sichernde Prozess braucht also Festplattenvollzugriff). Beide laufen im WAL-Modus, sichern Sie daher knowledgeC.db-wal und knowledgeC.db-shm zusammen mit der Hauptdatei.

Wie rechne ich knowledgeC-Zeitstempel um?

ZSTARTDATE, ZENDDATE und ZCREATIONDATE sind Mac Absolute Time: Sekunden seit 2001-01-01 00:00:00 UTC. Addieren Sie 978307200, um Unix-Zeit zu erhalten. Die gespeicherten Werte sind UTC; ZSECONDSFROMGMT gibt den Versatz in Sekunden an, den das Gerät zum Zeitpunkt des Ereignisses verwendet hat.

Warum ist /app/inFocus auf einem aktuellen Mac leer?

Unter aktuellen macOS-Versionen ist der App-Fokus im Biome-Stream App.InFocus zu erwarten und nicht in knowledgeC. Ein spärlich gefüllter oder leerer Stream /app/inFocus ist daher normal und kein Hinweis auf eine Löschung. Prüfen Sie außerdem, ob die -wal-Datei gesichert wurde, denn die neuesten Zeilen existieren oft nur dort.

Beweist knowledgeC.db, wer den Mac benutzt hat?

Nein. Sie zeigt, dass eine App zu bestimmten Zeiten in Benutzung oder im Fokus war, dass das Display beleuchtet oder der Mac entsperrt war. Sie identifiziert nicht die Person an der Tastatur und zeichnet weder Dateinamen noch Befehlszeilen auf. Für eine Zuordnung braucht es die Bestätigung durch andere Artefakte.

Verwandte Artikel

Verwandte Artikel

knowledgeC.db oder Biome? Wie sich die Aktivitätsspeicher von macOS unterscheiden, welche Streams sich entsprechen und was aktuelle Versionen erwarten lassen.
Anleitung: knowledgeC.db mit -wal und Biome-SEGB-Streams im kostenlosen Browser-Parser laden, Zeitraum setzen, Sitzungen prüfen, Zeitleiste exportieren.
Wo knowledgeC.db und Biome-Streams unter macOS liegen und wie Sie sie mit Terminal, UAC, Velociraptor oder aus einem Abbild sichern, ohne das WAL zu verlieren.