本「
IT談話館」一般公開記事は、10年以上の実務経験を持つ上級Windowsエンジニアを想定しています。
本館は、Windowsカーネル深層を解析し、クラッシュ原因をはじめとするシステム内の「異様な動き」を検出・分析する
超高度な技術と実績を保有しています。
WinDbgとWindowsレジストリ解析(応用)
本「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とWindowsレジストリ解析(基礎)」の続編であり、基礎編と同じように、Windows 10環境で採取した「Active Memory Dump」内に保存されているWindowsレジストリ情報を本「IT談話館」の独自解析コードで解析しています。
今回解析対象とするメモリダンプは次のようなものです。
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 = 0xfffff804`59a00000 PsLoadedModuleList = 0xfffff804`59e480b0
Debug session time: Sun Nov 3 09:56:47.110 2019 (UTC + 9:00)
System Uptime: 0 days 1:42:54.949
本館の独自解析コードを実行すると、次のような結果が返されてきます。
ObjectTable->0xffff8d8c4c8e8000 HandleCount->0235 ffffc489264e2080->notmyfault64.e
[---]
kbody->0xffff8d8c506b9400 kcb->0xffff8d8c4ac4d720
FullKeyName->***
RefCount->0014
Found list end after 10 entries
Length->8 ShrtKeyName->SECURITYt
kbody->0xffff8d8c506bbda0 kcb->0xffff8d8c49cb15f0
FullKeyName->***
RefCount->0020
Found list end after 16 entries
Length->8 ShrtKeyName->SECURITYt
kbody->0xffff8d8c506ba2a0 kcb->0xffff8d8c4a7640c0
FullKeyName->\REGISTRY\USER\S-1-5-21-1130387745-3410680543-2795099033-1001_Classes RefCount->0080
Found list end after 63 entries
Length->54 ShrtKeyName->S-1-5-21-1130387745-3410680543-2795099033-1001_CLASSES
この情報には2箇所のデータが赤色で表示されています。いずれも「SECURITYt」というキー名が表示されています。キー名の前に表示されている「Length->8」はキー名を構成する文字数を示していますから、「SECURITYt」から「t」を取り除き、残りの「SECURITY」が正式なキー名となります。
同じ名前を持つこれら2つのキーオブジェクトは「kbody」欄などの他の数値を見ると、異なる値が設定されていますから、キー名が同名であっても、同一のオブジェクトではないことが分かります。また、「FullKeyName」欄は「***」となっており、「FullKeyName->\REGISTRY\USER\S-1-5-21-1130387745-3410680543-2795099033-1001_Classes」のようにキー名がフル表示されていません。ここでは、2つの「SECURITY」キーオブジェクトの違いを調査してみます。
本館の独自解析コードを実行し、最初の「SECURITY」キーオブジェクトの「FullKeyName」を確認してみます。
ParentKcb->0xffff8d8c4a75d7c0 FullKeyName-> kcb->0xffff8d8c4a75d7c0 Length->17 ShrtKeyName->INTERNET EXPLORERI訣
ParentKcb->0xffff8d8c4a4b4cd0 FullKeyName-> kcb->0xffff8d8c4a4b4cd0 Length->9 ShrtKeyName->MICROSOFTRSIOND03
ParentKcb->0xffff8d8c4ac68840 FullKeyName-> kcb->0xffff8d8c4ac68840 Length->8 ShrtKeyName->SOFTWAREYSERVICES
ParentKcb->0xffff8d8c4a4840d0 FullKeyName-> kcb->0xffff8d8c4a4840d0 Length->46 ShrtKeyName->S-1-5-21-1130387745-3410680543-2795099033-1001vコK
ParentKcb->0xffff8d8c4a484a00 FullKeyName-> kcb->0xffff8d8c4a484a00 Length->46 ShrtKeyName->S-1-5-21-1130387745-3410680543-2795099033-1001vコK
ParentKcb->0xffff8d8c43ea1be0 FullKeyName-> kcb->0xffff8d8c43ea1be0 Length->4 ShrtKeyName->USER
ParentKcb->0xffff8d8c43e58050 FullKeyName-> kcb->0xffff8d8c43e58050 Length->8 ShrtKeyName->REGISTRY
この情報内の「ShrtKeyName」欄の文字列を下から上に向かって連結すると、「\REGISTRY\USER\S-1-5-21-1130387745-3410680543-2795099033-1001\SOFTWARE\MICROSOFT\INTERNET EXPLORER\SECURITY」という「FullKeyName」キーが完成します。ちなみに、このキーは、次のようなプロセスが参照しています。
Kbody->0xffff8d8c506b9400 ProcessId->0x1514
Found list end after 10 entries
0000: 0xffffc48926221080 ProcessId->0x10e8 StartMenuExper
0001: 0xffffc489269e70c0 ProcessId->0x1778 svchost.exe
0002: 0xffffc489269e84c0 ProcessId->0x18cc ShellExperienc
0003: 0xffffc489271230c0 ProcessId->0x18b8 dllhost.exe
0004: 0xffffc48926b9a080 ProcessId->0x0a80 RuntimeBroker.
0005: 0xffffc489250ee080 ProcessId->0x0bec svchost.exe
0006: 0xffffc489269cf080 ProcessId->0x10a8 RuntimeBroker.
0007: 0xffffc48926f94500 ProcessId->0x043c smartscreen.ex
0008: 0xffffc48924b9a080 ProcessId->0x0594 chrome.exe
この結果を見ると、エントリ数が10個のところ9個しか表示されていません。この背景は興味あるところですが、ここでは、プロセスオブジェクトが2ヶ所で管理されている内部事情に起因すると推察される、とだけ述べておき、詳しい解説は割愛します。ルートキットなどの凶悪マルウェアの潜伏を安易に否定することはできませんが、本館の経験では、数年に一件そのレベルの事案に遭遇するかどうかといった程度です。
2番目の「SECURITY」キーオブジェクトの「FullKeyName」は次のようになっています。
ParentKcb->0xffff8d8c48de6e30 FullKeyName-> kcb->0xffff8d8c48de6e30 Length->17 ShrtKeyName->INTERNET EXPLORERI訣
ParentKcb->0xffff8d8c47d41d80 FullKeyName-> kcb->0xffff8d8c47d41d80 Length->9 ShrtKeyName->MICROSOFTRSIOND03
ParentKcb->0xffff8d8c443180f0 FullKeyName-> kcb->0xffff8d8c443180f0 Length->8 ShrtKeyName->SOFTWAREYSERVICES
ParentKcb->0xffff8d8c44318390 FullKeyName-> kcb->0xffff8d8c44318390 Length->8 ShrtKeyName->SOFTWAREYSERVICES
ParentKcb->0xffff8d8c43e58ad0 FullKeyName-> kcb->0xffff8d8c43e58ad0 Length->7 ShrtKeyName->MACHINE
ParentKcb->0xffff8d8c43e58050 FullKeyName-> kcb->0xffff8d8c43e58050 Length->8 ShrtKeyName->REGISTRY
この情報を見ると、「SOFTWARE」キーへのアクセスが重複している印象を受けます。調査してみると、キャッシュミスがあった模様です。「FullKeyName」キーは前項の要領で完成させることができます。なお、このキーは次のようなプロセスが参照しています。
Kbody->0xffff8d8c506bbda0 ProcessId->0x1514
Found list end after 16 entries
0000: 0xffffc4891e2620c0 ProcessId->0x0004 System
0001: 0xffffc489206c2080 ProcessId->0x1148 svchost.exe
0002: 0xffffc4892582e080 ProcessId->0x1444 svchost.exe
0003: 0xffffc489204e3080 ProcessId->0x13a0 svchost.exe
0004: 0xffffc48920545080 ProcessId->0x0c4c taskhostw.exe
0005: 0xffffc489262dc0c0 ProcessId->0x0c88 svchost.exe
0006: 0xffffc48926221080 ProcessId->0x10e8 StartMenuExper
0007: 0xffffc489269e70c0 ProcessId->0x1778 svchost.exe
0008: 0xffffc48926d79280 ProcessId->0x003c SecurityHealth
0009: 0xffffc489269e84c0 ProcessId->0x18cc ShellExperienc
0010: 0xffffc489271230c0 ProcessId->0x18b8 dllhost.exe
0011: 0xffffc48926b9a080 ProcessId->0x0a80 RuntimeBroker.
0012: 0xffffc489250ee080 ProcessId->0x0bec svchost.exe
0013: 0xffffc489269cf080 ProcessId->0x10a8 RuntimeBroker.
0014: 0xffffc48926f94500 ProcessId->0x043c smartscreen.ex
0015: 0xffffc48924b9a080 ProcessId->0x0594 chrome.exe
この情報ではエントリ数の不一致は見られません。
レジストリ情報はメモリフォレンジックなどの作業では極めて重要な調査対象とされています。必要以上にレジストリ深層を解析する必要はありませんが、”そこはどういう意味だろう?”という疑問を解消する技術は独自に習得しておく必要はあるでしょう。この姿勢を堅持していれば、たとえば、「WinDbgとWindowsレジストリ解析(基礎)」で紹介したようなWinDbgコマンドエラー発生時に即座に対処できる知識が自然に身に付きます。ちなみに、今回のような「FullKeyName」キーを取得する技術を習得しておくと、次のようなコマンド操作を通してWindowsレジストをカーネル空間から調査できるようになります。
0: kd> !reg q \REGISTRY\Machine\SOFTWARE\MICROSOFT\INTERNET EXPLORER\SECURITY
Found KCB = ffff8d8c49cb15f0 :: \REGISTRY\MACHINE\SOFTWARE\MICROSOFT\INTERNET EXPLORER\SECURITY
Hive ffff8d8c44bbd000
KeyNode 000002ab4b95ec0c
[SubKeyAddr] [SubKeyName]
2ab4ee95b2c DPA
2ab4ee95bd4 MSN
2ab4ee95c54 Negotiate
2ab4ee95cdc NTLM
Use '!reg keyinfo ffff8d8c44bbd000 ' to dump the subkey details
[ValueType] [ValueName] [ValueData]
Key has no Values
この情報で気なるSubKeyがあれば、上記のアドバイスに従って「2ab4ee95b2c」などの「SubKeyAddr」を指定したり、「\REGISTRY\Machine\SOFTWARE\MICROSOFT\INTERNET EXPLORER\SECURITY\DPA」といった「FullKeyName」キーを指定すれば、より詳しい分析を進めることができます。さらには、次のような応用も可能となります。
0: kd> !reg q \REGISTRY\Machine\SOFTWARE\Mozilla
Sorry <\REGISTRY\Machine\SOFTWARE\Mozilla> is not cached
===========================================================================================
Falling back to traversing the tree of nodes.
Could not read KeyName; KeyCell = 220db00
Could not read KeyName; KeyCell = 220dcd8
Could not read KeyName; KeyCell = 220e4f8
Could not read KeyName; KeyCell = 220e708
Hive ffff8d8c44bbd000
KeyNode 000002ab4c9c0a84
[SubKeyAddr] [SubKeyName]
2ab4c9c0adc Firefox
2ab4c9c0b4c MaintenanceService
Use '!reg keyinfo ffff8d8c44bbd000 ' to dump the subkey details
[ValueType] [ValueName] [ValueData]
Key has no Values
この情報は、以前Firefoxを使用しており、その後何らかの事情でアンインストールしたことを示しています。