Investigando Incidentes em macOS: UnifiedLogs, FSEvents e AULR
Como a Basilisk coleta evidencias em macOS Sonoma e Sequoia usando UnifiedLogs, FSEvents e AULR sem destruir o cenario do incidente.

Neste artigo
Um MacBook Pro M3 chega a bancada, suspeito de rodar um payload assinado com um Developer ID revogado. O cliente quer respostas em 48 horas, o disco esta cifrado com FileVault e o usuario esta de ferias em outro fuso. Antes de ligar qualquer ferramenta, a equipe da Basilisk fecha o escopo legal, recebe a senha do FileVault por um canal verificado e registra um hash SHA-256 da imagem inicial. No macOS moderno voce nao vai longe sem saber que a stack de logging mutou drasticamente desde o Sierra: os classicos arquivos .log deram lugar ao formato binario tracev3, e ignorar isso descarta oitenta por cento da telemetria disponivel. Este guia percorre os tres pilares que um respondente de macOS nao pode pular: UnifiedLogs, FSEvents e Apple Unified Logging com activity tracing.
Por que o logging do macOS mudou e por que importa#
Desde o macOS Sierra, a Apple substituiu o Apple System Log e os logs de texto espalhados por um pipeline unificado, estruturado e binario que escreve chunks comprimidos tracev3. A vantagem para o defensor e enorme: tags de subsistema e categoria, activity IDs que costuram eventos relacionados e uma retencao que pode alcancar dias ou semanas. A desvantagem e que grep sobre texto morreu; agora voce precisa de um parser que entenda o formato e as tabelas de strings uuidtext que reidratam as mensagens legiveis. Um respondente que copia /var/log e da por encerrado nao capturou quase nada. A evidencia real vive em um armazenamento binario que precisa ser coletado e parseado de forma deliberada, e essa e justamente a friccao que este artigo elimina.
UnifiedLogs: coleta e parsing#
Os UnifiedLogs vivem em /var/db/diagnostics e /var/db/uuidtext, pesando entre 500 MB e 4 GB conforme o uso. Para captura ao vivo rodamos log collect --output incident.logarchive, que congela o estado atual em um bundle portatil que voce analisa fora da maquina. Para trabalho dead-box copiamos os diretorios crus e os alimentamos ao macos-UnifiedLogs da Mandiant, um parser em Rust que nao exige mais um host Apple correspondente. Isso costumava ser um grande ponto de friccao: voce tinha que manter um Mac com a versao exata do SO alvo online so para invocar /usr/bin/log. Envie a saida parseada para JSONL para que flua direto no seu pipeline de analise. Para o contexto defensivo mais amplo, combine esta leitura com Hardening de macOS: Lockdown Mode, MDM e Reducao de Superficie.
FSEvents: o que mudou neste volume e quando#
FSEvents e o segundo pilar e responde a pergunta 'o que mudou neste volume e quando'. Os logs ficam em /.fseventsd/ como arquivos numerados comprimidos com gzip; cada registro carrega um event ID monotonico mais flags de create, rename ou delete. Ressalva critica: FSEvents nao registra nem o conteudo nem o usuario que disparou a mudanca, apenas caminho e operacao. Parear FSEvents com UnifiedLogs produz uma linha do tempo confiavel, porque o log te diz qual processo rodou enquanto FSEvents te diz quais arquivos ele tocou. Ferramentas como o FSEventsParser de David Cowen mastigam isso em segundos e emitem CSV pronto para Timesketch, ecoando o fluxo coberto em Timeline Forensics no Windows: Plaso, Log2Timeline e KAPE na Pratica. Use o ID monotonico como chave de ordenacao quando os timestamps de relogio faltam.
AULR e o poder dos predicados#
AULR, mais precisamente Apple Unified Logging com Activity Tracing, sobrepoe processo pai, thread ID e contexto de signpost. Predicados sao sua faca mais afiada: log show --predicate 'subsystem == "com.apple.securityd"' --last 24h traz a tona tentativas XPC suspeitas, enquanto o subsistema com.apple.TCC expoe prompts de microfone e camera que foram negados ou concedidos. Em um caso real de junho deste ano, uma variante do stealer Atomic AMOS deixou impressoes em com.apple.kextd tentando carregar um KEXT em um Mac com SIP ativo, falhando ruidosamente. Sem esse predicado o evento se afoga em milhoes de linhas de ruido. Construa uma pequena biblioteca de predicados para persistencia, TCC, assinatura de codigo e subsistemas de rede para nunca grepar as cegas em uma mangueira.
Captura etica e cadeia de custodia#
No lado da captura etica, a Basilisk segue um runbook fixo: autorizacao escrita do cliente, um write-blocker Thunderbolt para o imaging quando viavel, hashes SHA-256 e SHA-3-512, e logs de cadeia de custodia assinados com chaves de hardware YubiKey. Quando o Mac esta vivo e nao pode ser desligado nos apoiamos no aftriage da CrowdStrike ou na receita Velociraptor macos_artifact_collection, sempre redirecionando a saida para um SSD externo APFS dedicado. Esse rigor espelha o que exploramos em DFIR no Linux: Triagem ao Vivo com UAC e Velociraptor e conecta com a disciplina pessoal de OPSEC para Pesquisadores de Seguranca: Modelo de Ameaca Pessoal. Registre cada comando que rodar com timestamp, porque o relatorio e tao forte quanto sua reprodutibilidade.
Correlacionar o conjunto de artefatos mais amplo#
Os tres pilares sao o esqueleto; a carne e o resto do conjunto de artefatos. Inspecione metadados do Spotlight via mdls em arquivos suspeitos, exporte KnowledgeC.db do CoreDuet para mapear janelas em foco, e percorra /private/var/db/CoreDuet/Knowledge para correlacionar uso do Terminal com atividade fora de horario. Para persistencia, enumere LaunchAgents e LaunchDaemons nos dominios de usuario e sistema, cheque registros BTM (Background Task Management) e faca diff dos perfis de configuracao instalados. Quando comportamento de loader aparece, tende a rimar com tecnicas de Analise de Malware em Lab Isolado: Setup Seguro com FlareVM e Remnux, entao pivote uma amostra para um sandbox em vez de detona-la no host de evidencia.
Construir a linha do tempo#
A analise comeca em paralelo: enquanto o macos-UnifiedLogs faz streaming de JSONL em segundo plano, carregamos o CSV do FSEvents e a saida do log em um notebook Jupyter com pandas e juntamos os PIDs do UnifiedLogs contra os caminhos do FSEvents em uma janela temporal compartilhada. A meta e uma unica super-linha do tempo onde inicio de processo, criacao de arquivo, prompt TCC e conexao de rede se alinham em segundos e contam uma historia coerente. Empurre o frame combinado para o Timesketch para revisao colaborativa e tagging, e use views salvas para isolar a janela de intrusao suspeita. Uma linha do tempo que sobrevive a um contra-interrogatorio e uma em que cada linha cita seu artefato de origem, entao mantenha a coluna de proveniencia preenchida desde o primeiro import em vez de reconstrui-la depois sob pressao de prazo.
Anti-forense e armadilhas comuns#
Atacantes tambem conhecem esses artefatos. Um intruso capaz pode limpar os UnifiedLogs com um helper assinado, adulterar a hora do sistema para embaralhar a ordem, ou operar inteiramente em memoria para evitar o FSEvents. Fique atento a lacunas: uma janela tracev3 suspeitamente limpa, uma sequencia FSEvents com um salto nos event IDs, ou um log que reinicia abruptamente sugerem adulteracao mais que inocencia. A armadilha autoinfligida mais comum e do lado do analista: dar boot na evidencia, deixar o Spotlight reindexar, ou montar em leitura-escrita e com isso escrever novos FSEvents que contaminam justamente a linha do tempo que voce veio ler. Monte sempre em somente leitura e trabalhe a partir de uma imagem, nunca o original.
Uma checklist de respondente#
Condense o engajamento em uma checklist repetivel: confirmar autorizacao escrita e escopo; obter a chave FileVault por um canal verificado; imagem com write-blocker e hash com SHA-256; rodar log collect e copiar /.fseventsd/; parsear com macos-UnifiedLogs e FSEventsParser; extrair KnowledgeC, TCC, LaunchAgents e BTM; construir a super-linha do tempo em pandas e Timesketch; checar lacunas anti-forenses; e assinar a cadeia de custodia em cada passo. Mantenha a checklist na pasta do caso e marque conforme avanca, porque uma chave FileVault perdida ou uma imagem sem hash pode anular todo o engajamento por melhor que seja a analise seguinte.
FAQ: posso analisar UnifiedLogs sem um Mac correspondente?#
Sim. Antes isso exigia um host Apple com a mesma versao do SO para chamar /usr/bin/log, o que era uma restricao real para o trabalho dead-box. O macos-UnifiedLogs da Mandiant e um parser em Rust independente que le os diretorios crus tracev3 e uuidtext em qualquer plataforma, entao voce pode processar uma imagem em uma workstation Linux. Anote mesmo assim a versao do SO alvo, porque os formatos de mensagem as vezes mudam entre releases e conhecer a versao te ajuda a interpretar corretamente entradas ambiguas.
FAQ: por quanto tempo o UnifiedLogs retem dados?#
Depende do volume e da pressao de disco mais do que de uma janela fixa; logging intenso pode comprimir a retencao para uns dois dias enquanto uma maquina tranquila pode guardar semanas. Essa variancia e exatamente por que voce coleta cedo: assim que um incidente e suspeitado, rode log collect e faca um snapshot de /.fseventsd/ antes que a atividade normal rotacione os chunks mais antigos para fora. Retencao nao e garantia, e uma corrida, e o respondente que captura no dia zero tem evidencia que o respondente que espera uma semana simplesmente nao tem.
Takeaway pratico: construa hoje uma logarchive base do seu proprio Mac com log collect e guarde ao lado de um snapshot APFS de /.fseventsd. Da proxima vez que algo parecer estranho voce tera um diff temporal real em vez de palpites. Essa baseline custa cinco minutos e te poupa dias de investigacao reativa quando o incidente de fato bate a porta, transformando um sprint de 48 horas em panico numa comparacao tranquila contra um terreno conhecido e limpo.


