Windows内部解析サービス
豊田孝の「IT談話館」 Windowsメモリダンプ解析を依頼する WinDbgとシステム分析




 本「IT談話館」一般公開記事は、書籍 「インサイド Microsoft Windows」 程度の基礎知識をお持ちの方を想定しています。



WinDbgとWindows XP/7/8/10のハンドルテーブル解析


 WindowsはSaaSとして提供される時代に入り、その内部は頻繁に更新されています。更新内容の多くは、いろいろな事情と理由から、公にされることはほとんどありません。最新のユーザー空間とカーネル空間に関する信頼できる技術情報を取得するには、「時間と予算」を投資し、高度な内部解析技術を習得する必要があります。本「IT談話館」が一般公開する記事は、0dayをはじめとする脆弱性研究者、組み込みシステム開発者、デジタルフォレンジック技術者、あるいは、EDR製品のビジネス関係者に広く読まれています。特に、Windowsカーネル空間の解析技術情報は多くの人に注目されています。

 Windows 10の短周期の内部更新は、性能向上と互換性維持に加え、ML/DL/AI時代への対応と位置付けられています。簡単に表現すれば、Windows 10はCloudサービスと連携しながらBig Dataを収集・蓄積する「ソフトウェアセンサー」、という役割を担っています。本「IT談話館」は、そのソフトウェアセンサーのユーザー空間とカーネル空間を独自の解析コードで詳しく解析する技術を保有し、「Windowsメモリダンプ解析サービス」を提供しています。

 メモリダンプを解析すると、システム内の「異様な動き」を検出・解析することができます。「異様な動き」の中には、システムパフォーマンスの低下、既存アプリの動作異常、システムクラッシュ原因、あるいは、セキュリティー脅威なども含まれます。「本館サービス」をご利用の際には、所属チーム内でご協議の上、「お問い合わせ」頂けると幸いです。

 セキュリティーの視点からWindows10ソフトウェアセンサーを見た場合、本「IT談話館」の確認範囲では、次のような保護メカニズム階層が考案・実装されています。下記リンクはすべて本館記事を指しています。
  1. Silo/Server Silo
  2. Job
  3. Session
  4. Protected Process
  5. Mandatory Integrity Control(MIC)
  6. Windows API(+CPU)
  7. CPU

 本稿ではハンドルテーブルを取り上げます。ハンドルテーブルは、ハンドル値とカーネルオブジェクトを対応付ける重要なWindowsカーネル内部システムテーブルの一つです。このテーブルの不正な改ざんを防止するには、テーブルへのアクセスロジックを工夫する必要があります。

 ハンドルテーブルは、XPから10までのバージョンアップ過程で継続的に再設計されてきました。2015年7月末にWindows 10がリリースされた時、本「IT談話館」はいち早くカーネルメモリダンプを採取し、ハンドルテーブルの解析にとりかかりました。予想した通り、Windows 8.1時代の解析コードは動作しなくなりました。Windows 7からWindows 8へのバージョンアップの過程で導入されたハンドルテーブル保護ロジックは貧弱であり、そこに気付いたMS社内の開発担当チームはWindows 10の開発段階で修正してきました。次の情報をご覧ください。
2: kd> vertarget
Windows 8.1 Kernel Version 9600 MP (4 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS Personal
Built by: 9600.17238.amd64fre.winblue_gdr.140723-2018
Machine Name:
Kernel base = 0xfffff801`6868c000 PsLoadedModuleList = 0xfffff801`68956350
Debug session time: Thu Oct  9 00:34:44.270 2014 (UTC + 9:00)
System Uptime: 0 days 13:38:52.140


2: kd> u nt!ObGetObjectType l0n20
nt!ObGetObjectType:
fffff801`68b318c4 0fb641e8        movzx   eax,byte ptr [rcx-18h]
fffff801`68b318c8 488d0d51dee0ff  lea     rcx,[nt!ObTypeIndexTable (fffff801`6893f720)]
fffff801`68b318cf 488b04c1        mov     rax,qword ptr [rcx+rax*8]
fffff801`68b318d3 c3              ret
 この情報は、次のようなことを示しています。  この実装ロジックはきわめて単純であり、バイト値を与えればインデックステーブルへのアクセスが可能であることを示しています。本館が確認している範囲では、Windows 8.1以前のバージョンのWindowsシステムもすべてこのリスキーなロジックを採用しています。セキュリティーを確保する視点からは、きわめて危険なロジック、といえるでしょう。このロジックは、Windows 8.1カーネルの資産を継承するWindows 10では次のように変更されています。
0: kd> vertarget
Windows 10 Kernel Version 10586 MP (2 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 10586.17.amd64fre.th2_release.151121-2308
Machine Name:
Kernel base = 0xfffff802`02411000 PsLoadedModuleList = 0xfffff802`026efc70
Debug session time: Tue Jan 12 15:08:49.559 2016 (UTC + 9:00)
System Uptime: 1 days 3:41:20.157


0: kd> u nt!ObGetObjectType l0n20
nt!ObGetObjectType:
fffff802`02897bfc 488d41d0        lea     rax,[rcx-30h]
fffff802`02897c00 0fb649e8        movzx   ecx,byte ptr [rcx-18h]
fffff802`02897c04 48c1e808        shr     rax,8
fffff802`02897c08 0fb6c0          movzx   eax,al
fffff802`02897c0b 4833c1          xor     rax,rcx
fffff802`02897c0e 0fb60d5f88efff  movzx   ecx,byte ptr [nt!ObHeaderCookie (fffff802`02790474)]
fffff802`02897c15 4833c1          xor     rax,rcx
fffff802`02897c18 488d0dc18cefff  lea     rcx,[nt!ObTypeIndexTable (fffff802`027908e0)]
fffff802`02897c1f 488b04c1        mov     rax,qword ptr [rcx+rax*8]
fffff802`02897c23 c3              ret
 この情報からは、次のような技術者事情と時代背景を知ることができます。  本「IT談話館」は、先の逆アセンブルコードを次のような内部情報を返すWinDbg内蔵スクリプト(独自解析)コードに移植・実行してみました。なお、実践的な解析コードの開発知識の習得には、「時間と予算」の投資が必要です。
0: kd> vertarget
Windows 10 Kernel Version 10586 MP (2 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 10586.17.amd64fre.th2_release.151121-2308
Machine Name:
Kernel base = 0xfffff802`02411000 PsLoadedModuleList = 0xfffff802`026efc70
Debug session time: Tue Jan 12 15:08:49.559 2016 (UTC + 9:00)
System Uptime: 1 days 3:41:20.157


HandleCount(1248)	explorer.exe	ffffe001f6a69840
No.001	Object->0xFFFFC000C748A340	ObjectType->0xFFFFE001F4CDBDE0	Name->Key
		Index->0x027	Handle->0x004
No.002	Object->0xFFFFC000C65AAD40	ObjectType->0xFFFFE001F4CDBDE0	Name->Key
		Index->0x027	Handle->0x008
No.003	Object->0xFFFFC000C335D150	ObjectType->0xFFFFE001F4C291D0	Name->Directory
		Index->0x003	Handle->0x00c
No.004	Object->0xFFFFE001F6F88980	ObjectType->0xFFFFE001F4C99DD0	Name->Event
		Index->0x00c	Handle->0x010
No.005	Object->0xFFFFE001F7950BD0	ObjectType->0xFFFFE001F4C99DD0	Name->Event
		Index->0x00c	Handle->0x014
No.006	Object->0xFFFFE001F7981F20	ObjectType->0xFFFFE001F4C24DC0	Name->File
		Index->0x01f	Handle->0x018
No.007	Object->0xFFFFE001F7857560	ObjectType->0xFFFFE001F4C99DD0	Name->Event
		Index->0x00c	Handle->0x01c
No.008	Object->0xFFFFE001F7AE4F90	ObjectType->0xFFFFE001F4C24F20	Name->WaitCompletionPacket
		Index->0x01e	Handle->0x020
No.009	Object->0xFFFFE001F785ADA0	ObjectType->0xFFFFE001F4CD7CF0	Name->ALPC Port
		Index->0x028	Handle->0x024
No.010	Object->0xFFFFE001F786ED40	ObjectType->0xFFFFE001F4C1FDC0	Name->IoCompletion
		Index->0x01d	Handle->0x028

[---]


0: kd> !handle 24 3 ffffe001f6a69840

PROCESS ffffe001f6a69840
    SessionId: 1  Cid: 0fd8    Peb: 0021f000  ParentCid: 0fac
    DirBase: 0cc94000  ObjectTable: ffffc000c747bf00  HandleCount: 
    Image: explorer.exe

Handle Error reading handle count.

0024: Object: ffffe001f785ada0  GrantedAccess: 001f0001 (Protected) (Inherit) (Audit) Entry: ffffc000c748d090
Object: ffffe001f785ada0  Type: (ffffe001f4cd7cf0) ALPC Port
    ObjectHeader: ffffe001f785ad70 (new version)
        HandleCount: 1  PointerCount: 32441

0: kd> !trueref ffffe001f785ada0
ffffe001f785ada0: HandleCount: 1 PointerCount: 32441 RealPointerCount: 3


0: kd> !handle 28 3 ffffe001f6a69840

PROCESS ffffe001f6a69840
    SessionId: 1  Cid: 0fd8    Peb: 0021f000  ParentCid: 0fac
    DirBase: 0cc94000  ObjectTable: ffffc000c747bf00  HandleCount: 
    Image: explorer.exe

Handle Error reading handle count.

0028: Object: ffffe001f786ed40  GrantedAccess: 001f0003 (Protected) Entry: ffffc000c748d0a0
Object: ffffe001f786ed40  Type: (ffffe001f4c1fdc0) IoCompletion
    ObjectHeader: ffffe001f786ed10 (new version)
        HandleCount: 1  PointerCount: 25319

0: kd> !trueref ffffe001f786ed40
ffffe001f786ed40: HandleCount: 1 PointerCount: 25319 RealPointerCount: 95
 本「IT談話館」のWinDbgスクリプト(独自解析)コードをいろいろなプロセスのハンドルテーブルの解析に適応してみると、個々のプロセスの内部で使用されているカーネルオブジェクトが列挙され、解析対象プロセスの特性が一目で分かります。


ビジネスメニュー




 本「IT談話館」一般公開記事は、書籍 「インサイド Microsoft Windows」 程度の基礎知識をお持ちの方々を想定しています。
Windowsメモリダンプ解析技術開発室 ビジネスメニュー

Copyright©豊田孝 2004- 2020
本日は2020-07-03です。