本「
IT談話館」一般公開記事は、10年以上の実務経験を持つ上級Windowsエンジニアを想定しています。
本館は、Windowsカーネル深層を解析し、クラッシュ原因をはじめとするシステム内の「異様な動き」を検出・分析する
超高度な技術と実績を保有しています。
Windows 7/8/10、偽装メカニズム、内部解析技術
本「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
本稿では、次の4種類の技術概念に焦点を当て、いくつかの仮説を立てながら、Windows 7以降のWindowsシステムに実装されている偽装メカニズムの基本的な解析を行っています。
米Microsoft社は、クライアント偽装に関する技術情報を「このページ」から一般公開し、偽装を次のように定義しています。
Impersonation is the ability of a thread to execute using different security information than the process
that owns the thread.
この定義文は次のような解釈を可能とします。
- 偽装はスレッドの機能である
- スレッドは通常所属プロセスのセキュリティー情報を引き継いでいる
- スレッドはプロセスからの引き継ぎ情報と異なるセキュリティー情報で実行できる
この高次の偽装定義に加え、次のような4種類の実装上の偽装レベルが定義されています。カッコ内の数値は偽装レベルを示し、数値が大きくなるに従い、偽装内容が高度になります。
- SecurityAnonymous(0): The server cannot impersonate or identify the client.
- SecurityIdentification(1): The server can get the identity and privileges of the client, but cannot impersonate the client.
- SecurityImpersonation(2): The server can impersonate the client's security context on the local system.
- SecurityDelegation(3): The server can impersonate the client's security context on remote systems.
本「IT談話館」の別稿「Windows XP/7/8/10のセッションとプロセス」に含まれる実行結果からは、プロセス、スレッド、セッション、および、トークンの間に次のような関係が存在するという仮説を立てることができます。
- プロセスオブジェクトとスレッドオブジェクトは「重要、かつ、代表的」なカーネルオブジェクトである
- プロセスオブジェクトとスレッドオブジェクトはセッションオブジェクトと密接な関係を持っている
- セッションオブジェクトは「SMSS.EXE」(セッションマネージャー)プロセスが作成する
- トークンオブジェクトは「Winlogon.exe」プロセスが作成する
- 偽装とは、主に、ユーザープロセスとシステム/サービスプロセス間のセキュリティーを考慮した通信である
これまでの情報と仮説からは、次のような新たな仮説と条件を実証する解析コードを独自に開発すればよいことになります。なお、解析コードの開発知識の習得には、「時間と予算の投資」が必要です。
- 偽装スレッドは、所属プロセスと異なる偽装レベル値を持っている
- 偽装スレッドは、「偽装レベル値 == 2」を持っている
- 偽装サーバーのSessionIdは「0」である
- 偽装クライアントのSessionIdは(通常は)「0」以外の値である
- トークンオブジェクトを解析すれば、セッションオブジェクトも解析できる
(Windows 10サーバー系エディションではなく)Windows 10 Pro環境で採取した「Active Memory Dump」をWinDbgにロードし、本「IT談話館」の独自解析コードを実行いたしますと、たとえば、次のような結果が返されてきます。
1: kd> vertarget
Windows 10 Kernel Version 15063 MP (2 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 15063.0.amd64fre.rs2_release.170317-1834
Machine Name:
Kernel base = 0xfffff803`52406000 PsLoadedModuleList = 0xfffff803`527525a0
Debug session time: Tue Jun 27 15:39:26.892 2017 (UTC + 9:00)
System Uptime: 12 days 7:17:40.907
[---]
0xFFFFDB8B69F67640 SessionId->0 ImpLevel->0 svchost.exe
***Thread->0xFFFFDB8B67179700
0xFFFF8007EEC53890 Token
SessionId->9 ImpLevel->2 TokenType->2 SourceName->User32
0xFFFF8007D9C1A770 LogonSession
AccountName->Toyota AuthorityName->Toyota-PC
[---]
この結果は次のようなことを示しています。
- 偽装スレッド「0xFFFFDB8B67179700」は所属プロセス「0xFFFFDB8B69F67640」と異なる偽装レベルを持っている
- 偽装スレッド「0xFFFFDB8B67179700」はユーザー「Toyota」を偽装している
- 偽装サーバー「svchost.exe」はセッション「0」内で起動されている
- 偽装クライアントはセッション「9」内で起動されている
先ほど設定した仮説と条件を実装した解析コードは予想通りの結果を返しています。
本「IT談話館」の解析技術は、C++とアセンブラーをベースとし、カーネル空間を直接解析しますから、解析コードが返してくる情報は最新Windowsカーネルの実体を語ってくれます。Windows 10はSaaS(Software As A Service)として提供され、システム内部は黙々と頻繁に更新されています。設定した仮説や条件と解析コードの実行結果の間に微妙な「違和感」を感知できることが多々あります。そのような場合、新たな事実を発見したことであり、いくつかの解析コードを視点を変えながら独自に実装・実行すれば、インターネットなどでは入手できない、「高度、かつ、最新」の未公開情報をその場で得ることができます。
0xFFFF9C876F06F840 SessionId->0 ImpLevel->0 wsmprovhost.ex
***Thread->0xFFFF9C876F3BD800
0xFFFFE500578047D0 Token
SessionId->0 ImpLevel->2 TokenType->2 SourceName->Kerberos
0xFFFFE500579322A0 LogonSession
AccountName->Tester AuthorityName->SYS-INHOUSE
以上、本稿では基本的な偽装メカニズムの解析例を紹介しましたが、実務解析作業では次のような視点からの解析も必要になります。
- 偽装サーバーの実体解明
- 偽装クライアントの実体解明
- 同一セッション内のプロセス間偽装
- 自己偽装の実体解明