本「
IT談話館」一般公開記事は、10年以上の実務経験を持つ上級Windowsエンジニアを想定しています。
本館は、Windowsカーネル深層を解析し、クラッシュ原因をはじめとするシステム内の「異様な動き」を検出・分析する
超高度な技術と実績を保有しています。
Windows 8/10とJobオブジェクト(基礎)
本「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
本稿では、上記リストにあるJobオブジェクトを取り上げています。このオブジェクトは、Windows 2000時代から存在しますが、Windows 8以降その役割が強化され、極めて重要なオブジェクトの一つとなっています。ここでは、Jobオブジェクトを次のように整理しておきます。
- Jobオブジェクトは、複数のプロセスを収容し、その動作を制御するWindowsメカニズムである。
- Jobオブジェクトは、Windows 8にて再設計された主要なカーネルオブジェクトである。
米Microsoft社はこのような「Job情報」を公開しています。Google社の一部チームは、セキュリティー確保の観点から、Jobオブジェクトを「このように」認識しています。
Jobオブジェクトは、次のような4種類の基本概念の上に構築されていると考えられます。
- _ejobオブジェクト
- _eprocessオブジェクト
- nt!KiProcessListHead(双方リンクリスト)
- nt!PspJobList(カーネルグローバル変数)
本稿では、Windows 10環境で採取した「Active Memory Dump」を本館の独自解析コードで解析し、Jobオブジェクトの初歩的な内部構造を紹介しています。まずは、次の情報をご覧ください。なお、解析コードの開発知識の習得には、「時間と予算」の投資が必要です。
1: kd> version
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 = 0xfffff800`d5287000 PsLoadedModuleList = 0xfffff800`d55d35c0
Debug session time: Sat Aug 26 08:15:56.376 2017 (UTC + 9:00)
System Uptime: 4 days 0:30:14.078
EJobNotFound ActiveThreads->00000032 chrome.exe(0xffffdb8ccd082080)
EJobNotFound ActiveThreads->00000007 chrome.exe(0xffffdb8ccd964640)
EJobNotFound ActiveThreads->00000002 chrome.exe(0xffffdb8ccdf5d080)
+JobId->1860 PEJob->0xffffdb8cc9858350 Flags->01800010 Flgas2->00000000 chrome.exe(0xffffdb8ccdc0a080)
+JobListEntry->0273: JobId->1860 LEJob->0xffffdb8cc9858350 Flags->01800010 Flgas2->00000000
+JobId->1672 PEJob->0xffffdb8cca0f2890 Flags->01800010 Flgas2->00000000 chrome.exe(0xffffdb8cc97ec080)
+JobListEntry->0274: JobId->1672 LEJob->0xffffdb8cca0f2890 Flags->01800010 Flgas2->00000000
+JobId->1996 PEJob->0xffffdb8ccdafd890 Flags->010c1a00 Flgas2->00000000 MicrosoftEdge.(0xffffdb8cccd23640)
+JobListEntry->0276: JobId->1996 LEJob->0xffffdb8ccdafd890 Flags->010c1a00 Flgas2->00000000
+JobId->0024 PEJob->0xffffdb8ccdbe1720 Flags->010c1a00 Flgas2->00000000 MicrosoftEdgeC(0xffffdb8cc99c3080)
+JobListEntry->0278: JobId->0024 LEJob->0xffffdb8ccdbe1720 Flags->010c1a00 Flgas2->00000000
+JobId->1524 PEJob->0xffffdb8cccd6e060 Flags->01041000 Flgas2->00000000 MicrosoftEdgeC(0xffffdb8ccd381080)
+JobListEntry->0281: JobId->1524 LEJob->0xffffdb8cccd6e060 Flags->01041000 Flgas2->00000000
+JobId->1564 PEJob->0xffffdb8cce4f84f0 Flags->01041000 Flgas2->00000000 MicrosoftEdgeC(0xffffdb8ccddd8080)
+JobListEntry->0288: JobId->1564 LEJob->0xffffdb8cce4f84f0 Flags->01041000 Flgas2->00000000
この情報には、先に紹介した4種類の基礎概念がすべて含まれています。実行した本館独自解析コードは、すべてのプロセスを調査し、4種類の基礎概念間に成立しているJobオブジェクト情報を返してきますが、ここでは、Google社のChromeとMicrosoftのEdgeの2つのブラウザのJobオブジェクト情報のみを紹介しています。
JobオブジェクトはWindows 8からその役割が強化されました。Windows 8.1とWindows 10におけるJobオブジェクトの実装内容を調査してみると、強化作業が完了したわけではなく、現在も続けられていることがはっきり分かります。たとえば、Windows 8.1のJobオブジェクトには「JobId」フィールドなどは実装されていません。従って、今回使用した本館独自解析コードは、Windows 8/8.1環境で採取されたカーネルメモリダンプの解析にはそのまま適応できません。
上の実行結果内には、異なる値を持つ3種類の「Flags」が含まれています。「Flags」値はJobオブジェクトの基本的な性質を示し、次のような「!job」コマンドで確認することができます。
1: kd> !job 0xffffdb8cc9858350 f
Job at ffffdb8cc9858350
Basic Accounting Information
TotalUserTime: 0x0
TotalKernelTime: 0x0
TotalCycleTime: 0x0
ThisPeriodTotalUserTime: 0x0
ThisPeriodTotalKernelTime: 0x0
TotalPageFaultCount: 0x0
TotalProcesses: 0x1
ActiveProcesses: 0x1
FreezeCount: 0
BackgroundCount: 0
TotalTerminatedProcesses: 0x0
PeakJobMemoryUsed: 0x18726
PeakProcessMemoryUsed: 0x18726
Job Flags
[UI limits]
Limit Information (LimitFlags: 0x2108)
Limit Information (EffectiveLimitFlags: 0x2108)
JOB_OBJECT_LIMIT_ACTIVE_PROCESS: 0x1
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
JOB_OBJECT_LIMIT_PROCESS_MEMORY: 0x100000
Processes assigned to this job:
PROCESS ffffdb8ccdc0a080
SessionId: 1 Cid: 1ac0 Peb: e0b069e000 ParentCid: 1ee8
DirBase: b3d0b000 ObjectTable: ffff918513726a80 HandleCount: 382.
Image: chrome.exe
Child jobs:
1: kd> !job 0xffffdb8ccdafd890 f
Job at ffffdb8ccdafd890
Basic Accounting Information
TotalUserTime: 0x0
TotalKernelTime: 0x0
TotalCycleTime: 0x0
ThisPeriodTotalUserTime: 0x0
ThisPeriodTotalKernelTime: 0x0
TotalPageFaultCount: 0x0
TotalProcesses: 0x1
ActiveProcesses: 0x1
FreezeCount: 1
BackgroundCount: 0
TotalTerminatedProcesses: 0x0
PeakJobMemoryUsed: 0x1bf6
PeakProcessMemoryUsed: 0x1bf6
Job Flags
[frozen]
[wake notification allocated]
[wake notification enabled]
[timers virtualized]
[job swapped]
Limit Information (LimitFlags: 0x0)
Limit Information (EffectiveLimitFlags: 0x3800)
Processes assigned to this job:
PROCESS ffffdb8cccd23640
SessionId: 1 Cid: 080c Peb: bc33151000 ParentCid: 0318
DeepFreeze
DirBase: 10f58a000 ObjectTable: ffff918512b1e3c0 HandleCount: 1131.
Image: MicrosoftEdge.exe
Child jobs:
1: kd> !job 0xffffdb8cce4f84f0 f
Job at ffffdb8cce4f84f0
Basic Accounting Information
TotalUserTime: 0x0
TotalKernelTime: 0x0
TotalCycleTime: 0x0
ThisPeriodTotalUserTime: 0x0
ThisPeriodTotalKernelTime: 0x0
TotalPageFaultCount: 0x0
TotalProcesses: 0x1
ActiveProcesses: 0x1
FreezeCount: 1
BackgroundCount: 0
TotalTerminatedProcesses: 0x0
PeakJobMemoryUsed: 0x5132
PeakProcessMemoryUsed: 0x5132
Job Flags
[wake notification enabled]
[timers virtualized]
Limit Information (LimitFlags: 0x100)
Limit Information (EffectiveLimitFlags: 0x3900)
JOB_OBJECT_LIMIT_PROCESS_MEMORY: 0x100000
Processes assigned to this job:
PROCESS ffffdb8ccddd8080
SessionId: 1 Cid: 1d5c Peb: 70e390f000 ParentCid: 0318
DeepFreeze
DirBase: 38993000 ObjectTable: ffff918511944600 HandleCount: 1106.
Image: MicrosoftEdgeCP.exe
Child jobs:
機能強化されたJobオブジェクトはプロセスの動作制御やセキュリティー向上をはじめとするWindows搭載デバイスを使用する上で重要な役割を担っています。赤色の情報を見ると、Google ChromeはUser Interface (UI)を制限するとともに、プロセス内部から新規に起動できるプロセスの数を制限していることが分かります。一方、MicrosoftのEdgeは特別なUI制限を設定せず、何らかのチェックをダイナミックに行っていることを示唆しています。「Flags」値は、2つのブラウザの設計思想の違いを示してくれています。また、2つのブラウザが起動されていますが、ダンプ採取時には、Microsoft Edgeではなく、Google Chromeが使われていることなども分かります。
Windows 10では、ビルド番号が上がるにつれ「svchost.exe」プロセスの数を大幅に増やしています。次に示す情報は「svchost.exe」プロセスとJobオブジェクトの関係を示しています。72個ある「svchost.exe」プロセスのほとんどはJobオブジェクトの制御下に置かれています。
[---]
+046: 0xffffdb8ccc66d640 EJob->0xffffdb8ccc69a060 Flags->01841000 ID->0760 svchost.exe
+047: 0xffffdb8ccc660080 EJob->0xffffdb8ccc69b060 Flags->01841000 ID->0768 svchost.exe
+048: 0xffffdb8ccc7df080 EJob->0xffffdb8ccae2c890 Flags->01841000 ID->0880 svchost.exe
+049: 0xffffdb8ccc88c080 EJob->0xffffdb8ccc8a0890 Flags->01841000 ID->0944 svchost.exe
+050: 0xffffdb8ccc8c7080 EJob->0xffffdb8ccc91e890 Flags->01841000 ID->0912 svchost.exe
+051: 0xffffdb8cccc75640 EJob->0xffffdb8cccc73890 Flags->01841000 ID->0968 svchost.exe
+052: 0xffffdb8cca222080 EJob->0xffffdb8cca84e890 Flags->01841000 ID->1008 svchost.exe
+053: 0xffffdb8cce5d5640 EJob->0xffffdb8cce5f1890 Flags->01841000 ID->0600 svchost.exe
+054: 0xffffdb8cc912b640 EJob->0xffffdb8cca756890 Flags->01841000 ID->0868 svchost.exe
+055: 0xffffdb8cc92e53c0 EJob->0xffffdb8cc982d430 Flags->01841000 ID->1092 svchost.exe
+056: 0xffffdb8cc951e080 EJob->0xffffdb8ccbbac060 Flags->01841000 ID->1168 svchost.exe
+057: 0xffffdb8cc959c640 EJob->0xffffdb8cc9591890 Flags->01841000 ID->1184 svchost.exe
+058: 0xffffdb8cc96dd640 EJob->0xffffdb8cc96ee060 Flags->01841000 ID->1312 svchost.exe
+059: 0xffffdb8cca8f9640 EJob->0xffffdb8cca09a060 Flags->01841000 ID->1388 svchost.exe
+060: 0xffffdb8cca0e5640 EJob->0xffffdb8cc973a890 Flags->01841000 ID->1412 svchost.exe
+061: 0xffffdb8cc9db8640 EJob->0xffffdb8ccc86f470 Flags->01841000 ID->0844 svchost.exe
+062: 0xffffdb8ccc2f8080 EJob->0xffffdb8cccee0060 Flags->01841000 ID->0184 svchost.exe
+063: 0xffffdb8cc987c640 EJob->0xffffdb8ccc5a8890 Flags->01841000 ID->1936 svchost.exe
+064: 0xffffdb8ccddc3080 EJob->0xffffdb8ccd107890 Flags->01841000 ID->1056 svchost.exe
+065: 0xffffdb8cca671640 EJob->0xffffdb8cc9cc7890 Flags->01841000 ID->1328 svchost.exe
-005: 0xffffdb8ccd4ca640 EJobNotFound Flags->01841000 svchost.exe
+066: 0xffffdb8ccbb67640 EJob->0xffffdb8cccd02200 Flags->01841000 ID->0204 svchost.exe
+067: 0xffffdb8ccd1b2500 EJob->0xffffdb8cc9fc1890 Flags->01841000 ID->1760 svchost.exe
Jobs->067 NoneJobs->005
Jobオブジェクトはプロセス制御とセキュリティ確保の面で大変強力なメカニズムであり、今後さらに発展する可能性を示唆しています。この強力なJobオブジェクトをどのように活用するか?本稿で紹介したいくつかの実行結果を見ると、たとえば、72個の「svchost.exe」プロセスの内の5個は、Jobオブジェクトに組み入れられていません。なぜでしょう?このあたりの背景を解析するコードを独自に作成・実行し、背景を解析してみるのも一興でしょう。穿った見方にはなりますが、新規に導入される強力なシステムメカニズムには、強力であるが故の、"知られざる"、副作用が潜んでいることも否定できません。JobオブジェクトはWindows 10ではSiloやServer Siloと不可分の関係を持つようになりました。この方面の情報は本館の「この記事」で提供しています。