Descrição do Event ID não encontrada: como resolver
Por que o Visualizador de Eventos não encontra a descrição de um Event ID, o que significam códigos como %%1833 e como ler o evento mesmo assim, offline.
Você copia um Security.evtx de um host suspeito, abre na sua estação de análise e todo registro mostra:
The description for Event ID 4625 from source Microsoft-Windows-Security-Auditing cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer. If the event originated on another computer, the display information had to be saved with the event.
Em seguida vem um bloco de valores brutos: %%2313, 0xC000006A, 0x17. Nada está quebrado e nada foi perdido. É uma falha de renderização, não de dados. Este artigo explica onde o texto da descrição realmente vive, por que ele some, como corrigir quando você precisa dele e por que, na triagem, normalmente você não precisa. (Se você só quer os eventos legíveis agora: o parser no navegador renderiza descrições e decodifica esses códigos offline.)
O que o erro realmente significa
Um registro .evtx não armazena a frase que você lê no Visualizador de Eventos. Ele armazena o bloco <System> (provider, Event ID, horário, computador) e as strings de inserção em <EventData> ou <UserData> (o que há dentro de um registro). A frase («An account failed to log on. Subject: … Failure Reason: …» em um Windows em inglês) é um modelo com marcadores %1, %2 guardado em um recurso de tabela de mensagens dentro de uma DLL ou EXE pertencente ao provider do evento.
Onde o Windows procura esse arquivo depende do tipo de provider:
- Fontes de eventos clássicas (legacy) são registradas em
HKLM\SYSTEM\CurrentControlSet\Services\EventLog\<Log>\<Source>, com o caminho no valorEventMessageFile(e, opcionalmente,ParameterMessageFileeCategoryMessageFile). - Providers baseados em manifesto (do Vista em diante, a família
Microsoft-Windows-*) são registrados emHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{GUID}. Os valoresMessageFileName,ResourceFileNameeParameterFileNameapontam para os binários que carregam o manifesto compilado (recursoWEVT_TEMPLATE) e a tabela de mensagens.
O ponto-chave: o Visualizador de Eventos renderiza a mensagem na máquina onde você visualiza o log, usando o registro e as DLLs dessa máquina. A máquina que gravou o evento não importa na hora da exibição. Se o provider não estiver registrado localmente, não há modelo, e você recebe o erro seguido das strings de inserção brutas.
Causas comuns
- O log veio de outro host. O caso DFIR clássico. Um agente de terceiros, um EDR, uma instância de SQL Server ou uma aplicação de negócio do host de origem não têm provider na sua estação de análise. Abrir o arquivo no macOS, no Linux ou em uma VM limpa tem o mesmo efeito: nenhum provider do Windows.
- O software foi desinstalado. O desinstalador removeu a DLL, mas os eventos antigos ainda referenciam a fonte.
- DLL ausente, corrompida ou movida. O registro aponta para um caminho que não existe mais, ou
EventMessageFileestá gravado comoREG_SZem vez deREG_EXPAND_SZ, então%SystemRoot%nunca é expandido. - Incompatibilidade 32/64 bits. Um instalador de 32 bits gravou sua DLL no que achava ser
System32(na verdadeSysWOW64, pelo redirecionamento do sistema de arquivos), enquanto a pilha do Event Log de 64 bits lê o caminho registrado como oSystem32real. - Idioma. A tabela de mensagens do provider existe, mas não no idioma de exibição, ou você abriu uma exportação salva «com informações de exibição» para um idioma diferente do seu visualizador.
Os códigos %%: mensagens de parâmetro
Mesmo quando a descrição principal é renderizada, alguns campos mostram %%1833 ou %%2313 em vez de palavras. São referências a mensagens de parâmetro: o valor é um ID em uma segunda tabela de mensagens, o ParameterMessageFile / ParameterFileName do provider. Para o provider de auditoria de segurança, esse arquivo é msobjs.dll. Offline, essas referências ficam sem resolução. As que vale a pena saber de cor (rótulos como aparecem em um Windows em inglês):
| Código | Significado | Onde aparece |
|---|---|---|
%%1833 | Impersonation | 4624 ImpersonationLevel |
%%1840 | Delegation | 4624 ImpersonationLevel |
%%1842 / %%1843 | Yes / No | 4624 VirtualAccount, ElevatedToken |
%%1936 | Tipo 1, token completo (UAC desativado ou admin interno) | 4688 TokenElevationType |
%%1937 | Tipo 2, token elevado | 4688 TokenElevationType |
%%1938 | Tipo 3, token limitado | 4688 TokenElevationType |
%%2307 | Account locked out (conta bloqueada) | 4625 FailureReason |
%%2310 | Account currently disabled (conta desabilitada) | 4625 FailureReason |
%%2313 | Unknown user name or bad password | 4625 FailureReason |
%%2080 | Account Disabled | 4720 UserAccountControl |
%%2082 | 'Password Not Required' - Enabled | 4720 UserAccountControl |
%%2084 | 'Normal Account' - Enabled | 4720 UserAccountControl |
%%1537 | DELETE | 4663 AccessList |
%%4416 / %%4417 | ReadData / WriteData | 4663 AccessList |
O trio %%2080 %%2082 %%2084 é a assinatura normal de uma conta recém-criada em um 4720. Um %%1937 em um 4688 é um processo iniciado com token de administrador completo após um prompt do UAC.
Valores hexadecimais não são códigos %%. Os campos Status / SubStatus do 4625 são códigos NTSTATUS: 0xC000006A é senha errada para uma conta válida, 0xC0000064 um nome de usuário que não existe, 0xC0000234 uma conta bloqueada. TicketEncryptionType no 4769 é um etype Kerberos: 0x17 é RC4-HMAC, 0x12 AES256. Ambos aparecem como hexadecimal bruto mesmo quando o provider está presente.
Correção 1: exportar com informações de exibição
Se você ainda tem acesso ao host de origem, exporte o log para que ele viaje com suas mensagens. No Visualizador de Eventos: clique com o botão direito no log, Salvar Todos os Eventos Como…, escolha .evtx e, na caixa de diálogo seguinte, selecione a exibição de informações para os idiomas desejados (Display information for these languages em um Windows em inglês). O Visualizador grava uma pasta LocaleMetaData ao lado do arquivo, com um .MTA por idioma. Mantenha a pasta ao lado do .evtx ao copiá-lo; o Visualizador da máquina de análise a utiliza.
Pela linha de comando:
wevtutil epl Security C:\ir\Security.evtx
wevtutil al C:\ir\Security.evtx /l:en-US
wevtutil al (archive-log) adiciona os metadados de idioma a um arquivo exportado. Para coleta em escala, veja coletar EVTX de um sistema em execução.
Correção 2: instalar ou reparar o provider
Em uma máquina que você administra, quando os eventos do seu próprio software não são renderizados:
- Reinstale ou repare a aplicação dona da fonte.
- Verifique
EventMessageFileemHKLM\SYSTEM\CurrentControlSet\Services\EventLog\<Log>\<Source>: o caminho precisa existir, e o tipo do valor deve serREG_EXPAND_SZse contiver%SystemRoot%. - Para providers com manifesto, confira
Get-WinEvent -ListProvider <Name>; se falhar ou não listar mensagens, o registro do manifesto está quebrado (wevtutil im <manifest>.manregistra de novo, com os binários no lugar).
Correção 3: renderizar no host de origem
Get-WinEvent só preenche a propriedade Message quando o provider está presente localmente. No host de origem (ou em uma máquina com o mesmo software instalado), isto funciona:
Get-WinEvent -Path .\Security.evtx -MaxEvents 20 | Select-Object TimeCreated, Id, Message
Na sua estação, o mesmo comando retorna um Message vazio, mas .Properties e .ToXml() continuam expondo todos os valores. Mais receitas de filtragem em consultar EVTX com Get-WinEvent (em inglês).
Correção 4: normalmente você não precisa da mensagem
Em DFIR, a frase renderizada é uma conveniência. Todo valor que ela mostraria está em <EventData>: TargetUserName, LogonType, IpAddress, Status, SubStatus. A aba Detalhes (Modo de Exibição XML) do Visualizador os mostra mesmo quando a aba Geral exibe o erro. Quem analisa em escala lê os campos diretamente de qualquer forma, e é assim que você deve abordar o 4624 e o resto da família de eventos de logon: os nomes de campo são estáveis entre versões e idiomas do Windows; o texto renderizado não.
Ler eventos offline no navegador
O parser EVTX agora mostra uma descrição legível de uma linha para cerca de 60 eventos DFIR comuns: logons e falhas 4625, alterações de contas e grupos, Kerberos 4768/4769/4771, NTLM 4776, serviços 7045/4697, tarefas agendadas, Sysmon, PowerShell 4104 e RDP. Ele também decodifica em linha os códigos %%, os códigos NTSTATUS (0xC000006A senha errada, 0xC0000064 usuário desconhecido) e os tipos de criptografia de tickets Kerberos (0x17 RC4). Não precisa de DLLs de provider nem de Windows; o arquivo é analisado no seu navegador e nunca é enviado. Para outras formas de abrir o arquivo, veja como abrir um arquivo EVTX.
Checklist
- O erro significa que a máquina que exibe não tem o provider, não que o registro esteja danificado.
- Leia
<EventData>na aba Detalhes, via.PropertiesdoGet-WinEventou com um parser. - Decodifique as referências
%%com a tabela acima; decodifiqueStatus/SubStatuscomo NTSTATUS. - Precisa do texto renderizado para um relatório? Reexporte no host de origem com informações de exibição (
LocaleMetaData) ouwevtutil al. - Para o seu próprio software, corrija
EventMessageFileou registre o manifesto novamente.