Grundlagen von macOS und Linux · Lektion 2 von 5
macOS-Aktivität: Unified Logs, FSEvents, KnowledgeC und Biome
10 Min. Lesezeit
Auf einem Mac verteilt sich die Antwort auf die Frage „Was hat dieser Benutzer wann getan?“ auf ein binäres Systemprotokoll, ein Änderungsjournal des Dateisystems, Nutzungsdatenbanken und einige kleine SQLite-Dateien. Jede Quelle erfasst einen anderen Ausschnitt der Aktivität und verwendet eine andere Zeitdarstellung; eine davon enthält überhaupt keine Zeitstempel. Diese Lektion zeigt, wo sich die einzelnen Quellen befinden, wie Sie sie erfassen und abfragen, welches Zeitformat sie verwenden und wie Sie eine Quelle durch eine andere bestätigen. Lektion 6.1 behandelte die macOS-Struktur und Plists, Lektion 3.1 die Mac Absolute Time, die von den meisten hier vorgestellten Quellen verwendet wird. Die folgenden Details ändern sich zwischen macOS-Versionen. Überprüfen Sie das Verhalten daher stets auf einem Referenzsystem derselben Version.
Unified Logging
Seit macOS 10.12 erfolgt nahezu die gesamte System- und Anwendungsprotokollierung über das Unified Logging-System. Meldungen werden in binären tracev3-Dateien unter /private/var/db/diagnostics in den Unterverzeichnissen Persist (die meisten aufbewahrten Meldungen), Special (ausgewählte, länger aufbewahrte Meldungen), Signpost (Leistungsmarker) und HighVolume (häufig leer) gespeichert. Eine tracev3-Datei speichert hauptsächlich die Argumente der einzelnen Meldungen. Die Formatzeichenfolgen befinden sich in /private/var/db/uuidtext, in Dateien, die nach der UUID der protokollierenden Binärdatei benannt sind. Das Unterverzeichnis timesync von diagnostics enthält die Datensätze, die benötigt werden, um die gespeicherte, auf den Systemstart bezogene Zeit in die tatsächliche Uhrzeit umzuwandeln. Ohne uuidtext- und timesync-Dateien lassen sich Meldungen weder vollständig darstellen noch zeitlich zuordnen. Erfassen Sie daher alle drei Komponenten. Da der Speicherplatz begrenzt ist, reicht die Aufbewahrungsdauer je nach Systemaktivität von Tagen bis zu wenigen Wochen.
Auf einem laufenden Mac sammelt sudo log collect --output case.logarchive alles in einem einzigen .logarchive-Paket; --last 3d oder --start "2026-03-14 00:00:00" begrenzt den Zeitraum. Die Analyse erfolgt mit log show --archive case.logarchive --predicate '…' --style json. Ein Prädikat ist ein Filter für Felder wie process, subsystem, category und eventMessage, beispielsweise process == "loginwindow", subsystem == "com.apple.xprotect" oder eventMessage CONTAINS "USBMSC". Ohne --info und --debug werden diese beiden niedrigeren Protokollierungsstufen nicht angezeigt. log show gibt Zeiten in der Zeitzone des Analyserechners mit einem numerischen Offset aus, etwa 2026-03-14 06:25:41.208114-0300. Wandeln Sie diese vor der Berichterstattung in UTC um.
In Protokollen aus dem Produktivbetrieb erscheinen dynamische Zeichenfolgen, die ein Entwickler nicht als öffentlich markiert hat, als <private>. Dies ist eine Protokollierungsentscheidung, die beim Schreiben des Ereignisses getroffen wurde, keine antiforensische Handlung. Der verborgene Wert lässt sich nachträglich nicht aus dem Protokoll wiederherstellen.
Nützliche Ausgangspunkte (der Wortlaut der Meldungen ändert sich zwischen Versionen; testen Sie Prädikate daher zuerst):
| Aktivität | Ausgangspunkt für das Prädikat |
|---|---|
| Anmeldung, Sperren und Entsperren | process == "loginwindow" |
| sudo-Nutzung | process == "sudo" (Benutzer, TTY, Arbeitsverzeichnis, Befehl) |
| USB-Speicher und Einbindungen | eventMessage CONTAINS "USBMSC"; process == "diskarbitrationd" |
| Bildschirmfreigabe | process == "screensharingd" (Authentifizierungsergebnis, Adresse des zugreifenden Rechners) |
| Gatekeeper | process == "syspolicyd" |
| XProtect | subsystem == "com.apple.xprotect" oder der XProtect-Prozessname der jeweiligen Version |
Auf einem Windows- oder Linux-Analyserechner lesen Open-Source-Parser wie die Bibliothek macos-UnifiedLogs von Mandiant und ihre Beispiel-Befehlszeilenwerkzeuge ein logarchive oder einen kopierten Satz aus diagnostics und uuidtext ein und exportieren CSV oder JSON. Nur auf dem Mac verfügbare Werkzeuge wie log sind für die Offline-Analyse nicht erforderlich.
Die älteren Textprotokolle in /private/var/log existieren weiterhin. system.log enthält inzwischen nur wenig, aber install.log zeichnet Softwareinstallationen und Updates mit lokalen Zeiten auf, die einen UTC-Offset enthalten.
FSEvents
Der Daemon fseventsd zeichnet Dateisystemänderungen in .fseventsd im Stammverzeichnis jedes beschreibbaren Volumes auf, einschließlich externer Laufwerke. Unter macOS 10.15 und neuer befindet sich das für Benutzerdateien relevante Verzeichnis auf dem Data-Volume (auf einem laufenden System unter /System/Volumes/Data eingebunden). Wird .fseventsd auf dem FAT32-, exFAT- oder APFS-Volume eines USB-Laufwerks gefunden, zeigt dies, dass es auf einem Mac beschreibbar eingebunden war.
Jede Datei in .fseventsd ist gzip-komprimiert und enthält Seiten, die mit einer Signatur beginnen: 1SLD auf älteren Systemen, 2SLD ab macOS 10.13 (wodurch jedem Datensatz eine Knoten-ID hinzugefügt wird) und eine spätere Variante 3SLD. Jeder Datensatz enthält einen vollständigen Pfad, eine 8-Byte-Ereignis-ID, die nur ansteigt, und ein 4-Byte-Flags-Feld mit Bits wie Created, Removed, Renamed, Modified, InodeMetaMod, FolderCreated und Mount.
FSEvents enthält keinen Zeitstempel pro Datensatz. Ereignis-IDs geben die Reihenfolge an, nicht die Zeit. Die übliche Schätzung basiert auf der Änderungszeit der gzip-Datei selbst: Alle Datensätze in dieser Datei wurden davor und im Allgemeinen nach der Änderungszeit der vorherigen Datei geschrieben. Grenzen Sie das Zeitfenster ein, indem Sie in derselben Datei einen Pfad finden, dessen Zeitpunkt Sie aus einer anderen Quelle kennen. FSEvents ist wertvoll, weil es die Namen gelöschter Dateien bewahrt, einschließlich Dateien auf externen Medien, sowie Umbenennungen, die einen früheren Namen erkennen lassen. Eine Datei namens no_log in .fseventsd unterbindet die Protokollierung für dieses Volume. Zu den Parsern gehören FSEventsParser und das FSEvents-Modul von mac_apt.
KnowledgeC
Die knowledgeC-Datenbank ist eine SQLite-Datei, die vom CoreDuet-Framework geführt wird. Es gibt zwei Kopien: benutzerspezifisch unter ~/Library/Application Support/Knowledge/knowledgeC.db und systemweit unter /private/var/db/CoreDuet/Knowledge/knowledgeC.db. Kopieren Sie jeweils auch die Dateien -wal und -shm, da sich aktuelle Zeilen häufig noch im Write-Ahead-Log befinden.
Ereignisse befinden sich in der Tabelle ZOBJECT. ZSTREAMNAME benennt den Stream, beispielsweise /app/inFocus (eine Anwendung im Vordergrund), /app/usage, /device/isLocked oder /safari/history; welche Streams vorhanden sind, hängt von der Version ab. ZVALUESTRING enthält den Wert, etwa die Bundle-ID einer App. ZSTARTDATE, ZENDDATE und ZCREATIONDATE sind Mac Absolute Time in UTC, und ZSECONDSFROMGMT zeichnet den UTC-Offset des Geräts zu diesem Zeitpunkt auf, beispielsweise -10.800 für UTC−3.
Unter neueren macOS-Versionen werden viele Streams, darunter der Anwendungsfokus, stattdessen in Biome geschrieben. Rechnen Sie unter macOS 13 und neuer damit, dass knowledgeC nur wenige Daten enthält oder Streams fehlen, die ältere Systeme aufgezeichnet haben. Ein dort leerer /app/inFocus-Stream ist kein Beleg für eine Löschung.
Biome
Biome speichert Streams in jeweils eigenen Ordnern unter ~/Library/Biome und bei System-Streams unter /private/var/db/biome; der Anwendungsfokus befindet sich in einem Stream namens App.InFocus. Die Dateien verwenden Apples SEGB-Format: die ASCII-Signatur SEGB in einem Header (es gibt zwei Header-Versionen), gefolgt von Datensätzen, deren Nutzdaten meist protobuf-Nachrichten sind und deren Datensatzzeiten in Mac Absolute Time vorliegen. Die Werkzeugunterstützung befindet sich noch in einem frühen Stadium und verändert sich schnell. Es gibt Open-Source-SEGB-Parser und Biome-Module in Community-Werkzeugen. Testen Sie jedoch jedes Werkzeug anhand einer bekannten Datei, bevor Sie seiner Ausgabe vertrauen.
Downloads, Browsernutzung und andere Benutzeraktivitäten
- Quarantäne-Datenbank:
~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2(SQLite, ohne Dateierweiterung). Die TabelleLSQuarantineEvententhält eine UUID (LSQuarantineEventIdentifier),LSQuarantineTimeStamp(Mac Absolute Time), den Agenten (LSQuarantineAgentName,LSQuarantineAgentBundleIdentifier),LSQuarantineDataURLString(die URL der Datei) undLSQuarantineOriginURLString(die verweisende Seite). Die heruntergeladene Datei trägt ein erweitertes Attributcom.apple.quarantine, beispielsweise0083;69b52883;Safari;<UUID>: Flags, die Downloadzeit als hexadezimale Unix-Sekunden, den Agenten und dieselbe UUID. Zeilen bleiben auch nach dem Löschen der Datei erhalten. - Safari:
~/Library/Safari/History.db, wobeihistory_itemsURLs undhistory_visitsjeden Besuch mitvisit_timein Mac Absolute Time enthält. Modul 4 behandelt Browser. - Zuletzt verwendete Objekte:
~/Library/Application Support/com.apple.sharedfilelist/enthält.sfl2-Dateien (.sfl3in neueren Versionen) für zuletzt verwendete Dokumente, Anwendungen und Server sowie anwendungsspezifische Listen zuletzt verwendeter Dokumente. Es handelt sich um archivierte Plists mit Lesezeichendaten (Pfad, Volume); die Listenreihenfolge zeigt, wie kürzlich die Objekte verwendet wurden, die Objekte enthalten jedoch im Allgemeinen keine individuellen Zeitstempel. Systeme vor 10.11 verwendetencom.apple.recentitems.plistin~/Library/Preferences. - TCC.db: die Datenbank für Datenschutzberechtigungen, benutzerspezifisch unter
~/Library/Application Support/com.apple.TCC/TCC.dbund systemweit unter/Library/Application Support/com.apple.TCC/TCC.db. Die Tabelleaccessführt einenservice(etwakTCCServiceScreenCapture,kTCCServiceAccessibilityoderkTCCServiceSystemPolicyAllFilesfür Festplattenvollzugriff), dieclient-App,auth_value(2 bedeutet unter macOS 11 und neuer „erlaubt“) undlast_modifiedin Unix-Sekunden auf. Ein Fernsteuerungswerkzeug mit erteilten Berechtigungen für Bildschirmaufnahme und Bedienungshilfen fällt hier auf. - Spotlight:
.Spotlight-V100auf jedem indizierten Volume enthält den Metadatenindex, einschließlich Attributen wiekMDItemLastUsedDateundkMDItemWhereFroms; Parser wie das Spotlight-Plugin vonmac_aptkönnen ihn lesen.
Welche Quelle welche Frage beantwortet
| Frage | Quelle | Pfad | Zeitformat |
|---|---|---|---|
| Wann hat sich der Benutzer angemeldet oder das System entsperrt? | Unified Logs | /private/var/db/diagnostics + uuidtext | Mit Offset dargestellt; in UTC umwandeln |
| Welche Dateien wurden erstellt, umbenannt oder gelöscht? | FSEvents | .fseventsd auf jedem Volume | Keines; anhand der mtime der gzip-Datei schätzen |
| Welche App war wie lange im Vordergrund? | knowledgeC / Biome | knowledgeC.db; ~/Library/Biome | Mac Absolute Time |
| Was wurde von wo heruntergeladen? | Quarantäne-Datenbank | ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 | Mac Absolute Time (xattr: Unix-Zeit in Hexadezimaldarstellung) |
| Welche Seiten wurden besucht? | Safari | ~/Library/Safari/History.db | Mac Absolute Time |
| Welche App erhielt Bildschirm- oder Festplattenzugriff? | TCC | .../com.apple.TCC/TCC.db | Unix-Sekunden |
Durchgerechnetes Beispiel: ein Download, ein Start und ein Protokolleintrag
Untersucht wird ein auf UTC−3 eingestellter Mac. Die Quarantäne-Datenbank enthält eine relevante Zeile:
| Feld | Wert |
|---|---|
LSQuarantineTimeStamp | 795.172.867,0 |
LSQuarantineAgentName | Safari |
LSQuarantineOriginURLString | https://www.example.net/support |
LSQuarantineDataURLString | https://downloads.example.net/files/RemoteHelper.dmg |
Mac Absolute Time in Unix-Zeit: 795.172.867 + 978.307.200 = 1.773.480.067, das entspricht 2026-03-14T09:21:07Z. In Hexadezimaldarstellung ist 1.773.480.067 gleich 69b52883, dem erwarteten Wert im zweiten Feld des Attributs com.apple.quarantine der Datei.
Die knowledgeC-Datenbank des Benutzers enthält eine /app/inFocus-Zeile mit ZVALUESTRING = net.example.RemoteHelper, ZSTARTDATE = 795.173.145,0, ZENDDATE = 795.173.412,0 und ZSECONDSFROMGMT = -10.800.
- Beginn: 795.173.145 + 978.307.200 = 1.773.480.345 = 2026-03-14T09:25:45Z.
- Ende: 795.173.412 + 978.307.200 = 1.773.480.612 = 2026-03-14T09:30:12Z.
- Dauer: 795.173.412 − 795.173.145 = 267 s (4 min 27 s).
- -10.800 s entsprechen −3 h, der lokale Beginn war also 06:25:45. Wenden Sie den Offset nicht auf den gespeicherten Wert an;
ZSTARTDATEliegt bereits in UTC vor.
Im Unified Log liefert log show --archive case.logarchive --predicate 'process == "syspolicyd" AND eventMessage CONTAINS "RemoteHelper"' eine Gatekeeper-Bewertung von /Applications/RemoteHelper.app um 2026-03-14 06:25:41.208114-0300. Durch Addition von 3 Stunden ergibt sich 09:25:41Z, vier Sekunden bevor die App in den Vordergrund gelangte. Dies passt zu einem ersten Start, der von Gatekeeper geprüft wird. Drei unabhängige Quellen ergeben nun einen Ablauf: Download um 09:21:07Z, Gatekeeper-Prüfung um 09:25:41Z, App im Vordergrund von 09:25:45Z bis 09:30:12Z. FSEvents kann die Erstellung von RemoteHelper.app in /Applications ergänzen, allerdings nur als Ereignis mit einer Position in der Reihenfolge, ohne eigene Zeitangabe.
Prüfungsschwerpunkt: Rechnen Sie mit Fragen dazu, wo sich die einzelnen Quellen befinden, welches Zeitformat sie verwenden (Mac Absolute Time für knowledgeC, Biome, Quarantäne und Safari; Unix-Sekunden in TCC und in Hexadezimaldarstellung im Quarantäne-Attribut; kein Zeitstempel in FSEvents), sowie zur Umwandlung eines Mac-Absolute-Time-Werts in ISO 8601 UTC. Sie sollten wissen, warum uuidtext- und timesync-Dateien zusammen mit tracev3-Dateien erfasst werden müssen, was <private> bedeutet und warum knowledgeC unter neueren macOS-Versionen nur wenige Daten enthalten kann.
Kernpunkte
- Unified Logs: tracev3-Dateien in
/private/var/db/diagnosticsbenötigenuuidtext- und timesync-Daten; erfassen Sie sie mitlog collect, filtern Sie mitlog show --predicateund rechnen Sie die ausgegebene Zeit unter Berücksichtigung des Offsets in UTC um. - FSEvents zeichnet pro Volume Pfade, Flags und Ereignis-IDs auf, einschließlich gelöschter Namen auf externen Laufwerken, jedoch keine Zeit pro Datensatz.
- knowledgeC speichert Nutzungs-Streams wie
/app/inFocusin Mac Absolute Time mitZSECONDSFROMGMT; neuere macOS-Versionen verlagern einen Großteil davon in Biome-SEGB-Dateien. - Die Quarantäne-Datenbank verknüpft URL, Agent und Zeitpunkt eines Downloads mit dem Attribut
com.apple.quarantineder Datei. - TCC.db zeigt, welche Apps Datenschutzberechtigungen erhalten haben, mit Zeitangaben in Unix-Sekunden.
- Bestätigen Sie die Befunde gegenseitig: Download, Protokolleintrag und Nutzungsdatensatz sollten einen konsistenten Ablauf ergeben.