直接カーネルオブジェクト操作(DKOM) は、Microsoft Windowsでよく使われるルートキットの手法で、潜在的に有害なサードパーティのプロセス、ドライバー、ファイル、中間接続をタスク マネージャーやイベント スケジューラから隠蔽します。
DKOM を使用するルートキットは、その核心において、オブジェクトマネージャやタスクマネージャから自身を隠蔽します。すべてのアクティブなスレッドとプロセスのリストを含むリンク リストを変更することで、この種のルートキットは、ポインタをルートキット自体からラップすることで、オブジェクトマネージャからすべての痕跡を実質的に隠蔽できます。これは、カーネル モジュールとロード可能なドライバが特権アクセスからカーネル メモリに直接アクセスできるためです。システムカーネルがシステムで実行されているすべてのプロセスのリストを見つけるために ping を実行すると、EPROCESS に依存してそれらを見つけます。しかし、Windows カーネルはスレッド ベースであり、プロセス ベースではないため、ポインタは意図しない影響なしに自由に変更できます。[ 1 ]リンク リスト ポインタを変更してルートキット プロセス自体をラップすることで、ルートキットは Windows イベント ビューアーやこのリストに依存するシステム整合性アプリケーションから見えなくなります。これにより、DKOM ルートキットはターゲット システムに対して自由に活動できるようになります。
DKOMの使用例[ 2 ]
各プロセスはオブジェクトとして表現され、オペレーティングシステム内で相互に接続されています。各プロセス内には、現在、次、およびmutex_lockedスレッドのアドレスを含む事前割り当て済みの領域があります。この重要な情報は、メモリ内のEPROCESSにリストされています。オブジェクトマネージャのセクションには、実行中のすべての既知のプロセスの二重リンクリストが含まれており、これもEPROCESSとして知られています。ただし、DKOMは、フロントリンク(FLINK)を隠したいプロセッサの前のノードを指すように変更し、隠されたプロセッサのバックリンク(BLINK)を前の構造を指すように変更することで、この構造を利用します。[ 3 ] EPROCESSブロックのサブセクションを変更することで、現在アクティブなプロセスのリストは、隠されたプロセスを指します。これにより、プロセスが隠されているため、特定のプロセスまたはインジェクタの記録がスケジューラの監視から隠されます。ただし、ラウンドロビンポリシーにより、プロセスが存在するスレッドがアクティブであるため、プロセスは無期限に実行されます。[ 2 ]
この種のルートキットの主な問題点は、さまざまなコンテキストスイッチにもかかわらず、隠されたプロセスが依然として実行できることです。[ 3 ] Windows スケジューラでは、スレッドはプロセスではなくタスクを実行するために分離されています。むしろ、スレッドは特定の時間枠内で複数のプロセスを呼び出します。このプロセスはスケジューラのラウンドロビン方式によって制御され、他のスレッドがアクティブになるようにスレッドはアイドル状態になります。プロセスがタスクマネージャから見えなくなっても、スレッドがアクティブであるため、プロセスはシステムと同時に実行されます。[ 4 ] このため、ルートキットによって作成された隠されたプロセスを検出することは非常に困難です。
ルートキットの検出は、整合性チェックや動作検出など、多くの複雑なレイヤーに分かれています。CPU使用率、進行中および送信中のネットワーク トラフィック、またはドライバのシグネチャをチェックすることで、単純なアンチ ウイルス ツールは一般的なルートキットを検出できます。しかし、カーネル タイプのルートキットの場合はそうではありません。これらのタイプのルートキットはシステム テーブルやイベント ビューアから隠れることができるため、検出するにはフックされた関数を探す必要があります。これは実装が非常に難しいだけでなく、EPROCESS のすべてのノードを反復処理する必要もあります。しかし、悪意のあるプロセスが物理的にハンドラ内に存在していなくても、バックグラウンドでハンドラへの呼び出しが行われます。これらのプロセスはスレッドを指し、ネットワーク接続はプロセスを指し、ドライバはスレッドを指します。DKOM ルートキットが有効であるためには、EPROCESS のすべての参照からその存在を隠す必要があります。[ 5 ]これは、ルートキットが定期的にリンカを更新して、自分自身から離れた方向を指すようにする必要があることを意味します。スケジューラ内の各エンティティ(スレッド、オブジェクトヘッダーなど)を反復処理することで、DKOMルートキットを検出することが可能です。スケジューラには特定のメモリパターンや動作が現れる可能性があり、それらが発見されれば、実際のルートキットも最終的に発見できます。[ 5 ]