C#の EventLogEntry を利用して「システム時刻の変更」の情報を取得すると「CVE の検出の可能性」としてメッセージが出力されます。
- イベント ID: 1
- タスクのカテゴリ: (5)
- ソース: Kernel-General
たしかに、現在ではオンライン設定がデフォルトになっているので、このログは出力されないケースがほとんどになっていると思います。(オンライン下では、イベント ID「35」などの Time-Service のほうになると思います)
発生例
取得した events
の ProcessID を比較すると Windowsイベントビューアーのログと一致します。なので、「CVE の検出の可能性」となっているものは、正しくは「システム時刻の変更(ローカル時刻)」になるはずです。
publicstaticbool TryGetUpdateTimeInLocal(out DateTimeOffset datetime1, out DateTimeOffset datetime2) { var format ="yyyy-MM-ddTHH:mm:ss.fffffffK"; var events = GetEvent("System", "Microsoft-Windows-Kernel-General", 1, 3); var e = events.FirstOrDefault(); var success =false; datetime1 = DateTimeOffset.MinValue; datetime2 = DateTimeOffset.MinValue; if (e !=null) { var success1 = DateTimeOffset.TryParseExact( e.ReplacementStrings[0], format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, outvar dateTimeOffset1); var success2 = DateTimeOffset.TryParseExact( e.ReplacementStrings[1], format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, outvar dateTimeOffset2); if (success1 && success2) { datetime1 = dateTimeOffset1; datetime2 = dateTimeOffset2; success =true; } } return success; }
privatestatic IEnumerable<EventLogEntry> GetEvent(string logName, string sourceName, int instanceId, int count) { var events =new List<EventLogEntry>(); using (var eventlog =new EventLog(logName)) { for (int i = eventlog.Entries.Count -1; i >=0; i--) { EventLogEntry entry = eventlog.Entries[i]; if (entry.Source == sourceName && entry.InstanceId == instanceId) { events.Add(entry); if (events.Count() >= count) { break; } } } } return events; }
補足
知らなかったのですが、この問題は 2017 年には指摘があったみたいです。
おそらくこの問題が現在でも修正されていないのではないかと思います。