Lo esencial de macOS y Linux · Lección 2 de 5
Actividad en macOS: registros unificados, FSEvents, KnowledgeC y Biome
11 min de lectura
En un Mac, la respuesta a «¿qué hizo este usuario y cuándo?» se encuentra repartida entre un registro binario del sistema, un diario de cambios del sistema de archivos, bases de datos de uso y varios archivos SQLite pequeños. Cada fuente refleja una faceta distinta de la actividad y registra el tiempo de forma diferente, y una de ellas no conserva ninguna marca de tiempo. Esta lección muestra dónde se encuentra cada fuente, cómo recopilarla y consultarla, qué formato de tiempo utiliza y cómo corroborar una fuente con otra. La lección 6.1 trató la estructura de macOS y los archivos plist, y la lección 3.1 abordó el tiempo absoluto de Mac, que utiliza la mayoría de las fuentes presentadas aquí. Los detalles que siguen cambian entre versiones de macOS, por lo que siempre se debe confirmar el comportamiento en un sistema de referencia de la misma versión.
Registro unificado
Desde macOS 10.12, casi todos los registros del sistema y de las aplicaciones se envían al sistema de registro unificado. Los mensajes se almacenan en archivos binarios tracev3 en /private/var/db/diagnostics, dentro de los subdirectorios Persist (la mayoría de los mensajes conservados), Special (mensajes seleccionados que se conservan durante más tiempo), Signpost (marcadores de rendimiento) y HighVolume (a menudo vacío). Un archivo tracev3 almacena principalmente los argumentos de cada mensaje. Las cadenas de formato se encuentran en /private/var/db/uuidtext, en archivos cuyo nombre corresponde al UUID del binario que generó el registro, y el subdirectorio timesync de diagnostics contiene los registros necesarios para convertir el reloj almacenado, relativo al arranque, en la hora real. Sin los archivos uuidtext y timesync, los mensajes no pueden reconstruirse ni fecharse por completo, así que recopile los tres componentes. Como el espacio está limitado, la retención varía entre días y unas pocas semanas, según la actividad del sistema.
En un Mac en funcionamiento, sudo log collect --output case.logarchive recopila todo en un único paquete .logarchive; --last 3d o --start "2026-03-14 00:00:00" limita el intervalo. Para el análisis se utiliza log show --archive case.logarchive --predicate '…' --style json. Un predicado es un filtro sobre campos como process, subsystem, category y eventMessage, por ejemplo, process == "loginwindow", subsystem == "com.apple.xprotect" o eventMessage CONTAINS "USBMSC". Sin --info y --debug, esos dos niveles inferiores no se muestran. log show presenta las horas en la zona horaria del equipo de análisis con un desplazamiento numérico, como 2026-03-14 06:25:41.208114-0300; conviértalas a UTC antes de incluirlas en un informe.
En los registros de producción, las cadenas dinámicas que el desarrollador no haya marcado como públicas aparecen como <private>. Se trata de una decisión de registro tomada cuando se escribió el evento, no de una acción antiforense, y el valor oculto no puede recuperarse posteriormente del registro.
Puntos de partida útiles (la redacción de los mensajes cambia entre versiones, por lo que conviene probar primero los predicados):
| Actividad | Predicado de partida |
|---|---|
| Inicio de sesión, bloqueo y desbloqueo | process == "loginwindow" |
| Uso de sudo | process == "sudo" (usuario, TTY, directorio de trabajo, comando) |
| Almacenamiento USB y montajes | eventMessage CONTAINS "USBMSC"; process == "diskarbitrationd" |
| Uso compartido de pantalla | process == "screensharingd" (resultado de autenticación, dirección del visor) |
| Gatekeeper | process == "syspolicyd" |
| XProtect | subsystem == "com.apple.xprotect" o el nombre del proceso de XProtect para esa versión |
En un equipo de análisis con Windows o Linux, los analizadores de código abierto, como la biblioteca macos-UnifiedLogs de Mandiant y sus herramientas de ejemplo de línea de comandos, leen un logarchive o un conjunto copiado de diagnostics y uuidtext, y exportan a CSV o JSON. Las herramientas exclusivas de Mac, como log, no son necesarias para el trabajo sin conexión.
Los antiguos registros de texto de /private/var/log siguen existiendo. Actualmente, system.log contiene poca información, pero install.log registra instalaciones y actualizaciones de software, con horas locales que incluyen un desplazamiento respecto de UTC.
FSEvents
El demonio fseventsd registra los cambios del sistema de archivos en .fseventsd, en la raíz de cada volumen con permiso de escritura, incluidas las unidades externas. En macOS 10.15 y versiones posteriores, el directorio relevante para los archivos del usuario está en el volumen Data (montado en /System/Volumes/Data en un sistema en funcionamiento). Encontrar .fseventsd en el volumen FAT32, exFAT o APFS de una unidad USB indica que se montó con permiso de escritura en un Mac.
Cada archivo de .fseventsd está comprimido con gzip y contiene páginas que comienzan con una firma: 1SLD en sistemas antiguos, 2SLD a partir de macOS 10.13 (que añade un ID de nodo a cada registro) y una variante posterior, 3SLD. Cada registro contiene una ruta completa, un ID de evento de 8 bytes que solo aumenta y un campo de indicadores de 4 bytes con bits como Created, Removed, Renamed, Modified, InodeMetaMod, FolderCreated y Mount.
FSEvents no tiene una marca de tiempo por registro. Los ID de evento indican el orden, no la hora. La estimación habitual se basa en la hora de modificación del propio archivo gzip: todos los registros de ese archivo se escribieron antes de esa hora y, por lo general, después de la hora de modificación del archivo anterior. Acote el intervalo buscando en el mismo archivo una ruta cuya hora conozca por otra fuente. FSEvents es valioso porque conserva los nombres de archivos eliminados, incluidos los archivos de medios externos, y los cambios de nombre que revelan un nombre anterior. Un archivo llamado no_log en .fseventsd detiene el registro para ese volumen. Entre los analizadores se encuentran FSEventsParser y el módulo FSEvents de mac_apt.
KnowledgeC
La base de datos knowledgeC es un archivo SQLite mantenido por el framework CoreDuet. Existen dos copias: una por usuario en ~/Library/Application Support/Knowledge/knowledgeC.db y otra para todo el sistema en /private/var/db/CoreDuet/Knowledge/knowledgeC.db. Copie los archivos -wal y -shm junto con cada una, porque las filas recientes suelen permanecer en el registro de escritura anticipada.
Los eventos se encuentran en la tabla ZOBJECT. ZSTREAMNAME identifica el flujo, por ejemplo, /app/inFocus (una aplicación en primer plano), /app/usage, /device/isLocked o /safari/history; los flujos disponibles varían según la versión. ZVALUESTRING contiene el valor, como el ID de paquete de una aplicación. ZSTARTDATE, ZENDDATE y ZCREATIONDATE están en tiempo absoluto de Mac en UTC, y ZSECONDSFROMGMT registra el desplazamiento del dispositivo respecto de UTC en ese momento, por ejemplo, -10.800 para UTC−3.
En las versiones recientes de macOS, muchos flujos, entre ellos el de aplicaciones en primer plano, se escriben en Biome en su lugar. En macOS 13 y versiones posteriores, es de esperar que knowledgeC contenga pocos datos o carezca de flujos que los sistemas anteriores registraban. Que /app/inFocus esté vacío allí no constituye evidencia de eliminación.
Biome
Biome almacena los flujos en carpetas individuales bajo ~/Library/Biome y, para los flujos del sistema, en /private/var/db/biome; la actividad de aplicaciones en primer plano se encuentra en un flujo llamado App.InFocus. Los archivos utilizan el formato SEGB de Apple: la firma ASCII SEGB en una cabecera (existen dos versiones de cabecera), seguida de registros cuyos datos suelen ser mensajes protobuf, con las horas de los registros en tiempo absoluto de Mac. La compatibilidad de las herramientas es incipiente y cambia rápidamente. Existen analizadores SEGB de código abierto y módulos de Biome en herramientas de la comunidad, pero pruebe cualquier herramienta con un archivo conocido antes de confiar en sus resultados.
Descargas, navegación y otras actividades del usuario
- Base de datos de cuarentena:
~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2(SQLite, sin extensión). La tablaLSQuarantineEventcontiene un UUID (LSQuarantineEventIdentifier),LSQuarantineTimeStamp(tiempo absoluto de Mac), el agente (LSQuarantineAgentName,LSQuarantineAgentBundleIdentifier),LSQuarantineDataURLString(la URL del archivo) yLSQuarantineOriginURLString(la página de referencia). El archivo descargado lleva un atributo extendidocom.apple.quarantine, por ejemplo,0083;69b52883;Safari;<UUID>: indicadores, la hora de descarga en segundos Unix en hexadecimal, el agente y el mismo UUID. Las filas permanecen después de eliminar el archivo. - Safari:
~/Library/Safari/History.db, dondehistory_itemscontiene las URL yhistory_visitscontiene cada visita convisit_timeen tiempo absoluto de Mac. El módulo 4 trata los navegadores. - Elementos recientes:
~/Library/Application Support/com.apple.sharedfilelist/contiene archivos.sfl2(.sfl3en versiones más recientes) para documentos, aplicaciones y servidores recientes, además de listas de documentos recientes por aplicación. Son archivos plist serializados que contienen datos de marcadores (ruta, volumen); el orden de la lista indica qué elementos son más recientes, pero estos generalmente no llevan marcas de tiempo individuales. OS X 10.11 y 10.12 utilizaban archivos.sflen la misma carpeta; los sistemas anteriores a 10.11 utilizabancom.apple.recentitems.plisten~/Library/Preferences. - TCC.db: la base de datos de permisos de privacidad, por usuario en
~/Library/Application Support/com.apple.TCC/TCC.dby para todo el sistema en/Library/Application Support/com.apple.TCC/TCC.db. La tablaaccessenumera unservice(comokTCCServiceScreenCapture,kTCCServiceAccessibilityokTCCServiceSystemPolicyAllFilespara el acceso total al disco), la aplicaciónclient,auth_value(2 significa permitido en macOS 11 y versiones posteriores) ylast_modifieden segundos Unix. Aquí destaca una herramienta de control remoto a la que se hayan concedido permisos de grabación de pantalla y accesibilidad. - Spotlight:
.Spotlight-V100en cada volumen indexado contiene el índice de metadatos, incluidos atributos comokMDItemLastUsedDateykMDItemWhereFroms; los analizadores, como el complemento Spotlight del módulomac_apt, pueden leerlo.
Qué fuente responde a cada pregunta
| Pregunta | Fuente | Ruta | Formato de tiempo |
|---|---|---|---|
| ¿Cuándo inició sesión o desbloqueó el equipo el usuario? | Registros unificados | /private/var/db/diagnostics + uuidtext | Se presenta con desplazamiento; convertir a UTC |
| ¿Qué archivos se crearon, cambiaron de nombre o eliminaron? | FSEvents | .fseventsd en cada volumen | Ninguno; estimar a partir de la hora de modificación del archivo gzip |
| ¿Qué aplicación estuvo en primer plano y durante cuánto tiempo? | knowledgeC / Biome | knowledgeC.db; ~/Library/Biome | Tiempo absoluto de Mac |
| ¿Qué se descargó y desde dónde? | Base de datos de cuarentena | ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 | Tiempo absoluto de Mac (xattr: Unix en hexadecimal) |
| ¿Qué páginas se visitaron? | Safari | ~/Library/Safari/History.db | Tiempo absoluto de Mac |
| ¿Qué aplicación obtuvo acceso a la pantalla o al disco? | TCC | .../com.apple.TCC/TCC.db | Segundos Unix |
Ejemplo resuelto: una descarga, una ejecución y una entrada de registro
Se examina un Mac configurado en UTC−3. La base de datos de cuarentena contiene una fila de interés:
| Campo | Valor |
|---|---|
LSQuarantineTimeStamp | 795.172.867,0 |
LSQuarantineAgentName | Safari |
LSQuarantineOriginURLString | https://www.example.net/support |
LSQuarantineDataURLString | https://downloads.example.net/files/RemoteHelper.dmg |
De tiempo absoluto de Mac a Unix: 795.172.867 + 978.307.200 = 1.773.480.067, que corresponde a 2026-03-14T09:21:07Z. En hexadecimal, 1.773.480.067 es 69b52883, el valor esperado en el segundo campo del atributo com.apple.quarantine del archivo.
La base de datos knowledgeC del usuario tiene una fila de /app/inFocus con ZVALUESTRING = net.example.RemoteHelper, ZSTARTDATE = 795.173.145,0, ZENDDATE = 795.173.412,0 y ZSECONDSFROMGMT = -10.800.
- Inicio: 795.173.145 + 978.307.200 = 1.773.480.345 = 2026-03-14T09:25:45Z.
- Fin: 795.173.412 + 978.307.200 = 1.773.480.612 = 2026-03-14T09:30:12Z.
- Duración: 795.173.412 − 795.173.145 = 267 s (4 min 27 s).
- -10.800 s equivalen a −3 h, por lo que la hora local de inicio fue 06:25:45. No aplique el desplazamiento al valor almacenado;
ZSTARTDATEya está en UTC.
En el registro unificado, log show --archive case.logarchive --predicate 'process == "syspolicyd" AND eventMessage CONTAINS "RemoteHelper"' devuelve una evaluación de Gatekeeper de /Applications/RemoteHelper.app a las 2026-03-14 06:25:41.208114-0300. Al sumar 3 horas se obtiene 09:25:41Z, cuatro segundos antes de que la aplicación pasara a primer plano, lo que concuerda con una primera ejecución comprobada por Gatekeeper. Tres fuentes independientes proporcionan ahora una secuencia: descarga a las 09:21:07Z, comprobación de Gatekeeper a las 09:25:41Z y aplicación en primer plano desde las 09:25:45Z hasta las 09:30:12Z. FSEvents puede añadir la creación de RemoteHelper.app en /Applications, pero solo como un evento ordenado sin hora propia.
Enfoque del examen: Espere preguntas sobre dónde se encuentra cada fuente, qué formato de tiempo utiliza (tiempo absoluto de Mac para knowledgeC, Biome, cuarentena y Safari; segundos Unix en TCC y en hexadecimal en el atributo de cuarentena; ninguna marca de tiempo en FSEvents) y sobre cómo convertir un valor de tiempo absoluto de Mac a UTC en formato ISO 8601. Sepa por qué los archivos uuidtext y timesync deben recopilarse junto con los archivos tracev3, qué significa <private> y por qué knowledgeC puede contener pocos datos en versiones recientes de macOS.
Puntos clave
- Registros unificados: los archivos tracev3 de
/private/var/db/diagnosticsnecesitanuuidtexty datos de timesync; recopílelos conlog collect, fíltrelos conlog show --predicatey convierta a UTC la hora presentada con su desplazamiento. - FSEvents registra rutas, indicadores e ID de evento por volumen, incluidos los nombres de archivos eliminados en unidades externas, pero no una hora por registro.
- knowledgeC almacena flujos de uso como
/app/inFocusen tiempo absoluto de Mac conZSECONDSFROMGMT; las versiones recientes de macOS trasladan gran parte de esos datos a archivos SEGB de Biome. - La base de datos de cuarentena vincula la URL, el agente y la hora de una descarga con el atributo
com.apple.quarantinedel archivo. - TCC.db muestra qué aplicaciones recibieron permisos de privacidad, con las horas en segundos Unix.
- Corrobore: la descarga, la entrada de registro y el registro de uso deben formar una secuencia coherente.