Investigando Incidentes en macOS: UnifiedLogs, FSEvents y AULR
Como Basilisk recolecta evidencia en macOS Sonoma y Sequoia usando UnifiedLogs, FSEvents y AULR sin destruir la escena del incidente.

Un MacBook Pro M3 llega a la mesa, sospechoso de correr un payload firmado con un Developer ID revocado. El cliente quiere respuestas en 48 horas, el disco esta cifrado con FileVault y el usuario esta de vacaciones en otra zona horaria. Antes de encender cualquier herramienta, el equipo de Basilisk fija el alcance legal, recibe la contrasena de FileVault por un canal verificado y registra un hash SHA-256 de la imagen inicial. En macOS moderno no llegas lejos sin saber que el stack de logging muto drasticamente desde Sierra: los clasicos archivos .log dieron paso al formato binario tracev3, e ignorarlo descarta el ochenta por ciento de la telemetria disponible. Esta guia recorre los tres pilares que un respondedor de macOS no puede saltar: UnifiedLogs, FSEvents y Apple Unified Logging con activity tracing.
Por que cambio el logging de macOS y por que importa
Desde macOS Sierra, Apple reemplazo Apple System Log y los logs de texto dispersos por un pipeline unificado, estructurado y binario que escribe chunks comprimidos tracev3. La ventaja para el defensor es enorme: tags de subsistema y categoria, activity IDs que cosen eventos relacionados y una retencion que puede alcanzar dias o semanas. La desventaja es que grep sobre texto esta muerto; ahora necesitas un parser que entienda el formato y las tablas de strings uuidtext que rehidratan los mensajes legibles. Un respondedor que copia /var/log y da por terminado no capturo casi nada. La evidencia real vive en un almacen binario que debe recolectarse y parsearse de forma deliberada, y esa es justo la friccion que este articulo elimina.
UnifiedLogs: recoleccion y parseo
Los UnifiedLogs viven en /var/db/diagnostics y /var/db/uuidtext, pesando entre 500 MB y 4 GB segun el uso. Para captura en vivo corremos log collect --output incident.logarchive, que congela el estado actual en un bundle portable que analizas fuera de la maquina. Para trabajo dead-box copiamos los directorios crudos y los alimentamos a macos-UnifiedLogs de Mandiant, un parser en Rust que ya no requiere un host Apple coincidente. Antes eso era un punto de friccion mayor: tenias que mantener un Mac con la version exacta del SO objetivo en linea solo para invocar /usr/bin/log. Envia la salida parseada a JSONL para que fluya directo a tu pipeline de analisis. Para el contexto defensivo mas amplio, combina esta lectura con Hardening de macOS: Lockdown Mode, MDM y Reduccion de Superficie.
FSEvents: que cambio en este volumen y cuando
FSEvents es el segundo pilar y responde a 'que cambio en este volumen y cuando'. Los logs estan en /.fseventsd/ como archivos numerados comprimidos con gzip; cada registro lleva un event ID monotonico mas flags de create, rename o delete. Salvedad critica: FSEvents no registra ni el contenido ni el usuario que disparo el cambio, solo ruta y operacion. Emparejar FSEvents con UnifiedLogs produce una linea de tiempo confiable, porque el log te dice que proceso corrio mientras FSEvents te dice que archivos toco. Herramientas como el FSEventsParser de David Cowen lo mastican en segundos y emiten CSV listo para Timesketch, replicando el flujo de Timeline Forensics en Windows: Plaso, Log2Timeline y KAPE en la Practica. Usa el ID monotonico como clave de orden cuando faltan las marcas de tiempo de reloj.
AULR y el poder de los predicados
AULR, mas precisamente Apple Unified Logging con Activity Tracing, superpone proceso padre, thread ID y contexto de signpost. Los predicados son tu cuchillo mas afilado: log show --predicate 'subsystem == "com.apple.securityd"' --last 24h saca a la luz intentos XPC sospechosos, mientras el subsistema com.apple.TCC expone prompts de microfono y camara que fueron denegados o concedidos. En un caso real de junio de este ano, una variante del stealer Atomic AMOS dejo huellas en com.apple.kextd intentando cargar un KEXT en un Mac con SIP activo, fallando ruidosamente. Sin ese predicado el evento se ahoga en millones de lineas de ruido. Construye una pequena biblioteca de predicados para persistencia, TCC, firma de codigo y subsistemas de red para nunca grepear a ciegas en una manguera.
Captura etica y cadena de custodia
En el lado de la captura etica, Basilisk sigue un runbook fijo: autorizacion escrita del cliente, un write-blocker Thunderbolt para el imaging cuando es factible, hashes SHA-256 y SHA-3-512, y logs de cadena de custodia firmados con llaves hardware YubiKey. Cuando el Mac esta vivo y no puede apagarse nos apoyamos en aftriage de CrowdStrike o la receta Velociraptor macos_artifact_collection, siempre redirigiendo la salida a un SSD externo APFS dedicado. Este rigor refleja lo que exploramos en DFIR en Linux: Triaje en Vivo con UAC y Velociraptor y conecta con la disciplina personal de OPSEC para Investigadores de Seguridad: Modelo de Amenaza Personal. Registra cada comando que corras con marca de tiempo, porque el reporte es tan fuerte como su reproducibilidad.
Correlacionar el conjunto de artefactos mas amplio
Los tres pilares son el esqueleto; la carne es el resto del conjunto de artefactos. Inspecciona metadatos de Spotlight via mdls en archivos sospechosos, exporta KnowledgeC.db de CoreDuet para mapear ventanas enfocadas, y recorre /private/var/db/CoreDuet/Knowledge para correlacionar uso de Terminal con actividad fuera de horario. Para persistencia, enumera LaunchAgents y LaunchDaemons en los dominios de usuario y sistema, revisa registros BTM (Background Task Management) y diferencia los perfiles de configuracion instalados. Cuando aparece comportamiento de loader tiende a rimar con tecnicas de Analisis de Malware en Lab Aislado: Setup Seguro con FlareVM y REMnux, asi que pivotea una muestra a un sandbox en vez de detonarla en el host de evidencia.
Construir la linea de tiempo
El analisis arranca en paralelo: mientras macos-UnifiedLogs hace streaming de JSONL en segundo plano, cargamos el CSV de FSEvents y la salida del log en un notebook Jupyter con pandas y unimos los PID de UnifiedLogs contra las rutas de FSEvents en una ventana temporal compartida. La meta es una unica super-linea de tiempo donde inicio de proceso, creacion de archivo, prompt TCC y conexion de red se alinean en segundos y cuentan una historia coherente. Empuja el frame combinado a Timesketch para revision colaborativa y etiquetado, y usa vistas guardadas para aislar la ventana de intrusion sospechada. Una linea de tiempo que sobrevive un contrainterrogatorio es una donde cada fila cita su artefacto fuente, asi que manten la columna de procedencia llena desde la primera importacion en vez de reconstruirla luego bajo presion de plazo.
Anti-forense y errores comunes
Los atacantes tambien conocen estos artefactos. Un intruso capaz puede limpiar UnifiedLogs con un helper firmado, manipular la hora del sistema para desordenar la secuencia, u operar enteramente en memoria para evitar FSEvents. Vigila los huecos: una ventana tracev3 sospechosamente limpia, una secuencia FSEvents con un salto en los event IDs, o un log que reinicia abruptamente sugieren manipulacion mas que inocencia. El error autoinfligido mas comun es del analista: arrancar la evidencia, dejar que Spotlight reindexe, o montar en lectura-escritura y con ello escribir nuevos FSEvents que contaminan la misma linea de tiempo que viniste a leer. Monta siempre en solo lectura y trabaja desde una imagen, nunca el original.
Una checklist de respondedor
Condensa el engagement en una checklist repetible: confirmar autorizacion escrita y alcance; obtener la clave FileVault por un canal verificado; imagen con write-blocker y hash con SHA-256; correr log collect y copiar /.fseventsd/; parsear con macos-UnifiedLogs y FSEventsParser; extraer KnowledgeC, TCC, LaunchAgents y BTM; construir la super-linea de tiempo en pandas y Timesketch; revisar huecos anti-forenses; y firmar la cadena de custodia en cada paso. Manten la checklist en la carpeta del caso y marcala segun avanzas, porque una clave FileVault perdida o una imagen sin hash puede anular todo el engagement por bueno que sea el analisis posterior.
FAQ: puedo analizar UnifiedLogs sin un Mac coincidente?
Si. Antes eso requeria un host Apple con la misma version del SO para llamar a /usr/bin/log, lo que era una restriccion real para el trabajo dead-box. El macos-UnifiedLogs de Mandiant es un parser en Rust independiente que lee los directorios crudos tracev3 y uuidtext en cualquier plataforma, asi que puedes procesar una imagen en una workstation Linux. Anota igual la version del SO objetivo, porque los formatos de mensaje a veces cambian entre releases y conocer la version te ayuda a interpretar correctamente entradas ambiguas.
FAQ: cuanto tiempo retiene datos UnifiedLogs?
Depende del volumen y la presion de disco mas que de una ventana fija; el logging intenso puede comprimir la retencion a un par de dias mientras una maquina tranquila puede guardar semanas. Esa varianza es exactamente por que recolectas temprano: en cuanto se sospecha un incidente, corre log collect y toma un snapshot de /.fseventsd/ antes de que la actividad normal rote los chunks mas viejos. La retencion no es una garantia, es una carrera, y el respondedor que captura en el dia cero tiene evidencia que el que espera una semana simplemente no tiene.
Conclusion practica: construye hoy una logarchive base de tu propio Mac con log collect y guardala junto a un snapshot APFS de /.fseventsd. La proxima vez que algo se sienta raro tendras un diff temporal real en vez de conjeturas. Esa linea base cuesta cinco minutos y te ahorra dias de investigacion reactiva cuando el incidente de verdad toca la puerta, convirtiendo un sprint de 48 horas en panico en una comparacion tranquila contra un terreno conocido y limpio.


