FSEvents (.fseventsd): cambios del sistema de archivos
Logs gzip por volumen escritos por fseventsd: rutas creadas, modificadas, renombradas y borradas, a menudo la única huella de un archivo eliminado.
- Ubicación
- /System/Volumes/Data/.fseventsd/
- Prueba
- Qué rutas se crearon, cambiaron, renombraron o borraron en un volumen, en el orden de los eventos
- Marcas de tiempo
- Ninguna por registro; se estiman a partir del mtime del archivo de log y de rutas con fecha
- Acceso
- root; Full Disk Access en un sistema en vivo
- Retención
- Continua, depurada por fseventsd (se han observado meses, varía)
- Adquisición
- UAC, mac_apt, Disk image, ditto
Herramientas
Comparar todas las herramientasQué es
El daemon fseventsd mantiene un diario persistente de los cambios del sistema de archivos para que las aplicaciones (Time Machine, Spotlight, clientes de sincronización) puedan preguntar "qué ha cambiado en esta carpeta desde el evento X". Cada volumen con escritura que controla recibe una carpeta oculta .fseventsd con archivos de log comprimidos en gzip. Cada registro contiene una ruta, un ID de evento de 64 bits y una máscara de flags; los formatos más recientes añaden un node ID.
Para un investigador es un historial del volumen a nivel de ruta: archivos creados y borrados en /private/tmp, un comprimido que existió brevemente en ~/Downloads, un plist de LaunchAgent escrito y eliminado después, o el contenido de una memoria USB. La guía de FSEvents describe el formato en detalle; esta página es la referencia rápida.
Dónde se encuentra
| macOS | Ruta | Notas |
|---|---|---|
| 10.15 Catalina y posteriores | /System/Volumes/Data/.fseventsd/ | El volumen Data contiene la actividad del usuario; las rutas internas son relativas a la raíz del volumen Data |
| 10.14 y anteriores | /.fseventsd/ | Volumen de arranque único |
| Cualquiera, volumen externo o extraíble | /Volumes/<name>/.fseventsd/ | Viaja con la unidad |
Dentro de la carpeta:
- Archivos de log con nombres hexadecimales de 16 dígitos derivados de los IDs de evento, de modo que se ordenan por orden de evento.
fseventsd-uuid: identifica el flujo de eventos de ese volumen. Un UUID nuevo significa que el historial se reinició.no_log(opcional): un archivo vacío que indica afseventsdque no registre el volumen.
Protección: la carpeta pertenece a root. En un sistema en vivo el proceso de adquisición también necesita Full Disk Access. mac_apt comprueba además /private/var/db/fseventsd como ubicación alternativa.
Qué prueba
- Que un archivo o carpeta con un nombre dado existió en una ruta de ese volumen, incluso después de borrarse.
- El tipo de cambio: creación, modificación, renombrado o movimiento, eliminación, cambio de permisos o de propietario, atributo extendido añadido o eliminado (por ejemplo, la supresión de
com.apple.quarantine). - El orden relativo de los cambios en un volumen (los IDs de evento crecen de forma monótona).
- Que un volumen extraíble recibió escrituras desde un Mac, y qué rutas se tocaron en él.
No prueba:
- Una hora exacta. Los registros no llevan marca de tiempo.
- Qué usuario o proceso hizo el cambio.
- El contenido del archivo. Combínalo con snapshots de APFS, Time Machine o carving.
- Actividad en montajes de solo lectura o en recursos compartidos de red, que no se registran.
Campos clave
| Campo | Significado |
|---|---|
Page magic 1SLD | Página versión 1: ruta, ID de evento (8 bytes), flags (4 bytes) |
Page magic 2SLD | Página versión 2 (desde macOS 10.13 High Sierra): añade node ID (8 bytes) |
Page magic 3SLD | Página versión 3 (desde macOS 14 Sonoma): añade otro campo de 4 bytes, que FSEventsParser decodifica como ID de usuario (fs_uid) y mac_apt deja como desconocido |
| Ruta | Ruta terminada en nulo, relativa a la raíz del volumen, tal como era al registrarse |
| ID de evento | Contador de 64 bits por volumen; solo sirve para ordenar |
| Flags | Máscara de bits con el tipo de cambio y el tipo de objeto |
| Node ID | ID del objeto del sistema de archivos (en APFS, el número de inodo); vincula un archivo a través de renombrados |
Nombres de flags habituales que muestran los parsers: Created, Removed, Renamed (mac_apt: RenamedOrMoved), Modified, InodeMetaMod, PermissionChange, ExtendedAttrModified / ExtendedAttrRemoved (mac_apt: XAttrModified / XAttrRemoved), FinderInfoMod, FolderCreated, Exchange, ItemCloned, LastHardLinkRemoved, Mount, Unmount, EndOfTransaction, además de tipos de objeto como FileEvent, FolderEvent, SymbolicLink, HardLink. Los valores de bit en disco difieren de las constantes públicas FSEventStreamEventFlags de la API de Apple, así que confía en un parser que decodifique la estructura en disco.
Marcas de tiempo
Los registros no contienen ninguna. Estima la hora a partir de:
- Hora de modificación del archivo de log. Un archivo se escribe cuando
fseventsdvuelca los datos, así que su mtime es un límite superior para sus registros y el mtime del archivo anterior es un límite inferior aproximado. - Rutas con fecha. Las rutas con fechas en el nombre (logs rotados, nombres de snapshots, informes de diagnóstico) que aparecen como
Createdsirven de ancla para los IDs de evento cercanos. FSEventsParser usa esto para rellenar su columnaapprox_dates_plus_minus_one_day. - Correlación. Una marca de tiempo real de otro artefacto para una ruta (fecha de creación en APFS, un evento de cuarentena, una entrada de los Unified Logs) fecha a sus vecinos.
Informa siempre de las horas de FSEvents como un rango e indica el ancla utilizada.
Retención
No hay un periodo fijo. fseventsd depura por su cuenta los archivos de log más antiguos, y el historial depende de la actividad y del espacio del volumen. CrowdStrike ha informado de eventos de unos cuatro meses de antigüedad en sistemas típicos; los volúmenes con mucha actividad pueden conservar mucho menos. Un fseventsd-uuid cambiado o un formateo del volumen inicia un historial nuevo. Adquiere pronto y conserva los mtime de los archivos.
Adquisición
Copia la carpeta completa conservando las horas de modificación (son tu único reloj):
# Live, as root, from a terminal with Full Disk Access
sudo ditto /System/Volumes/Data/.fseventsd /Volumes/CASE/MBP01/fseventsd
sudo ls -lT /System/Volumes/Data/.fseventsd > /Volumes/CASE/MBP01/fseventsd_listing.txt
- UAC: los perfiles
ir_triageyfullincluyen el artefactofiles/logs/macos.yaml, que recopila/.fseventsdy/System/Volumes/*/.fseventsd. - mac_apt: el plugin
FSEVENTSlee la carpeta directamente de una imagen E01, DMG, raw o montada. - Aftermath: no la recopila por defecto; añade la carpeta con
--collect-dirs. - Soportes extraíbles: haz una imagen de la unidad o copia su
.fseventsdcon el mismo cuidado.
Análisis
FSEventsParser (admite 1SLD, 2SLD y 3SLD) genera una base de datos SQLite más informes TSV:
python3 FSEParser_V4.1.py -s /cases/MBP01/fseventsd -t folder -o /cases/MBP01/out -c MBP01
-- FSEventsParser schema: deleted items under a user's Downloads
SELECT id_hex, fullpath, type, flags, approx_dates_plus_minus_one_day, source, source_modified_time
FROM fsevents_sorted_by_event_id
WHERE fullpath LIKE 'Users/%/Downloads/%' AND flags LIKE '%Removed;%'
ORDER BY id;
mac_apt analiza los mismos datos desde una imagen, con una columna SourceModDate para cada registro:
python3 mac_apt.py -o /cases/MBP01/mac_apt E01 /cases/MBP01.E01 FSEVENTS
FSEvents Parser decodifica en el navegador una carpeta .fseventsd (o una colección de UAC, Aftermath o Velociraptor), con flags decodificados, ventanas de tiempo, pares de renombrado y exportación CSV o Timesketch; no se sube nada.
Consejos para la investigación
- Empareja los registros
Renamedpor node ID (versión 2 y posteriores) para seguir un archivo a través de renombrados y movimientos. ExtendedAttrRemoveden un paquete de aplicación recién descargado puede indicar que se eliminó el atributo de cuarentena. Revisa los eventos de cuarentena.- Vigila las rutas
Library/LaunchAgentsyLibrary/LaunchDaemonsen busca de persistencia de corta duración; consulta launch agents y daemons. - Un archivo
no_logo unfseventsd-uuidreciente puede ser antiforense deliberado, o simplemente un volumen formateado en otro equipo. Revisa los Unified Logs y las marcas de tiempo APFS de esos archivos. - En el volumen Data interno, nuevas rutas
Volumes/<name>indican que se montó un volumen. Combínalo con el.fseventsdde la propia unidad y con las pruebas de dispositivos USB. - Agregación: un registro puede combinar
Created;Modified;Removed. No es posible recuperar el orden exacto dentro de un mismo registro. - La salida analizada supera fácilmente el millón de filas. Filtra primero por ruta (
Users/*/Downloads,private/tmp,Users/Shared,Library/LaunchAgents) y luego amplía. - Elimina duplicados antes de informar: FSEventsParser no lo hace, y los archivos gzip recuperados por carving pueden repetir registros.
Ver también
Artefactos relacionados
Guías detalladas
Glosario
- fseventsd (FSEvents)Inglés
- APFS (Apple File System)Inglés