Essencial de macOS e Linux · Aula 2 de 5
Atividade no macOS: Unified Logs, FSEvents, KnowledgeC e Biome
11 min de leitura
Em um Mac, a resposta à pergunta "o que este usuário fez e quando?" está distribuída entre um log binário do sistema, um diário de alterações do sistema de arquivos, bancos de dados de uso e alguns pequenos arquivos SQLite. Cada fonte registra uma parte diferente da atividade e trata o tempo de forma diferente, e uma delas não mantém nenhum carimbo de data/hora. Esta aula mostra onde cada fonte fica, como coletá-la e consultá-la, qual formato de tempo ela usa e como corroborar uma fonte com outra. A aula 6.1 abordou a estrutura do macOS e os plists, e a aula 3.1 abordou o Mac Absolute Time, usado pela maioria das fontes apresentadas aqui. Os detalhes abaixo mudam entre as versões do macOS, portanto, sempre confirme o comportamento em um sistema de referência da mesma versão.
Unified Logging
Desde o macOS 10.12, quase todo o registro de logs do sistema e dos aplicativos é direcionado ao sistema Unified Logging. As mensagens são armazenadas em arquivos binários tracev3 em /private/var/db/diagnostics, nos subdiretórios Persist (a maioria das mensagens retidas), Special (mensagens selecionadas mantidas por mais tempo), Signpost (marcadores de desempenho) e HighVolume (frequentemente vazio). Um arquivo tracev3 armazena principalmente os argumentos de cada mensagem. As strings de formatação ficam em /private/var/db/uuidtext, em arquivos nomeados de acordo com o UUID do binário que fez o registro, e o subdiretório timesync de diagnostics contém os registros necessários para converter o relógio armazenado, relativo à inicialização, em horário de calendário. Sem os arquivos uuidtext e timesync, as mensagens não podem ser completamente renderizadas nem datadas, portanto, colete os três. Como o espaço é limitado, a retenção varia de dias a algumas semanas, dependendo da intensidade de uso do sistema.
Em um Mac em execução, sudo log collect --output case.logarchive reúne tudo em um único pacote .logarchive; --last 3d ou --start "2026-03-14 00:00:00" limita o intervalo. A análise usa log show --archive case.logarchive --predicate '…' --style json. Um predicado é um filtro sobre campos como process, subsystem, category e eventMessage, por exemplo, process == "loginwindow" ou subsystem == "com.apple.xprotect" ou eventMessage CONTAINS "USBMSC". Sem --info e --debug, esses dois níveis inferiores não são exibidos. O log show exibe os horários no fuso horário da máquina de análise com um deslocamento numérico, como 2026-03-14 06:25:41.208114-0300; converta para UTC antes de relatar.
Nos logs de produção, as strings dinâmicas que um desenvolvedor não marcou como públicas aparecem como <private>. Isso é uma decisão de registro tomada quando o evento foi gravado, não uma ação antiforense, e o valor oculto não pode ser recuperado do log posteriormente.
Pontos de partida úteis (o texto das mensagens muda entre versões, portanto, teste os predicados primeiro):
| Atividade | Ponto de partida do predicado |
|---|---|
| Login, bloqueio e desbloqueio | process == "loginwindow" |
| Uso de sudo | process == "sudo" (usuário, TTY, diretório de trabalho, comando) |
| Armazenamento USB e montagens | eventMessage CONTAINS "USBMSC"; process == "diskarbitrationd" |
| Compartilhamento de tela | process == "screensharingd" (resultado da autenticação, endereço do visualizador) |
| Gatekeeper | process == "syspolicyd" |
| XProtect | subsystem == "com.apple.xprotect" ou o nome do processo XProtect dessa versão |
Em uma máquina de análise Windows ou Linux, parsers de código aberto, como a biblioteca macos-UnifiedLogs da Mandiant e suas ferramentas de linha de comando de exemplo, leem um logarchive, ou um conjunto copiado de diagnostics e uuidtext, e exportam CSV ou JSON. Ferramentas exclusivas do Mac, como log, não são necessárias para o trabalho offline.
Os logs de texto mais antigos em /private/var/log ainda existem. O system.log agora contém pouca informação, mas o install.log registra instalações e atualizações de software, com horários locais que incluem um deslocamento UTC.
FSEvents
O daemon fseventsd registra alterações do sistema de arquivos em .fseventsd na raiz de cada volume gravável, incluindo unidades externas. No macOS 10.15 e posteriores, o diretório relevante para os arquivos do usuário fica no volume Data (montado em /System/Volumes/Data em um sistema em execução). Encontrar .fseventsd no volume FAT32, exFAT ou APFS de uma unidade USB mostra que ela foi montada com permissão de gravação em um Mac.
Cada arquivo em .fseventsd é compactado com gzip e contém páginas que começam com uma assinatura: 1SLD em sistemas mais antigos, 2SLD a partir do macOS 10.13 (que adiciona um ID de nó a cada registro) e uma variante posterior, 3SLD. Cada registro contém um caminho completo, um ID de evento de 8 bytes que só aumenta e um campo de flags de 4 bytes com bits como Created, Removed, Renamed, Modified, InodeMetaMod, FolderCreated e Mount.
O FSEvents não tem carimbo de data/hora por registro. Os IDs de evento fornecem ordem, não horário. A estimativa usual é o horário de modificação do próprio arquivo gzip: todos os registros desse arquivo foram gravados antes dele e, geralmente, depois do horário de modificação do arquivo anterior. Restrinja o intervalo encontrando, no mesmo arquivo, um caminho cujo horário você conheça de outra fonte. O FSEvents é valioso porque mantém os nomes de arquivos excluídos, incluindo arquivos em mídias externas, e renomeações que revelam um nome anterior. Um arquivo chamado no_log em .fseventsd interrompe o registro nesse volume. Os parsers incluem o FSEventsParser e o módulo FSEvents do mac_apt.
KnowledgeC
O banco de dados knowledgeC é um arquivo SQLite mantido pelo framework CoreDuet. Há duas cópias: uma por usuário em ~/Library/Application Support/Knowledge/knowledgeC.db e uma de todo o sistema em /private/var/db/CoreDuet/Knowledge/knowledgeC.db. Copie os arquivos -wal e -shm junto com cada uma, pois as linhas recentes frequentemente ainda estão no log de gravação antecipada.
Os eventos ficam na tabela ZOBJECT. O campo ZSTREAMNAME identifica o fluxo, por exemplo, /app/inFocus (um aplicativo em primeiro plano), /app/usage, /device/isLocked ou /safari/history; os fluxos existentes variam conforme a versão. O campo ZVALUESTRING contém o valor, como o ID de pacote de um aplicativo. Os campos ZSTARTDATE, ZENDDATE e ZCREATIONDATE usam Mac Absolute Time em UTC, e ZSECONDSFROMGMT registra o deslocamento UTC do dispositivo naquele momento, por exemplo, -10.800 para UTC−3.
Nas versões recentes do macOS, muitos fluxos, entre eles o de foco de aplicativos, são gravados no Biome. No macOS 13 e posteriores, espere que o knowledgeC tenha poucos dados ou não contenha fluxos que os sistemas mais antigos registravam. Um /app/inFocus vazio ali não é evidência de exclusão.
Biome
O Biome armazena fluxos em pastas individuais por fluxo em ~/Library/Biome e, para fluxos do sistema, em /private/var/db/biome; o foco de aplicativos fica em um fluxo chamado App.InFocus. Os arquivos usam o formato SEGB da Apple: a assinatura ASCII SEGB em um cabeçalho (existem duas versões de cabeçalho), seguida de registros cujas cargas úteis geralmente são mensagens protobuf, com os horários dos registros em Mac Absolute Time. O suporte das ferramentas ainda é recente e muda rapidamente. Existem parsers SEGB de código aberto e módulos Biome em ferramentas da comunidade, mas teste qualquer ferramenta com um arquivo conhecido antes de confiar na saída.
Downloads, navegação e outras atividades do usuário
- Banco de dados de quarentena:
~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2(SQLite, sem extensão). A tabelaLSQuarantineEventcontém um UUID (LSQuarantineEventIdentifier),LSQuarantineTimeStamp(Mac Absolute Time), o agente (LSQuarantineAgentName,LSQuarantineAgentBundleIdentifier),LSQuarantineDataURLString(a URL do arquivo) eLSQuarantineOriginURLString(a página de origem). O arquivo baixado contém um atributo estendidocom.apple.quarantine, por exemplo,0083;69b52883;Safari;<UUID>: flags, o horário do download em segundos Unix em hexadecimal, o agente e o mesmo UUID. As linhas permanecem após a exclusão do arquivo. - Safari:
~/Library/Safari/History.db, em quehistory_itemscontém URLs ehistory_visitscontém cada visita comvisit_timeem Mac Absolute Time. O módulo 4 aborda navegadores. - Itens recentes:
~/Library/Application Support/com.apple.sharedfilelist/contém arquivos.sfl2(.sfl3nas versões mais recentes) para documentos, aplicativos e servidores recentes, além de listas de documentos recentes por aplicativo. São plists arquivados que contêm dados de marcadores (caminho, volume); a ordem da lista indica a recência, mas os itens geralmente não contêm carimbos de data/hora individuais. O OS X 10.11 e o 10.12 usavam arquivos.sflna mesma pasta; sistemas anteriores ao 10.11 usavamcom.apple.recentitems.plistem~/Library/Preferences. - TCC.db: o banco de dados de permissões de privacidade, por usuário em
~/Library/Application Support/com.apple.TCC/TCC.dbe de todo o sistema em/Library/Application Support/com.apple.TCC/TCC.db. A tabelaaccesslista umservice(comokTCCServiceScreenCapture,kTCCServiceAccessibilityoukTCCServiceSystemPolicyAllFilespara Acesso Total ao Disco), o aplicativoclient,auth_value(2 significa permitido no macOS 11 e posteriores) elast_modifiedem segundos Unix. Uma ferramenta de controle remoto com permissões de gravação de tela e acessibilidade se destaca aqui. - Spotlight:
.Spotlight-V100em cada volume indexado contém o índice de metadados, incluindo atributos comokMDItemLastUsedDateekMDItemWhereFroms; parsers como o plugin Spotlight do módulomac_aptpodem lê-lo.
Qual fonte responde a cada pergunta
| Pergunta | Fonte | Caminho | Formato de tempo |
|---|---|---|---|
| Quando o usuário fez login ou desbloqueou? | Unified Logs | /private/var/db/diagnostics + uuidtext | Renderizado com deslocamento; converter para UTC |
| Quais arquivos foram criados, renomeados ou excluídos? | FSEvents | .fseventsd em cada volume | Nenhum; estimar pelo mtime do arquivo gzip |
| Qual aplicativo estava em primeiro plano e por quanto tempo? | knowledgeC / Biome | knowledgeC.db; ~/Library/Biome | Mac Absolute Time |
| O que foi baixado e de onde? | Banco de dados de quarentena | ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 | Mac Absolute Time (xattr: Unix em hexadecimal) |
| Quais páginas foram visitadas? | Safari | ~/Library/Safari/History.db | Mac Absolute Time |
| Qual aplicativo recebeu acesso à tela ou ao disco? | TCC | .../com.apple.TCC/TCC.db | Segundos Unix |
Exemplo resolvido: um download, uma execução e uma entrada de log
Um Mac configurado para UTC−3 é examinado. O banco de dados de quarentena contém uma linha de interesse:
| Campo | Valor |
|---|---|
LSQuarantineTimeStamp | 795.172.867,0 |
LSQuarantineAgentName | Safari |
LSQuarantineOriginURLString | https://www.example.net/support |
LSQuarantineDataURLString | https://downloads.example.net/files/RemoteHelper.dmg |
De Mac Absolute para Unix: 795.172.867 + 978.307.200 = 1.773.480.067, que corresponde a 2026-03-14T09:21:07Z. Em hexadecimal, 1.773.480.067 é 69b52883, o valor esperado no segundo campo do atributo com.apple.quarantine do arquivo.
O knowledgeC do usuário tem uma linha /app/inFocus com ZVALUESTRING = net.example.RemoteHelper, ZSTARTDATE = 795.173.145,0, ZENDDATE = 795.173.412,0 e ZSECONDSFROMGMT = -10.800.
- Início: 795.173.145 + 978.307.200 = 1.773.480.345 = 2026-03-14T09:25:45Z.
- Fim: 795.173.412 + 978.307.200 = 1.773.480.612 = 2026-03-14T09:30:12Z.
- Duração: 795.173.412 − 795.173.145 = 267 s (4 min 27 s).
- -10.800 s corresponde a −3 h, portanto, o início local foi às 06:25:45. Não aplique o deslocamento ao valor armazenado;
ZSTARTDATEjá está em UTC.
No log unificado, log show --archive case.logarchive --predicate 'process == "syspolicyd" AND eventMessage CONTAINS "RemoteHelper"' retorna uma avaliação do Gatekeeper de /Applications/RemoteHelper.app em 2026-03-14 06:25:41.208114-0300. Somar 3 horas resulta em 09:25:41Z, quatro segundos antes de o aplicativo entrar em foco, o que é compatível com uma primeira execução sendo verificada pelo Gatekeeper. Três fontes independentes agora fornecem uma única sequência: download às 09:21:07Z, verificação do Gatekeeper às 09:25:41Z, aplicativo em foco de 09:25:45Z a 09:30:12Z. O FSEvents pode acrescentar a criação de RemoteHelper.app em /Applications, mas apenas como um evento ordenado sem horário próprio.
Foco no exame: Espere perguntas sobre onde cada fonte fica, qual formato de tempo ela usa (Mac Absolute Time para knowledgeC, Biome, quarentena e Safari; segundos Unix no TCC e em hexadecimal no atributo de quarentena; nenhum carimbo de data/hora no FSEvents) e sobre a conversão de um valor Mac Absolute para ISO 8601 UTC. Saiba por que os arquivos uuidtext e timesync devem ser coletados junto com os arquivos tracev3, o que <private> significa e por que o knowledgeC pode ter poucos dados nas versões recentes do macOS.
Pontos principais
- Unified Logs: os arquivos tracev3 em
/private/var/db/diagnosticsprecisam deuuidtexte dos dados timesync; colete comlog collect, filtre comlog show --predicatee converta o deslocamento exibido para UTC. - O FSEvents registra caminhos, flags e IDs de evento por volume, incluindo nomes excluídos em unidades externas, mas nenhum horário por registro.
- O knowledgeC armazena fluxos de uso como
/app/inFocusem Mac Absolute Time comZSECONDSFROMGMT; as versões recentes do macOS transferem grande parte disso para arquivos SEGB do Biome. - O banco de dados de quarentena vincula a URL, o agente e o horário de um download ao atributo
com.apple.quarantinedo arquivo. - O TCC.db mostra quais aplicativos receberam permissões de privacidade, com horários em segundos Unix.
- Corrobore: o download, a entrada de log e o registro de uso devem formar uma sequência consistente.
Questões de prática
Verifique o que você aprendeu. Estas questões não contam para o exame.
Entre para salvar seu progresso e continuar de onde parou. É grátis. Entrar