Forensik mit macOS Unified Logs: ein Praxisleitfaden
Was macOS Unified Logs aufzeichnen, wo tracev3, uuidtext und timesync liegen, was sie beweisen können und was nicht – und wie Sie sie für Ermittlungen lesen.
Kurz gesagt. Unified Logs sind die detaillierteste Zeitleiste, die ein Mac führt: Anmeldungen, sudo, Datenschutzentscheidungen (TCC), Gatekeeper, Launch-Agents, Fernzugriff und das Einbinden von Datenträgern, jeweils mit Prozess, Subsystem und mikrosekundengenauem Zeitstempel. Der Haken: Ein Eintrag verteilt sich auf drei Arten von Dateien – .tracev3, uuidtext/dsc und timesync –, und Sie brauchen alle davon. Dieser Leitfaden erklärt, was wo liegt und wie Sie es durcharbeiten; der Unified Log Parser liest alles in Ihrem Browser.
Was das Unified-Logging-System ist
Seit macOS 10.12 Sierra leitet Apple nahezu die gesamte Protokollierung über ein einziges System. Der Kernel, Apples Daemons und jeder Drittanbietercode, der os_log aufruft, senden Einträge an logd, der sie in komprimierte Binärdateien schreibt. Textdateien im Syslog-Stil unter /var/log gibt es weiterhin, doch das meiste, was in einer Ermittlung zählt, liegt im einheitlichen Speicher.
Jeder Eintrag enthält:
- die Zeit, nach der Umrechnung mikrosekundengenau;
- den Prozess (Image-Pfad und PID), Thread und User-ID;
- das Sender-Image: die Bibliothek oder das Framework, das protokolliert hat (oft nicht der Prozess selbst);
- ein Subsystem und eine Kategorie in Reverse-DNS-Form, zum Beispiel
com.apple.TCC/access; - einen Typ: Default, Info, Debug, Error oder Fault bei Log-Meldungen, dazu Activities, Signposts und Statedumps;
- die Meldung, gerendert aus einem Formatstring und den mit dem Eintrag gespeicherten Werten.
Wo die Dateien liegen
| Pfad | Inhalt |
|---|---|
/private/var/db/diagnostics/Persist/ | Hauptspeicher der .tracev3-Dateien |
/private/var/db/diagnostics/Special/ | Einträge mit eigener Lebensdauer (oft älter als Persist) |
/private/var/db/diagnostics/Signpost/ | Performance-Signposts |
/private/var/db/diagnostics/HighVolume/ | Daten mit hohem Volumen, meist leer |
/private/var/db/diagnostics/timesync/ | Datensätze zur Korrelation von Bootvorgang und Uhr |
/private/var/db/uuidtext/XX/… | Formatstrings, eine Datei pro Binary-UUID |
/private/var/db/uuidtext/dsc/… | Strings des dyld Shared Cache |
Ein .logarchive, erzeugt von log collect oder sysdiagnose, enthält dieselben Ordner plus logdata.LiveData.tracev3, den Speicherpuffer zum Zeitpunkt der Sicherung. Der Artikel zum tracev3-Format geht den binären Aufbau durch.
Warum Sie immer drei Arten von Dateien brauchen
Ein .tracev3-Eintrag speichert seinen Text nicht. Er speichert einen Verweis auf einen Formatstring (einen Offset in eine uuidtext-Datei oder in die dsc-Datei des Shared Cache) und die rohen Argumentwerte. Ohne die String-Dateien kann ein Parser nur Zahlen und Fragmente anzeigen; die Einträge sind „unaufgelöst“. Zeiten werden als bootrelative Mach Continuous Time gespeichert und mithilfe der timesync-Datensätze in Uhrzeit umgerechnet; ohne sie sind Zeiten bestenfalls Näherungswerte.
Die Regel für die Sicherung ist daher einfach: Nehmen Sie diagnostics und uuidtext mit, oder ein .logarchive, das beides enthält.
Was Unified Logs beweisen können
- Anmeldung und Rechtenutzung:
sudo-Befehle mit Zielbenutzer und vollständiger Befehlszeile, falsche Passwörter,su, vonauthdgewährte Autorisierungsrechte, Änderungen an lokalen Konten. - Fernzugriff: SSH-Sitzungen (
sshd,sshd-session) und Sitzungen der Bildschirmfreigabe, mit der entfernten Adresse, sofern protokolliert. - Datenschutzentscheidungen: TCC-Dialoge und -Ergebnisse – etwa Festplattenvollzugriff für Terminal – unter dem Subsystem
com.apple.TCC. - Ausführungskontext: Gatekeeper-Bewertungen und deren Übergehen durch
syspolicyd, Aktivität von XProtect und XProtect Remediator, Quarantäne-Attribute, App-Starts über LaunchServices. - Persistenz: das Laden von Launch-Agents und -Daemons, die Registrierung von Anmeldeobjekten durch Background Task Management.
- Geräte: von
diskarbitrationdaktivierte und ausgeworfene Volumes, angeschlossene USB-Geräte.
Der Artikel zu Triage-Abfragen listet für jeden Punkt konkrete Suchen auf.
Was sie nicht beweisen können
- Abwesenheit. Ein fehlender Eintrag kann bedeuten, dass der Speicher rotiert ist, die Stufe nie persistiert wurde (die meisten Info- und Debug-Einträge existieren nur im Arbeitsspeicher), der Wert geschwärzt wurde oder Apple den Wortlaut in dieser Version geändert hat.
- Geschwärzte Werte.
<private>bedeutet, dass der Wert beim Protokollieren verborgen wurde. Kein Parser kann ihn wiederherstellen; der Formatstring zeigt aber weiterhin, um welche Art von Ereignis es sich handelte. - Exakter Wortlaut über Versionen hinweg. Meldungen sind keine API. Eine auf eine macOS-Version abgestimmte Suche kann Ereignisse in einer anderen übersehen; bevorzugen Sie Filter nach Subsystem, Kategorie und Prozess und lesen Sie rund um jeden Treffer.
Ein belastbarer Arbeitsablauf
- Früh sichern, mit
uuidtextundtimesync, und das Gesicherte hashen. - Abdeckung dokumentieren: erster und letzter Eintrag pro Boot-Sitzung sowie jede Lücke, bevor Sie sagen „es ist nichts passiert“.
- Zeitlich eingrenzen um bekannte Ereignisse (ein bösartiger Download, eine Anmeldung), dann erweitern.
- Nach Prozess und Subsystem filtern statt nur nach Meldungstext.
- Rund um jeden Treffer lesen: Die Einträge derselben PID wenige Sekunden davor und danach erklären ihn meist.
- Wichtige Einträge mit
log showbestätigen – auf einem Mac, für alles, was in einen Bericht einfließt – und den verwendeten Parser samt Version notieren.
Im Browser arbeiten
Der Unified Log Parser dekodiert tracev3-Dateien aus einem .logarchive, einem kopierten /private/var/db-Baum oder einer UAC- bzw. Velociraptor-Sammlung und öffnet auch log show-Exporte. Er bietet einen Zeitraum mit Dichtestreifen, Filter nach Typ, Prozess, Subsystem und PID, kuratierte DFIR-Vorgaben sowie Exporte als CSV, NDJSON und für Timesketch. Alles läuft lokal per WebAssembly; die Anleitung nutzt das synthetische Beispiel FIN-MBP-03.
Weiterführende Lektüre: Das Projekt macos-UnifiedLogs von Mandiant und die Notizen zum Apple-Unified-Logging-Format von libyal dokumentieren die Formate im Detail.