LogsAusführungBenutzeraktivität
Unified Logs: macOS-Systemprotokoll im tracev3-Format
macOS Unified Logs (tracev3 plus uuidtext) erfassen Anmeldungen, sudo, TCC, Gatekeeper, Installationen und Geräte mit Zeitstempeln unter einer Sekunde.
- Speicherort
- /private/var/db/diagnostics/
- Belegt
- Was Prozesse und Subsysteme wann gemeldet haben: Anmeldungen, Rechteausweitung, Sicherheitsprüfungen, Geräte
- Zeitstempel
- Mach-Zeit, umgerechnet über timesync-Einträge; log show gibt ISO 8601 mit UTC-Offset aus
- Zugriff
- root (die Gruppe admin kann den Speicher lesen); log collect benötigt sudo
- Aufbewahrung
- Größenbasierte Rotation, typischerweise einige Tage bis wenige Wochen
- Sicherung
- log collect, sysdiagnose, mac_apt, UAC, Aftermath
Was es ist
Das Unified Logging System (eingeführt mit macOS 10.12 Sierra) ist das zentrale Protokoll für den Kernel, Apple-Daemons und Code von Drittanbietern, der os_log verwendet. logd schreibt komprimierte binäre .tracev3-Dateien. Die lesbaren Formatstrings stehen nicht in jedem Eintrag, sondern in separaten uuidtext- und Shared-Cache-Dateien (dsc), die über die UUID des protokollierenden Binärprogramms zugeordnet werden.
Für die forensische Analyse ist es die reichhaltigste zeitlich geordnete Aufzeichnung auf einem Mac: Authentifizierung, sudo, TCC-Entscheidungen, Aktivität von Gatekeeper und XProtect, Installationen, Einhängen von Datenträgern und Netzwerkänderungen landen hier. Ebenso wichtig sind die Grenzen: quotenbasierte Rotation, Level, die nie dauerhaft gespeichert werden, und die Schwärzung als <private>.
Wo es liegt
| Pfad | Inhalt | Hinweise |
|---|---|---|
/private/var/db/diagnostics/Persist/ | Hauptspeicher der .tracev3-Dateien | Bis etwa 10,5 MB pro Datei (Beobachtung von Mandiant) |
/private/var/db/diagnostics/Special/ | Einträge mit geringerem Volumen und eigener Lebensdauer | Oft älter als Persist |
/private/var/db/diagnostics/Signpost/ | Performance-Signposts | Nur mit --signpost sichtbar |
/private/var/db/diagnostics/HighVolume/ | Daten mit hohem Volumen, sofern genutzt | Oft leer |
/private/var/db/diagnostics/timesync/ | Korrelationsdaten für Boot und Uhr | Zur Umrechnung der Zeitstempel nötig |
/private/var/db/uuidtext/00 bis FF, dsc/ | Formatstrings und Image-Pfade, Strings des Shared Cache | Zur Darstellung der Meldungen nötig |
*.logarchive | Portables Bundle aus log collect oder sysdiagnose | In sich geschlossen |
Das Verzeichnis diagnostics gehört auf aktuellen Versionen root:admin mit Modus 750. Sichern Sie als root und geben Sie dem Terminal Full Disk Access, wenn derselbe Lauf auch TCC-geschützte Benutzerdaten kopiert. Einträge, die nur im Speicher existieren (die meisten info- und debug-Meldungen), gehen beim Herunterfahren verloren.
Was es belegt
- Welcher Prozess (
processImagePath) und welche Bibliothek (senderImagePath) eine Meldung erzeugt hat, mit PID, Thread und Benutzer-ID. - Abfolgen von Sicherheitsereignissen: Nutzung von
sudo, SSH- und lokale Anmeldungen, TCC-Abfragen und deren Ergebnis, Gatekeeper-Prüfungen, Scans von XProtect Remediator, Installation von Konfigurationsprofilen. - Geräte- und Volume-Aktivität (USB-Massenspeicher, Einhängen über DiskArbitration), Netzwerk- und WLAN-Änderungen.
- Boot-Sitzungen (
bootUUID) und das Zeitfenster, das der Speicher tatsächlich abdeckt.
Es belegt keine Abwesenheit. Ein fehlender Eintrag kann bedeuten, dass das Level nicht gespeichert wurde, der Wert geschwärzt wurde, sich der Meldungstext zwischen Versionen geändert hat oder die Datei herausrotiert ist.
Wichtige Felder
Feldnamen, wie sie log show --style json oder ndjson ausgibt:
| Feld | Bedeutung |
|---|---|
timestamp | Uhrzeit mit UTC-Offset, Genauigkeit in Mikrosekunden |
machTimestamp | Rohe Mach-Zeit des Eintrags |
bootUUID | Boot-Sitzung, zu der der Eintrag gehört |
processImagePath, processID | Protokollierender Prozess |
senderImagePath, senderImageUUID | Binärprogramm oder Bibliothek, das die Meldung erzeugt hat |
subsystem, category | Subsystem in Reverse-DNS-Notation und Kategorie, z. B. com.apple.TCC |
messageType | Default, Info, Debug, Error, Fault |
eventType | z. B. logEvent, activityCreateEvent, signpostEvent |
eventMessage, formatString | Dargestellter Text und die zugrunde liegende Vorlage |
userID, threadID, activityIdentifier, traceID | Kontext für die Korrelation |
timezoneName | Mit dem Eintrag gespeicherte Zeitzone |
formatString hilft, wenn Werte <private> sind: Die Vorlage zeigt weiterhin, welche Art von Ereignis stattfand.
Zeitstempel
Einträge speichern Mach-Zeitwerte, keine Epoche. Die timesync-Einträge ordnen der Mach-Zeit jedes Boots die Uhrzeit zu. Auf Apple silicon ist der Rohwert in Timebase-Ticks statt Nanosekunden angegeben, weshalb Parser von Drittanbietern den Ordner timesync benötigen. Das Ergebnis ist ein Zeitpunkt in UTC.
Auf aktuellem macOS beachtet log show die Umgebungsvariable TZ nicht. Ohne --timezone wird jeder Eintrag in der Zeitzone ausgegeben, die beim Schreiben gespeichert wurde. Erzwingen Sie für Zeitleisten UTC:
log show --archive case.logarchive --timezone UTC --style ndjson \
--start "2026-09-20 00:00:00" --end "2026-09-21 00:00:00" > day.ndjson
--start und --end akzeptieren YYYY-MM-DD, YYYY-MM-DD HH:MM:SS oder einen Wert mit explizitem Offset (HH:MM:SSZZZZZ).
Aufbewahrung
Rotiert wird nach Größe, nicht nach Alter: logd löscht die ältesten .tracev3-Dateien, um den Speicher im Budget zu halten. Ein stark genutzter Mac hält daher vielleicht nur Tage, ein ruhiger Wochen. Mandiant beobachtete etwa 52 Persist-Dateien zu je etwa 10,5 MB (insgesamt rund 550 MB). Special-Einträge haben eine Lebensdauer (TTL) und können Persist überdauern. sudo log erase löscht den Hauptspeicher und Daten in Bearbeitung, --all entfernt zusätzlich TTL-, Fault- und Error-Inhalte.
Sicherung
# Live: whole store (preferred), or a time slice
sudo log collect --output /Volumes/EVIDENCE/host.logarchive
sudo log collect --output /Volumes/EVIDENCE/last3d.logarchive --last 3d
# Offline store (recovery, mounted image): build an archive from a copied tree
sudo log collect --directory /Volumes/Image/private/var/db/diagnostics \
--output ./case.logarchive
--directory benötigt einen Ordner uuidtext neben dem Ordner diagnostics, wie auf einem echten Volume.
- sysdiagnose enthält ein
.logarchive. - UAC kopiert
*.tracev3,uuidtextundtimesync(files/logs/macos_unified_logs.yaml). - mac_apt
UNIFIEDLOGEXPORTexportiertdiagnosticsunduuidtextaus einem Image zur Auswertung mit macos-UnifiedLogs. - Aftermath kopiert den Speicher nicht, sondern führt eine Reihe von
log show-Prädikaten aus (sudo-Fehlschläge, Anmeldungen, TCC, SSH, Bildschirmfreigabe, XProtect Remediator, manuelle Profilinstallationen) und akzeptiert eigene über--logs.
Hashen Sie den Inhalt des Archivs: Ein .logarchive ist ein Verzeichnis.
Auswertung
log show/log statsauf einem Mac mit gleicher oder neuerer macOS-Version: die Referenzimplementierung.- macos-UnifiedLogs (Mandiant, Rust): github.com/mandiant/macos-UnifiedLogs. Das Beispiel
unifiedlog_iteratorverarbeitet Live-Systeme, Log-Archive und einzelne Dateien:
unifiedlog_iterator --mode log-archive --input case.logarchive \
--output case.jsonl --format jsonl
- Plaso-Parser
unified_logging(nicht im Standard-Preset für macOS, explizit angeben):log2timeline.py --parsers unified_logging --storage-file ul.plaso ./case.logarchive.
Prädikate für den Einstieg (an die Zielversion anpassen):
log show --archive case.logarchive --timezone UTC --style syslog --predicate '
(process == "sudo" AND eventMessage CONTAINS "COMMAND=")
OR process == "sshd"
OR subsystem == "com.apple.TCC"
OR process == "syspolicyd"
OR subsystem == "com.apple.DiskArbitration.diskarbitrationd"'
Unified Log Parser öffnet ein .logarchive, die Ordner diagnostics und uuidtext oder einen log show-Export im Browser, wendet DFIR-Triage-Regeln an und exportiert als CSV oder für Timesketch; es wird nichts hochgeladen.
Tipps für die Untersuchung
- Notieren Sie den frühesten und spätesten Zeitstempel pro Boot (
log statsoder erste und letzte Zeile), bevor Sie behaupten, in einem Zeitfenster sei „nichts passiert“. - Bewahren Sie
uuidtextimmer zusammen mit den tracev3-Dateien auf. Ohne diesen Ordner stellen plattformübergreifende Tools Meldungen unvollständig dar. - Unter macOS 26 protokolliert das Tool
logseine eigenen Aufrufe im Subsystemcom.apple.log, einschließlich Elternprozess und Argumenten. Suchen Sie dort nachlog eraseoder breitenlog show-Befehlen eines Angreifers. - Ein abrupter Beginn der Historie direkt nach einem Boot auf einem ruhigen Mac, mit älteren Daten in
Special, aber nicht inPersist, sollte auf ein mögliches Löschen geprüft werden. - Validieren Sie die Ausgabe von Drittanbieter-Parsern gegen
log showfür alles, wozu Sie aussagen werden, und notieren Sie die Parser-Version. - Von hier geht es weiter zu den spezifischen Seiten: sudo-Logs, USB-Geräte, Gatekeeper und XProtect, TCC.db. Der Unified-Logs-Leitfaden enthält weitere Prädikate.