Saltar al contenido

Acceso a archivosAntiforense

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

Qué 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

macOSRutaNotas
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 a fseventsd que 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

CampoSignificado
Page magic 1SLDPágina versión 1: ruta, ID de evento (8 bytes), flags (4 bytes)
Page magic 2SLDPágina versión 2 (desde macOS 10.13 High Sierra): añade node ID (8 bytes)
Page magic 3SLDPá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
RutaRuta terminada en nulo, relativa a la raíz del volumen, tal como era al registrarse
ID de eventoContador de 64 bits por volumen; solo sirve para ordenar
FlagsMáscara de bits con el tipo de cambio y el tipo de objeto
Node IDID 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:

  1. Hora de modificación del archivo de log. Un archivo se escribe cuando fseventsd vuelca 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.
  2. Rutas con fecha. Las rutas con fechas en el nombre (logs rotados, nombres de snapshots, informes de diagnóstico) que aparecen como Created sirven de ancla para los IDs de evento cercanos. FSEventsParser usa esto para rellenar su columna approx_dates_plus_minus_one_day.
  3. 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_triage y full incluyen el artefacto files/logs/macos.yaml, que recopila /.fseventsd y /System/Volumes/*/.fseventsd.
  • mac_apt: el plugin FSEVENTS lee 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 .fseventsd con 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 Renamed por node ID (versión 2 y posteriores) para seguir un archivo a través de renombrados y movimientos.
  • ExtendedAttrRemoved en 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/LaunchAgents y Library/LaunchDaemons en busca de persistencia de corta duración; consulta launch agents y daemons.
  • Un archivo no_log o un fseventsd-uuid reciente 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 .fseventsd de 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