Qué registra FSEvents
macOS mantiene un registro persistente de los cambios en el sistema de archivos, escrito por el daemon fseventsd para que Time Machine, Spotlight y los clientes de sincronización puedan preguntar qué ha cambiado desde un momento dado. Cada volumen tiene una carpeta oculta .fseventsd con archivos de registro comprimidos con gzip. Cada registro es una ruta, un event ID de 64 bits y un conjunto de flags (creado, eliminado, renombrado, modificado, atributo extendido cambiado, montaje, …); los formatos más recientes añaden el node ID del archivo.
En una investigación, esto es un historial del volumen a nivel de ruta, que a menudo incluye archivos que ya no existen: un archivo comprimido que estuvo brevemente en Downloads, un LaunchAgent que se escribió y se eliminó, documentos reunidos en una carpeta oculta o el contenido de una memoria USB.
Qué decodifica el parser
- Archivos de registro gzip, incluidos los truncados o dañados (se conserva todo lo recuperable y se informa del daño), varios miembros gzip por archivo y páginas ya descomprimidas.
- Páginas en los tres formatos en disco: 1SLD (ruta, event ID, flags), 2SLD (+ node ID, macOS 10.13 y posteriores) y 3SLD (+ un campo adicional de 4 bytes, macOS 14 y posteriores), con varias páginas por archivo.
- Cada bit de flag decodificado con un nombre claro, junto con el valor en bruto y los nombres que usan FSEventsParser y mac_apt.
- Marcadores fseventsd-uuid (identidad del flujo e inicio del historial) y no_log, un volumen por carpeta .fseventsd (volumen de datos, raíz del volumen o unidad externa).
- Ventanas temporales para cada archivo de registro a partir de las fechas de modificación, pares de renombrado por node ID, un árbol de rutas y exportaciones a CSV, Timesketch y JSON.
Qué ayuda a responder
- ¿Existió alguna vez este archivo o carpeta en el Mac, y se creó, modificó, renombró o eliminó?
- ¿Se escribió un LaunchAgent o LaunchDaemon, y cuándo (aproximadamente)?
- ¿Se reunieron documentos en una carpeta oculta, se copiaron a un volumen externo y luego se eliminaron?
- ¿Se eliminó probablemente el atributo de cuarentena de una descarga, o se cambió un permiso de privacidad (TCC)?
- ¿Qué se escribió en una unidad USB, según la propia carpeta .fseventsd de la unidad?
Límites a tener en cuenta
- Sin marcas de tiempo: los registros solo tienen un event ID. Las horas son ventanas entre fechas de modificación de archivos de registro, y solo son tan buenas como la recolección las haya conservado.
- Sin usuario ni proceso: FSEvents no dice quién hizo un cambio. FSEventsParser decodifica el campo adicional de 3SLD como un identificador de usuario; Apple no documenta su significado.
- Agrupación: varios cambios en una ruta pueden fusionarse en un solo registro (p. ej. Created + Modified + Removed); su orden dentro del registro es desconocido.
- Retención: fseventsd purga los registros antiguos según su propio calendario; lo habitual son semanas o meses de historial, sin garantía.
- No se registran: volúmenes de solo lectura, recursos compartidos de red y los eventos más recientes que aún estaban en memoria al copiar los registros.
Recolección en un solo comando
- Mac en vivo, Terminal con Acceso total al disco: sudo tar -czf ~/Desktop/fseventsd.tar.gz -C /System/Volumes/Data .fseventsd, y luego suelta el archivo aquí.
- UAC: el perfil ir_triage (o solo el artefacto files/logs/macos.yaml) recolecta todas las carpetas .fseventsd en un tar.gz que esta página lee tal cual.
- Imagen de disco: conéctala en solo lectura y archiva la carpeta .fseventsd del volumen de datos de la misma forma.
Preguntas frecuentes
¿Se suben mis archivos a algún sitio?
No. El parser está escrito en Rust, compilado a WebAssembly, y se ejecuta en un Web Worker dentro de tu navegador. Los archivos nunca salen de tu equipo; la página funciona sin conexión una vez cargada.
¿Por qué no hay marcas de tiempo exactas?
Los registros de FSEvents no las contienen. Un archivo de registro se escribe cuando fseventsd lo vuelca a disco, así que su fecha de modificación es un límite superior para sus registros y la del archivo de registro anterior, un límite inferior aproximado. El parser muestra esa ventana para cada registro e indica cómo se calculó.
¿Qué versiones de macOS se admiten?
Los tres formatos en disco: 1SLD (macOS antiguos), 2SLD (macOS 10.13 High Sierra y posteriores, añade node IDs) y 3SLD (macOS 14 Sonoma y posteriores, añade un campo de 4 bytes). Las carpetas con formatos mezclados también se procesan.
¿Puede leer directamente una colección de UAC?
Sí. Suelta el tar.gz de UAC: la página lo recorre en streaming, conserva solo los archivos de .fseventsd y usa las fechas de modificación guardadas en el archivo. Los ZIP de Aftermath y Velociraptor y las carpetas normales también funcionan.
¿Qué ocurre con un archivo de registro truncado o corrupto?
Se analiza todo lo que se puede descomprimir, se conservan los registros completos y el archivo se marca como Parcial con el motivo (gzip truncado, CRC que no coincide, página que sobrepasa los datos, registro dañado).
¿Cómo se compara con FSEventsParser y mac_apt?
Decodifica las mismas estructuras en disco y los mismos bits de flags (se muestran los nombres de ambos), añade ventanas temporales, emparejamiento de renombrados, un árbol de rutas y hallazgos, y no requiere Python ni instalación. En trabajos con valor judicial, valida los registros importantes con una segunda herramienta.