「イベント ID の説明が見つかりません」エラーの原因と対処法
イベント ビューアーでイベント ID の説明が見つからない理由、%%1833 などのコードの意味、そしてオフラインでもイベントを読む方法を DFIR の視点で解説します。
疑わしいホストから Security.evtx をコピーし、解析用ワークステーションで開くと、すべてのレコードにこう表示されます。
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.
日本語版 Windows では、同じメッセージは「ソース "Microsoft-Windows-Security-Auditing" からのイベント ID 4625 の説明が見つかりません。」で始まります。その後に %%2313、0xC000006A、0x17 といった生の値が並びます。何も壊れておらず、何も失われていません。これはデータの問題ではなく レンダリング の失敗です。この記事では、説明文が実際にどこにあるのか、なぜ表示されないのか、必要なときの直し方、そしてトリアージでは多くの場合それが不要な理由を解説します。(すぐにイベントを読める形にしたいなら、ブラウザー パーサー が説明をレンダリングし、これらのコードをオフラインでデコードします。)
エラーの本当の意味
.evtx のレコードには、イベント ビューアーで読む文章そのものは保存されていません。保存されているのは <System> ブロック (プロバイダー、イベント ID、時刻、コンピューター) と、<EventData> または <UserData> 内の 挿入文字列 です (レコードの中身)。「An account failed to log on. Subject: … Failure Reason: …」(英語版 Windows の場合) という文章は、%1、%2 のプレースホルダーを含むテンプレートで、イベント プロバイダーの DLL または EXE 内の メッセージ テーブル リソース に格納されています。
Windows がそのファイルを探す場所は、プロバイダーの種類によって異なります。
- 従来型 (レガシー) のイベント ソース は
HKLM\SYSTEM\CurrentControlSet\Services\EventLog\<Log>\<Source>に登録され、パスはEventMessageFile値に入ります (オプションでParameterMessageFileとCategoryMessageFileも)。 - マニフェスト ベースのプロバイダー (Vista 以降、
Microsoft-Windows-*ファミリー) はHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{GUID}に登録されます。MessageFileName、ResourceFileName、ParameterFileNameの各値が、コンパイル済みマニフェスト (WEVT_TEMPLATEリソース) とメッセージ テーブルを持つバイナリを指します。
ポイントは、イベント ビューアーはログを表示しているマシン上でメッセージをレンダリングする ことです。使われるのはそのマシンのレジストリと DLL であり、イベントを書き込んだマシンは表示時には関係ありません。プロバイダーがローカルに登録されていなければテンプレートがなく、エラーと生の挿入文字列が表示されます。
よくある原因
- ログが別のホストから来ている。 DFIR の典型例です。ソース ホスト上のサードパーティ エージェント、EDR、SQL Server インスタンス、業務アプリケーションのプロバイダーは、解析用ワークステーションには存在しません。macOS、Linux、クリーンな VM で開いても同じで、Windows のプロバイダーは一切ありません。
- ソフトウェアがアンインストールされた。 アンインストーラーが DLL を削除しても、古いイベントは引き続きそのソースを参照しています。
- DLL の欠落、破損、移動。 レジストリが存在しないパスを指している、または
EventMessageFileがREG_EXPAND_SZではなくREG_SZで保存されていて%SystemRoot%が展開されない。 - 32/64 ビットの不一致。 32 ビットのインストーラーが
System32のつもりで DLL を書き込んだ (ファイル システム リダイレクトにより実際にはSysWOW64) 一方、64 ビットのイベント ログ スタックは登録パスを本物のSystem32として読みます。 - 言語。 プロバイダーのメッセージ テーブルは存在するが表示言語のものがない、あるいはビューアーの言語とは異なる言語の「表示情報付き」エクスポートを開いた。
%% コード: パラメーター メッセージ
メインの説明がレンダリングされる場合でも、一部のフィールドには単語ではなく %%1833 や %%2313 が表示されます。これは パラメーター メッセージ への参照で、値はプロバイダーの ParameterMessageFile / ParameterFileName という 2 つ目のメッセージ テーブル内の ID です。セキュリティ監査プロバイダーの場合、このファイルは msobjs.dll です。オフラインではこれらの参照は解決されないままです。覚えておきたい代表的なもの (ラベルは英語版 Windows の表記) は次のとおりです。
| コード | 意味 | 出現箇所 |
|---|---|---|
%%1833 | Impersonation | 4624 ImpersonationLevel |
%%1840 | Delegation | 4624 ImpersonationLevel |
%%1842 / %%1843 | Yes / No | 4624 VirtualAccount、ElevatedToken |
%%1936 | タイプ 1、完全なトークン (UAC 無効またはビルトイン Administrator) | 4688 TokenElevationType |
%%1937 | タイプ 2、昇格されたトークン | 4688 TokenElevationType |
%%1938 | タイプ 3、制限付きトークン | 4688 TokenElevationType |
%%2307 | Account locked out (アカウントのロックアウト) | 4625 FailureReason |
%%2310 | Account currently disabled (アカウント無効) | 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 |
%%2080 %%2082 %%2084 の 3 つ組は、4720 で新規作成されたアカウントの通常のシグネチャです。4688 の %%1937 は、UAC プロンプトの後に完全な管理者トークンで起動されたプロセスを示します。
16 進値は %% コードではありません。4625 の Status / SubStatus フィールドは NTSTATUS コードです。0xC000006A は有効なアカウントに対するパスワード誤り、0xC0000064 は存在しないユーザー名、0xC0000234 はロックアウトされたアカウントです。4769 の TicketEncryptionType は Kerberos の etype で、0x17 は RC4-HMAC、0x12 は AES256 です。どちらもプロバイダーが存在していても生の 16 進値で表示されます。
対処法 1: 表示情報付きでエクスポートする
ソース ホストにまだアクセスできるなら、メッセージと一緒に持ち運べる形でログをエクスポートします。イベント ビューアーでログを右クリックし、[すべてのイベントを名前を付けて保存] を選び、.evtx を指定して、次のダイアログで表示情報を含める言語を選択します (英語版 Windows では Display information for these languages)。イベント ビューアーはファイルの隣に LocaleMetaData フォルダーを作成し、言語ごとに .MTA ファイルを 1 つ書き出します。コピーするときはこのフォルダーを .evtx の隣に置いたままにしてください。解析マシンのイベント ビューアーがこれを利用します。
コマンド ラインでは次のとおりです。
wevtutil epl Security C:\ir\Security.evtx
wevtutil al C:\ir\Security.evtx /l:en-US
wevtutil al (archive-log) は、エクスポート済みファイルにロケール メタデータを追加します。大規模な収集については 稼働中システムからの EVTX 収集 を参照してください。
対処法 2: プロバイダーをインストールまたは修復する
自分で管理しているマシンで、自社ソフトウェアのイベントがレンダリングされない場合:
- ソースを所有するアプリケーションを再インストールまたは修復する。
HKLM\SYSTEM\CurrentControlSet\Services\EventLog\<Log>\<Source>のEventMessageFileを確認する。パスが存在すること、%SystemRoot%を含むなら値の種類がREG_EXPAND_SZであること。- マニフェスト プロバイダーなら
Get-WinEvent -ListProvider <Name>を確認する。エラーになる、またはメッセージが列挙されない場合はマニフェストの登録が壊れています (バイナリが所定の場所にあればwevtutil im <manifest>.manで再登録できます)。
対処法 3: ソース ホスト上でレンダリングする
Get-WinEvent が Message プロパティを埋めるのは、プロバイダーがローカルに存在する場合だけです。ソース ホスト (または同じソフトウェアがインストールされたマシン) では次が機能します。
Get-WinEvent -Path .\Security.evtx -MaxEvents 20 | Select-Object TimeCreated, Id, Message
手元のワークステーションでは同じコマンドでも Message は空になりますが、.Properties と .ToXml() ではすべての値を取得できます。フィルターのレシピは Get-WinEvent で EVTX をクエリする (英語) を参照してください。
対処法 4: たいていメッセージは不要
DFIR において、レンダリングされた文章は便宜的なものにすぎません。表示されるはずの値はすべて <EventData> にあります: TargetUserName、LogonType、IpAddress、Status、SubStatus。イベント ビューアーの [詳細] タブ (XML 表示) は、[全般] タブにエラーが出ていてもこれらを表示します。大規模に分析するアナリストはいずれにせよフィールドを直接読みます。4624 や ログオン イベント全般 もそのように扱うべきです。フィールド名は Windows のバージョンや言語が変わっても安定していますが、レンダリングされた文章はそうではありません。
ブラウザーでオフラインにイベントを読む
EVTX パーサー は、よく使われる約 60 の DFIR イベントについて読みやすい 1 行の説明を表示するようになりました。対象はログオンと 4625 の失敗、アカウントとグループの変更、Kerberos 4768/4769/4771、NTLM 4776、サービス 7045/4697、スケジュール タスク、Sysmon、PowerShell 4104、RDP です。さらに %% コード、NTSTATUS コード (0xC000006A パスワード誤り、0xC0000064 不明なユーザー)、Kerberos チケットの暗号化タイプ (0x17 RC4) をその場でデコードします。プロバイダー DLL も Windows も不要で、ファイルはブラウザー内で解析され、アップロードされることはありません。ファイルを開くその他の方法は EVTX ファイルの開き方 を参照してください。
チェックリスト
- このエラーは 表示しているマシン にプロバイダーがないことを意味し、レコードの破損ではない。
<EventData>を [詳細] タブ、Get-WinEventの.Properties、またはパーサーで読む。%%参照は上の表でデコードし、Status/SubStatusは NTSTATUS としてデコードする。- レポートにレンダリング済みの文章が必要なら、ソース ホストで表示情報付き (
LocaleMetaData) またはwevtutil alで再エクスポートする。 - 自社ソフトウェアなら
EventMessageFileを修正するか、マニフェストを再登録する。