本「
IT談話館」一般公開記事は、10年以上の実務経験を持つ上級Windowsエンジニアを想定しています。
本館は、Windowsカーネル深層を解析し、クラッシュ原因をはじめとするシステム内の「異様な動き」を検出・分析する
超高度な技術と実績を保有しています。
WinDbg、WMI、システムロガー
本「IT談話館」の「一般公開記事」は、「Active Memory Dump とカーネルメモリダンプ」の解析結果を基に起草されています。「本館」主筆の「豊田孝」はDKOM(Direct Kernel Object Manipulation)ベースの解析手法の第一人者であり、Windowsカーネル空間の解析分野では世界の先頭を走っています。
現在、セキュリティー問題を無視することはできません。Microsoft社側の負担だけではなく、同社製品の利用者側の負担も増しています。困ったことではありますが、当面避けられません。セキュリティーの視点から「Windows10ソフトウェアセンサー」を見た場合、本「IT談話館」の確認範囲では、「カーネル層保護ロジック」に加え、次のような保護メカニズム階層が考案・実装されています。下記リンクはすべて本館記事を指しています。
- Silo/Server Silo
- Job
- Session
- Protected Process
- Mandatory Integrity Control(MIC)
- Windows API(+CPU)
- CPU
本稿では「WinDbg、WMI、システムロガー(基礎)」前編に続き、WMIを取り上げます。WMIと一口に言ってもその守備範囲が広いため、ここではWMIと、上記リストの先頭にあるSiloという概念の関係性に焦点を当てています。Siloの基礎的な解析工程は、本「IT談話館」のこの記事「WinDbgとWindowsカーネルアーキテクチャー」で紹介しています。
Windowsシステム内部、特にカーネル空間はバージョン単位ではなくビルド単位で頻繁に更新されています。未公開の情報を含む最新内部機能を調査する際には、カーネル内部を直接覗いて見るのも一案です。多くの最新実装機能や実装予定の機能はカーネル空間内に表現、あるいは、予告されています。
本「IT談話館」は、実際のところ、SiloやContainerなどの概念とビジネスを通して実践的に対峙した経験はこれまでのところありません。しかし、WMIに関する経験値は豊富であり、SiloもWMIと内部的に関係しているはず!、と想像していました。「想像」や「仮説」でビジネスができるほど本館の顧客は甘くないため、Windows 10環境で採取した2種類のメモリダンプを独自の解析コードで調査してみました。結論を急げば、先の想像は的を得ています。
まずは次の第1解析情報を見てみます。
3: kd> vertarget
Windows 10 Kernel Version 14393 MP (4 procs) Free x64
Product: Server, suite: TerminalServer SingleUserTS
Built by: 14393.2068.amd64fre.rs1_release.180209-1727
Machine Name:
Kernel base = 0xfffff803`c381d000 PsLoadedModuleList = 0xfffff803`c3b251a0
Debug session time: Mon Jun 25 16:16:23.767 2018 (UTC + 9:00)
System Uptime: 2 days 20:12:55.966
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c477040 Id->03 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c30a5c0 Id->04 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c308040 Id->05 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876e6788c0 Id->06 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c2e6500 Id->07 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c2e59c0 Id->08 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c2e4b80 Id->09 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c2e3b80 Id->0a _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c478040 Id->0b _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c476040 Id->0c _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c467840 Id->0d _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876ede92c0 Id->0e _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c4dfb80 Id->0f _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c4de9c0 Id->10 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876c2074c0 Id->11 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876e215b40 Id->13 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876dbb5b80 Id->14 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876f103b80 Id->15 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876f2e7b80 Id->16 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876eab5740 Id->17 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
nt!_WMI_LOGGER_CONTEXT->0xffff9c876ec21900 Id->18 _ETW_SILODRIVERSTATE->0xffff9c876c0c8000
この調査対象のメモリダンプは2018年6月25日に採取されています。ビルド番号は「14393.2068」と記されています。赤色で強調表示されているデータはSiloに関係しています。このデータの中身を見てみます。
3: kd> dt _ETW_SILODRIVERSTATE 0xffff9c876c0c8000
nt!_ETW_SILODRIVERSTATE
+0x000 EtwpSecurityProviderGuidEntry : _ETW_GUID_ENTRY
+0x190 EtwpLoggerRundown : [64] 0xffff9c87`6c298270 _EX_RUNDOWN_REF_CACHE_AWARE
+0x390 WmipLoggerContext : [64] 0x00000000`00000001 _WMI_LOGGER_CONTEXT
+0x590 EtwpGuidHashTable : [64] _ETW_HASH_BUCKET
+0x1390 EtwpSecurityLoggers : [8] 3
+0x13a0 EtwpSecurityProviderEnableMask : 0x3 ''
+0x13a1 EtwpShutdownInProgress : 0 ''
+0x13a4 EtwpSecurityProviderPID : 0x2c4
この情報はWmiとSiloの関係が深いことを示唆しています。が、この情報に依存した実務的な解析作業が可能かどうかは判断に迷うところです。少なくとも作業は可能でしょうが、いくつかの追加情報を独自に取得する必要があり、重労働となる印象を受けます。次に第2の解析情報を見てみます。
0: kd> vertarget
Windows 10 Kernel Version 18362 MP (2 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 18362.1.amd64fre.19h1_release.190318-1202
Machine Name:
Kernel base = 0xfffff802`6e400000 PsLoadedModuleList = 0xfffff802`6e848130
Debug session time: Thu Dec 26 15:26:37.338 2019 (UTC + 9:00)
System Uptime: 3 days 5:48:09.082
EtwLogger->0xffffa80faafd39c0 Id->02 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faafce9c0 Id->03 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faae69a40 Id->04 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb888e9c0 Id->05 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faafd49c0 Id->06 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faafd59c0 Id->07 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fab1b5a00 Id->08 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fab05c9c0 Id->09 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fab05d9c0 Id->0a _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fab05e9c0 Id->0b _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faafcd9c0 Id->0c _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faaf3d9c0 Id->0d _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faaf3c9c0 Id->0e _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faee939c0 Id->0f _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faaf3a9c0 Id->10 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faaf329c0 Id->11 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faaf319c0 Id->12 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faaf309c0 Id->13 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faaf35a00 Id->14 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faaf409c0 Id->15 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fab4e3a00 Id->16 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fab1b69c0 Id->17 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb9bf39c0 Id->18 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb03e4a00 Id->19 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb94e4a00 Id->1a _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb7de4a00 Id->1b _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80faed10040 Id->1c _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb8ee59c0 Id->1d _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb0224a00 Id->1e _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb8f2b9c0 Id->1f _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb88a19c0 Id->20 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb7f77040 Id->21 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
EtwLogger->0xffffa80fb85c2a00 Id->23 _ETW_SILODRIVERSTATE->0xffffa80faaf3e000
このメモリダンプは、2019年12月26日時点のビルド番号「18362.1」を持つWindows 10環境で採取されています。先ほどと同じように、赤色データの中身を確認してみます。
0: kd> dt _ETW_SILODRIVERSTATE 0xffffa80faaf3e000
nt!_ETW_SILODRIVERSTATE
+0x000 Silo : (null)
+0x008 SiloGlobals : 0xfffff802`6e98e540 _ESERVERSILO_GLOBALS
+0x010 MaxLoggers : 0x40
+0x018 EtwpSecurityProviderGuidEntry : _ETW_GUID_ENTRY
+0x1a8 EtwpLoggerRundown : 0xffffa80f`aae71ac0 -> 0xffffa80f`aae503f0 _EX_RUNDOWN_REF_CACHE_AWARE
+0x1b0 EtwpLoggerContext : 0xffffa80f`aae71cc0 -> 0x00000000`00000001 _WMI_LOGGER_CONTEXT
+0x1b8 EtwpGuidHashTable : [64] _ETW_HASH_BUCKET
+0xfb8 EtwpSecurityLoggers : [8] 3
+0xfc8 EtwpSecurityProviderEnableMask : 0x3 ''
+0xfcc EtwpShutdownInProgress : 0n0
+0xfd0 EtwpSecurityProviderPID : 0x2bc
+0xfd8 PrivHandleDemuxTable : _ETW_PRIV_HANDLE_DEMUX_TABLE
+0xff8 EtwpCounters : _ETW_COUNTERS
+0x1008 LogfileBytesWritten : _LARGE_INTEGER 0x13877c00
+0x1010 ProcessorBlocks : 0xffffa80f`aaf3f240 _ETW_SILO_TRACING_BLOCK
+0x1018 ContainerRestoreWnfSubscription : 0xffff8181`48a55f70 _EX_WNF_SUBSCRIPTION
+0x1020 PartitionId : _GUID {00000000-0000-0000-0000-000000000000}
+0x1030 ParentId : _GUID {00000000-0000-0000-0000-000000000000}
+0x1040 QpcOffsetFromRoot : _LARGE_INTEGER 0x0
+0x1048 PartitionType : 0
+0x104c SystemLoggerSettings : _ETW_SYSTEM_LOGGER_SETTINGS
+0x11c0 EtwpStartTraceMutex : _KMUTANT
ご覧のように、先ほどの情報とは大きく異なる情報が返されています。この情報はWMIとSiloとの関係が緊密であることを言明しています。この情報の中には、「0xfffff802`6e98e540 _ESERVERSILO_GLOBALS」という情報が提供されており、解析作業を進める上での貴重なヒントとなります。実際、本館の調査経験では、この情報はセキュリティー分析、パフォーマンス低下、Anomaly検出などの作業で大いに役に立つことが分かっています。
最近のWindowsに追加されたあの機能が分からない。これまで正常に動作していたコードが突然エラーを返す。さらには、突然画面に表示される警告メッセージの意味がさっぱり理解できない。多くの現場ではこのような声が聞こえます。すでに冒頭でも触れましたが、SiloやWindowsアーキテクチャーに関する基礎的な知識は、本「IT談話館」のこの記事「WinDbgとWindowsカーネルアーキテクチャー」で提供されています。
従来はこのレベルの技術の習得には海外の資料や人材に頼る必要がありましたが、本館主筆の「豊田孝」はBlackHatなどのカンファレンスでプレゼンする海外の先端技術者に助言を与えています。時代が求める人材の育成と技術の習得には、「時間と予算の投資」が必要です。