Zum Inhalt springen

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

PfadInhaltHinweise
/private/var/db/diagnostics/Persist/Hauptspeicher der .tracev3-DateienBis etwa 10,5 MB pro Datei (Beobachtung von Mandiant)
/private/var/db/diagnostics/Special/Einträge mit geringerem Volumen und eigener LebensdauerOft älter als Persist
/private/var/db/diagnostics/Signpost/Performance-SignpostsNur mit --signpost sichtbar
/private/var/db/diagnostics/HighVolume/Daten mit hohem Volumen, sofern genutztOft leer
/private/var/db/diagnostics/timesync/Korrelationsdaten für Boot und UhrZur Umrechnung der Zeitstempel nötig
/private/var/db/uuidtext/00 bis FF, dsc/Formatstrings und Image-Pfade, Strings des Shared CacheZur Darstellung der Meldungen nötig
*.logarchivePortables Bundle aus log collect oder sysdiagnoseIn 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:

FeldBedeutung
timestampUhrzeit mit UTC-Offset, Genauigkeit in Mikrosekunden
machTimestampRohe Mach-Zeit des Eintrags
bootUUIDBoot-Sitzung, zu der der Eintrag gehört
processImagePath, processIDProtokollierender Prozess
senderImagePath, senderImageUUIDBinärprogramm oder Bibliothek, das die Meldung erzeugt hat
subsystem, categorySubsystem in Reverse-DNS-Notation und Kategorie, z. B. com.apple.TCC
messageTypeDefault, Info, Debug, Error, Fault
eventTypez. B. logEvent, activityCreateEvent, signpostEvent
eventMessage, formatStringDargestellter Text und die zugrunde liegende Vorlage
userID, threadID, activityIdentifier, traceIDKontext für die Korrelation
timezoneNameMit 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, uuidtext und timesync (files/logs/macos_unified_logs.yaml).
  • mac_apt UNIFIEDLOGEXPORT exportiert diagnostics und uuidtext aus 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 stats auf einem Mac mit gleicher oder neuerer macOS-Version: die Referenzimplementierung.
  • macos-UnifiedLogs (Mandiant, Rust): github.com/mandiant/macos-UnifiedLogs. Das Beispiel unifiedlog_iterator verarbeitet 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 stats oder erste und letzte Zeile), bevor Sie behaupten, in einem Zeitfenster sei „nichts passiert“.
  • Bewahren Sie uuidtext immer zusammen mit den tracev3-Dateien auf. Ohne diesen Ordner stellen plattformübergreifende Tools Meldungen unvollständig dar.
  • Unter macOS 26 protokolliert das Tool log seine eigenen Aufrufe im Subsystem com.apple.log, einschließlich Elternprozess und Argumenten. Suchen Sie dort nach log erase oder breiten log show-Befehlen eines Angreifers.
  • Ein abrupter Beginn der Historie direkt nach einem Boot auf einem ruhigen Mac, mit älteren Daten in Special, aber nicht in Persist, sollte auf ein mögliches Löschen geprüft werden.
  • Validieren Sie die Ausgabe von Drittanbieter-Parsern gegen log show fü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.

Siehe auch