Was FSEvents aufzeichnet
macOS führt ein dauerhaftes Protokoll der Dateisystemänderungen, geschrieben vom Daemon fseventsd, damit Time Machine, Spotlight und Sync-Clients abfragen können, was sich seit einem bestimmten Punkt geändert hat. Jedes Volume erhält einen versteckten .fseventsd-Ordner mit gzip-komprimierten Logdateien. Jeder Datensatz besteht aus einem Pfad, einer 64-Bit-Event-ID und einer Reihe von Flags (erstellt, entfernt, umbenannt, geändert, erweitertes Attribut geändert, Einhängen, …); neuere Formate ergänzen die Node-ID der Datei.
Für eine Untersuchung ist das eine Historie des Volumes auf Pfadebene, oft einschließlich Dateien, die nicht mehr existieren: ein Archiv, das kurz in Downloads lag, ein LaunchAgent, der geschrieben und wieder entfernt wurde, in einem versteckten Ordner gesammelte Dokumente oder der Inhalt eines USB-Sticks.
Was der Parser dekodiert
- gzip-Logdateien, auch abgeschnittene oder beschädigte (alles Wiederherstellbare bleibt erhalten und der Schaden wird gemeldet), mehrere gzip-Member pro Datei sowie bereits dekomprimierte Seiten.
- Seiten in den drei On-Disk-Formaten: 1SLD (Pfad, Event-ID, Flags), 2SLD (+ Node-ID, macOS 10.13 und neuer) und 3SLD (+ ein 4-Byte-Zusatzfeld, macOS 14 und neuer), mehrere Seiten pro Datei.
- Jedes Flag-Bit mit verständlichem Namen, samt Rohwert und den Namen, die FSEventsParser und mac_apt verwenden.
- fseventsd-uuid (Stream-Identität und Beginn der Historie) und no_log-Markierungen, ein Volume pro .fseventsd-Ordner (Data-Volume, Volume-Stammverzeichnis oder externes Laufwerk).
- Zeitfenster für jede Logdatei aus den Änderungszeiten, Umbenennungspaare über die Node-ID, ein Pfadbaum sowie Exporte als CSV, Timesketch und JSON.
Welche Fragen es beantwortet
- Hat diese Datei oder dieser Ordner je auf dem Mac existiert, und wurde sie oder er erstellt, geändert, umbenannt oder entfernt?
- Wurde ein LaunchAgent oder LaunchDaemon geschrieben, und wann (ungefähr)?
- Wurden Dokumente in einem versteckten Ordner gesammelt, auf ein externes Volume kopiert und dann gelöscht?
- Wurde bei einem Download vermutlich das Quarantäne-Attribut entfernt oder eine Datenschutzberechtigung (TCC) geändert?
- Was wurde auf ein USB-Laufwerk geschrieben – anhand des laufwerkseigenen .fseventsd?
Grenzen, die man kennen sollte
- Keine Zeitstempel: Datensätze haben nur eine Event-ID. Zeiten sind Fenster zwischen den Änderungszeiten der Logdateien und nur so gut, wie die Sicherung sie erhalten hat.
- Kein Benutzer, kein Prozess: FSEvents sagt nicht, wer eine Änderung vorgenommen hat. Das 3SLD-Zusatzfeld wird von FSEventsParser als Benutzer-ID dekodiert; seine Bedeutung ist von Apple nicht dokumentiert.
- Zusammenfassung (Coalescing): Mehrere Änderungen an einem Pfad können in einem Datensatz zusammengeführt werden (z. B. Created + Modified + Removed); ihre Reihenfolge innerhalb des Datensatzes ist unbekannt.
- Aufbewahrung: fseventsd löscht alte Logs nach eigenem Zeitplan; typisch sind Wochen bis Monate an Historie, garantiert ist das nicht.
- Nicht protokolliert: schreibgeschützte Volumes, Netzwerkfreigaben und die jüngsten Ereignisse, die beim Kopieren der Logs noch im Speicher lagen.
Mit einem Befehl sichern
- Laufender Mac, Terminal mit Festplattenvollzugriff: sudo tar -czf ~/Desktop/fseventsd.tar.gz -C /System/Volumes/Data .fseventsd, dann das Archiv hier ablegen.
- UAC: Das Profil ir_triage (oder allein das Artefakt files/logs/macos.yaml) sichert jeden .fseventsd-Ordner in ein tar.gz, das diese Seite direkt liest.
- Disk-Image: schreibgeschützt einhängen und dann den .fseventsd-Ordner des Data-Volumes auf dieselbe Weise archivieren.
FAQ
Werden meine Dateien irgendwohin hochgeladen?
Nein. Der Parser ist in Rust geschrieben, nach WebAssembly kompiliert und läuft in einem Web Worker in Ihrem Browser. Die Dateien verlassen Ihren Rechner nie; einmal geladen, funktioniert die Seite auch offline.
Warum gibt es keine exakten Zeitstempel?
FSEvents-Datensätze enthalten keinen. Eine Logdatei wird geschrieben, wenn fseventsd sie auf die Festplatte schreibt; ihre Änderungszeit ist daher eine Obergrenze für ihre Datensätze und die Zeit der vorherigen Logdatei eine grobe Untergrenze. Der Parser zeigt dieses Fenster für jeden Datensatz an und erklärt, wie es hergeleitet wurde.
Welche macOS-Versionen werden unterstützt?
Alle drei On-Disk-Formate: 1SLD (ältere macOS-Versionen), 2SLD (macOS 10.13 High Sierra und neuer, ergänzt Node-IDs) und 3SLD (macOS 14 Sonoma und neuer, ergänzt ein 4-Byte-Feld). Gemischte Ordner werden unterstützt.
Kann es eine UAC-Sicherung direkt lesen?
Ja. Legen Sie das UAC-tar.gz ab: Die Seite liest es als Stream, behält nur die .fseventsd-Dateien und verwendet die im Archiv gespeicherten Änderungszeiten. ZIPs aus Aftermath und Velociraptor sowie einfache Ordner funktionieren ebenfalls.
Was passiert mit einer abgeschnittenen oder beschädigten Logdatei?
Alles, was sich dekomprimieren lässt, wird analysiert, vollständige Datensätze bleiben erhalten, und die Datei wird mit Begründung als „Teilweise“ markiert (abgeschnittenes gzip, CRC-Fehler, Seite reicht über die Daten hinaus, beschädigter Datensatz).
Wie schneidet es im Vergleich zu FSEventsParser und mac_apt ab?
Es dekodiert dieselben On-Disk-Strukturen und Flag-Bits (die Namen beider Tools werden angezeigt), ergänzt Zeitfenster, Umbenennungspaare, einen Pfadbaum und Befunde und benötigt weder Python noch eine Installation. Für gerichtsverwertbare Arbeit sollten wichtige Datensätze mit einem zweiten Tool validiert werden.