RootkitRevealer

作成者: Bryce Cogswell、Mark Russinovich

概要

RootkitRevealer は、高度なルートキット検出ユーティリティです。Windows NT 4.0 以降のオペレーティング システムで実行でき、出力には、ユーザー モードおよびカーネル モードのルートキットの存在を示すレジストリやファイル システムの API における不一致が一覧表示されます。RootkitRevealer は、AFX、Vanquish、HackerDefender など、多数の永続的なルートキットを正常に検出します (ただし、RootkitRevealer は、ファイルやレジストリ キーを隠そうとしない Fu などのルートキットを検出することを目的にはしていません)。RootkitRevealer を使用してルートキットの有無を特定する場合は、お知らせください。

コマンド ライン バージョンを公開しなくなった理由は、マルウェア作成者が RootkitRevealer の実行可能ファイル名を利用して RootkitRevealer のスキャンを標的にするようになったためです。このため、RootkitRevealer を更新して、Windows サービスを実行するランダムな名前の RootkitRevealer のコピーからスキャンを実行するようにしました。このような実行方法は、コマンド ライン インターフェイスに適していません。ただし、コマンド ライン オプションを使用して、結果がファイルにログ記録される自動スキャンを実行できます。この機能は、コマンド ライン バージョンの動作に相当します。

ページのトップへ

ルートキットとは

ルートキットという用語は、ウイルス、スパイウェア、トロイの木馬などのマルウェアが、スパイウェア ブロッカー、ウイルス対策ソフトウェア、およびシステム管理ユーティリティからマルウェアの存在を隠すために使用するメカニズムや技術を示すのに使用されます。マルウェアが再起動後も有効かどうか、およびユーザー モードとカーネル モードのどちらで実行されるかによって、ルートキットはいくつかに分類されます。

永続的なルートキット
永続的なルートキットは、システムが起動するたびに有効になるマルウェアに関連したルートキットです。このようなマルウェアは、システムの起動時やユーザーのログイン時に毎回自動的に実行される必要があるので、レジストリ、ファイル システムなどの永続的なストアにコードを格納し、ユーザーが操作しなくてもコードが実行される方法を構成する必要があります。

メモリ ベースのルートキット
メモリ ベースのルートキットは、永続的なコードがないので再起動すると無効になるマルウェアです。

ユーザー モードのルートキット
ルートキットでは、検出を回避するために、さまざまな方法が使用されています。たとえば、ユーザー モードのルートキットでは、Windows の FindFirstFile API または FindNextFile API に対するすべての呼び出しをインターセプトする場合があります。これらの API は、エクスプローラー、コマンド プロンプトなどのファイル システム参照ユーティリティでファイル システム ディレクトリの内容を列挙するために使用されます。アプリケーションでディレクトリを一覧表示するとルートキットに関連付けられたファイルを特定するエントリが含まれた結果が返される場合、ルートキットでは出力をインターセプトして変更し、そのエントリを削除します。

Windows のネイティブ API は、ユーザー モードのクライアントとカーネル モードのサービス間のインターフェイスとして機能するので、さらに高度なユーザー モードのルートキットでは、ネイティブ API のファイル システム、レジストリ、およびプロセス列挙機能をインターセプトします。このため、Windows API の列挙の結果をネイティブ API の列挙によって返された結果と比較する検索プログラムでは、このようなルートキットが検出されません。

カーネル モードのルートキット
カーネル モードのルートキットは、カーネル モードのネイティブ API をインターセプトできるだけではなくカーネル モードのデータ構造を直接操作することもできるので、さらに強力です。マルウェア プロセスの存在を隠す一般的な手法は、カーネルのアクティブなプロセスの一覧からプロセスを削除することです。プロセス管理 API はこの一覧の内容に依存しているので、マルウェア プロセスはタスク マネージャーや Process Explorer などのプロセス管理ツールに表示されません。

ページのトップへ

RootkitRevealer のしくみ

永続的なルートキットは、API を使用したシステムの表示がストレージの実際の表示と異なるよう API の結果を変更することで機能しているので、RootkitRevealer では概要レベルのシステムのスキャン結果を詳細レベルのスキャン結果と比較します。概要レベルは Windows API、詳細レベルはファイル システムまたはレジストリ ハイブを直接読み取った内容です (ハイブ ファイルは、ディスクでのレジストリの格納形式です)。したがって、ユーザー モードのルートキットでもカーネル モードのルートキットでも、Windows API またはネイティブ API を操作してディレクトリ一覧から自己の存在を削除するルートキットは、RootkitRevealer では、Windows API によって返される情報と、FAT または NTFS ボリュームのファイル システム構造を直接スキャンすることで確認された情報の不一致により認識されます。

ルートキットが RootkitRevealer から隠される可能性
理論上は、ルートキットを RootkitRevealer から隠すことができます。そのためには、レジストリ ハイブ データやファイル システム データに対する RootkitRevealer の読み取りをインターセプトし、このデータの内容を変更してルートキットのレジストリ データやファイルが存在しないようにする必要があります。ただし、この処理には、これまでのルートキットには備わっていないレベルの高度な技術が必要です。データを変更するには、NTFS 、FAT、およびレジストリ ハイブの各形式に関する詳しい知識に加え、データ構造を変更してルートキットを隠しながらも、RootkitRevealer によって判定されることのある整合性がない構造、無効な構造、または二次的な不一致を引き起こさない技能の両方が必要です。

ルートキットの存在を検出する確実な方法
一般的に、実行中のシステム内で実行する場合、確実な方法はありません。カーネル モードのルートキットはシステムの機能のあらゆる側面を制御できるので、RootkitRevealer によるレジストリ ハイブやファイル システム データの直接的な読み取りを含め、あらゆる API から返される情報が侵害されるおそれがあります。システムのオンライン スキャンと、安全な環境 (CD ベースのオペレーティング システム インストールを起動するなど) のオフライン スキャンを比較すると信頼性が向上しますが、ルートキットではこのようなツールを標的にして、これらのツールでも検出されないようにできます。

結論としては、万能のルートキット検索プログラムは決して存在しないでしょうが、ウイルス対策ソフトウェアと統合されてオンラインとオフラインの比較を行う検索プログラムが最も強力な検索プログラムと言えます。

ページのトップへ

RootkitRevealer の使用

RootkitRevealer では、実行するアカウントによって、"ファイルとディレクトリのバックアップ"、"デバイス ドライバーのロードとアンロード"、および "ボリュームの保守タスクを実行" (Windows XP 以降) の各特権が割り当てられている必要があります。Administrators グループには、これらの特権が既定で割り当てられています。誤検知を抑えるため、アイドル状態のシステムで RootkitRevealer を実行します。

適切な結果を得るために、すべてのアプリケーションを終了し、RootkitRevealer のスキャン処理中はシステムのアイドル状態を維持してください。

ご質問や問題がある場合は、Sysinternals RootkitRevealer フォーラム (英語) にアクセスしてください。

ページのトップへ

手動スキャン

システムをスキャンするには、システムで RootkitRevealer を起動し、[Scan] ボタンをクリックします。RootkitRevealer によってシステムがスキャンされます。ウィンドウの下部のステータス領域で処理内容が報告され、出力の一覧に不一致が表示されます。構成できるオプションは次のとおりです。

  • Hide standard NTFS Metadata files: このオプションは既定で有効になっています。Windows API から隠されている標準的な NTFS メタデータ ファイルが RootkitRevealer で表示されないようにします。
  • Scan Registry: このオプションは既定で有効になっています。このオプションを無効にすると、RootkitRevealer でレジストリがスキャンされなくなります。

ページのトップへ

自動スキャンの起動

RootkitRevealer では、次のように、システムを自動スキャンするためのオプションをいくつかサポートしています。

使用法: rootkitrevealer [-a [-c] [-m] [-r] <outputfile>]

-a

自動的にスキャンし、スキャンの完了時に終了します。

-c

出力を CSV 形式にします。

-m

NTFS メタデータ ファイルを表示します。

-r

レジストリをスキャンしません。

ファイルの出力場所は、ローカル ボリューム上にある必要があります。

-c オプションを指定すると、進捗状況が表示されず、データベースに簡単にインポートできるように不一致が CSV ファイルに書き込まれます。次のようなコマンド ラインを使用して、Sysinternals PsExec ユーティリティと組み合わせて RootkitRevealer を実行すると、リモート システムをスキャンできます。

psexec \\remote -c rootkitrevealer.exe -a c:\windows\system32\rootkit.log

ページのトップへ

出力の解釈

よく知られている HackerDefender ルートキットの存在を検出している RootkitRevealer のスクリーンショットを以下に示します。レジストリ キーの不一致は、HackerDefender のデバイス ドライバーとサービス設定が格納されたレジストリ キーが Windows API に公開されていないのに、レジストリ ハイブ データを直接スキャンすると存在していることを示しています。同様に、HackerDefender に関連付けられたファイルは Windows API ディレクトリのスキャンでは検出されませんが、ファイル システム データを直接スキャンすると存在しています。

すべての不一致を調べて、ルートキットの存在が示されている可能性を特定してください。残念ながら、出力に基づいている場合、ルートキットが存在するかどうかを特定する決定的な方法はありません。しかし、すべての報告された不一致を調べて、説明できる不一致かどうかを確認してください。ルートキットがインストールされていることが判明した場合は、削除の手順を Web で検索します。ルートキットの削除方法がわからない場合は、システムのハード ディスクを再フォーマットして Windows をインストールしてください。

以下の RootkitRevealer の不一致に関する情報以外にも、Sysinternals の RootkitRevealer フォーラムでは、検出されたルートキットや具体的な誤検知について意見が交換されています。

ページのトップへ

Hidden from Windows API.

このような不一致は、ほとんどのルートキットで見られます。ただし、[Hide standard NTFS Metadata files] の隣にチェック マークが表示されていない場合は、すべての NTFS ボリュームに関するエントリが多数表示されます。これは、NTFS では $MFT、$Secure などのメタデータ ファイルが Windows API から隠されているためです。NTFS ボリュームに存在するメタデータ ファイルは、ボリュームで有効になっている NTFS のバージョンと NTFS 機能によって異なります。また、Kaspersky Anti-Virus など、ルートキットの手法を使用して、NTFS 代替データ ストリームに格納されているデータを隠すウイルス対策製品もあります。このようなウイルス検索プログラムを実行していると、すべての NTFS ファイル上の代替データ ストリームに対して "Hidden from Windows API." という不一致が表示されます。あらゆるフィルター処理がルートキットによって利用されるおそれがあるので、RootkitRevealer では出力のフィルターをサポートしていません。また、ファイルがスキャン中に削除された場合も、この不一致が表示されることがあります。

Windows Server 2003 の時点で定義されている NTFS メタデータ ファイルの一覧を以下に示します。

  • $AttrDef
  • $BadClus
  • $BadClus:$Bad
  • $BitMap
  • $Boot
  • $LogFile
  • $Mft
  • $MftMirr
  • $Secure
  • $UpCase
  • $Volume
  • $Extend
  • $Extend\$Reparse
  • $Extend\$ObjId
  • $Extend\$UsnJrnl
  • $Extend\$UsnJrnl:$Max
  • $Extend\$Quota

Access is Denied.

RootkitRevealer では、システムのあらゆるファイル、ディレクトリ、またはレジストリ キーにアクセスできるメカニズムを使用しているので、この不一致が報告されることはありません。

Visible in Windows API, directory index, but not in MFT.
Visible in Windows API, but not in MFT or directory index.
Visible in Windows API, MFT, but not in directory index.
Visible in directory index, but not Windows API or MFT.

ファイル システムのスキャンは、Windows API、NTFS マスター ファイル テーブル (MFT)、および NTFS のディスクにおけるディレクトリ インデックス構造の 3 つの要素で構成されています。上に示した不一致は、これらのスキャンの 1 つまたは 2 つだけにファイルが存在していることを示します。一般的な原因は、スキャン中にファイルが作成または削除されたことです。スキャン中に作成されたファイルに対する RootkitRevealer の不一致の報告例を以下に示します。

C:\newfile.txt
2005/3/01 17:26
8 bytes
Visible in Windows API, but not in MFT or directory index.

Windows API length not consistent with raw hive data.

ルートキットは、誤ったレジストリ値のサイズを報告してレジストリの内容が Windows API に認識されないようにすることで、存在を隠そうとする場合があります。このような不一致はすべて調べてください。ただし、スキャン中に変更されたレジストリ値が検出されることもあります。

Type mismatch between Windows API and raw hive data.

レジストリ値には DWORD、REG_SZ などの型があり、この不一致は、Windows API から返された値の型が、ハイブ データから直接返された値の型と異なっていることを示します。ルートキットでは、データを REG_BINARY 値などとして格納し、Windows API には REG_SZ 値だと認識させることでデータをマスクできます。データの先頭に 0 が格納されていると、Windows API は以降のデータにアクセスできません。

Key name contains embedded nulls.

キー名は、Windows API では null で終了する文字列として扱われますが、カーネルでは固定長の文字列として扱われます。このため、オペレーティング システムには公開されていても、Regedit などのレジストリ ツールでは部分的にしか公開されないレジストリ キーを作成できます。Sysinternals の Reghide サンプル コードは、この作成方法を示しています。この手法は、レジストリ データを隠すためにマルウェアでもルートキットでも使用されています。null が埋め込まれたキーを削除するには、Sysinternals Regdellnull (英語) ユーティリティを使用します。

Data mismatch between Windows API and raw hive data.

レジストリのスキャン中にレジストリ値が更新されると、この不一致が発生します。頻繁に変更される値には、Microsoft SQL Server の稼働時間の値 (次の例参照)、ウイルス検索プログラムの "前回のスキャン" の値が挙げられます。報告された値をすべて調査して、正当なアプリケーションやシステムのレジストリ値であることを確認してください。

HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\RECOVERYMANAGER\MSSQLServer\uptime_time_utc
2005/3/01 16:33
8 bytes

ページのトップへ

ルートキットの関連情報

ルートキットの詳細については、以下の Web サイトおよび書籍を参照してください。

Understanding and Fighting Malware: Viruses, Spyware and Rootkits (Level 300) (英語)
Mark による Microsoft TechEd 2005 の Web セミナーでは、ウイルス、スパイウェア、およびルートキットを取り上げています。

Sony によるルートキットとデジタル著作権管理の乱用 (英語)
Mark が自分のコンピューターで Sony のルートキットを発見して解析したことに関する Mark のブログ記事をご覧ください。

Unearthing Rootkits (英語)外部サイトへ
Mark が執筆した『Windows IT Pro Magazine』の 6 月号の記事では、ルートキットの手法と RootkitRevealer のしくみを概説します。

Rootkits: Subverting the Windows Kernel (英語)外部サイトへ
Greg Hoglund と Jamie Butler によるこの書籍は、現時点で最も包括的にルートキットを取り上げています。

www.phrack.org (英語)外部サイトへ
このサイトには、『Phrack』のバックナンバーが保存されています。『Phrack』はクラッカー向けの雑誌で、開発者がセキュリティ関連製品の欠陥、ルートキットの手法、およびその他のマルウェアの技法について説明しています。

research.microsoft.com/rootkit/ (英語)外部サイトへ
Microsoft Research のルートキットに関するホーム ページです。ルートキットに対処するためのマイクロソフトの取り組みに関するドキュメントと情報を公開しています。

The Art of Computer Virus Research and Defense (英語)外部サイトへ、Peter Szor 著

Malware: Fighting Malicious Code (英語)外部サイトへ、Ed Skoudis および Lenny Zeltser 著

『インサイド Microsoft Windows 第4版』(上下)、Mark Russinovich および Dave Solomon 著 (ルートキットについて説明している書籍ではありませんが、Windows のアーキテクチャを理解するとルートキットを理解しやすくなります。)


RootkitRevealer のダウンロード

(231 KB)

 

Live.Sysinternals.com から直接 RootkitRevealer を実行する

ページのトップへ

トピック

  • 概要
  • ルートキットとは
  • RootkitRevealer のしくみ
  • RootkitRevealer の使用
  • 手動スキャン
  • 自動スキャンの起動
  • 出力の解釈
  • Hidden from Windows API.
  • ルートキットの関連情報

ダウンロード


RootkitRevealer のダウンロード

(231 KB)

 

Live.Sysinternals.com から直接 RootkitRevealer を実行する

動作環境:

  • クライアント: Windows XP (32 ビット)
  • サーバー: Windows Server 2003 (32 ビット)