■ソニーBMGの音楽CDに含まれていたRootkit(ルートキット)を発見した技術者によるRootkit解説記事の後編。カーネル・モードで動作するRootkitの仕組みや,Rootkitの防御法,Rootkitが仕掛けられた場合にそれを削除する方法などについて説明する。記事で紹介されている「RootkitRevealer」というRootkit検出ツールは,Russinovich氏らが開発したものである。Rootkitに関して不安を感じているユーザーは,試してみてはいかがだろうか(ITpro編集部)。



カーネル・モードのルートキットは低レベルのAPIを横取り
 次にカーネル・モードのルートキットの仕組みを説明したい。より巧妙なルートキットは,「システムコール・フッキング」により,カーネル・モードのAPIをフックしてOSの処理に影響を与える。前述したntdll.dllの関数は,処理をカーネル・モードへ移行させるシステムコール命令を実行できる。これはOSの中のシステムコール・ディスパッチャが行う。システムコールAPIは,内部的に番号で識別される。そのため,ユーザー・モードにおけるネイティブAPI関数は,システムコール・ディスパッチャに対し,カーネル・モードにおける関数を番号で指定している。ディスパッチャはその番号を,システムコール関数へのポインタを格納するテーブルのインデックスとして使用する。そしてDLLインポート・フッキングと同じように,ルートキットはそのテーブル内のポインタを,デバイス・ドライバ内にあるルートキットの関数へのポインタで置き換える。するとユーザー・モード・フッキングのように,データがアプリケーションに返される際にそのデータを操作できるようになる仕組みだ。NT Rootkitはこのシステムコール・フッキングを使うルートキットの例である。また,前述したHacker Defenderが使用する関数の部分修正という手法は,カーネル・モードにおいても使用できる。ただし,今まで公開されたカーネル・モードのルートキットが使ったことはない。

 「カーネル・モード・ルートキット技術」という手法もある。これはルートキット・コミュニティでよく知られるようになったもので,カーネル・オブジェクトを直接操作する仕組みだ。この手法では,カーネルのデータ構造自体を攻撃し,カーネルのデータ構造に関する情報を返すAPIは攻撃しない。例えば,このタイプのルートキットはプロセスを隠すとき,カーネルが保持するアクティブなプロセスのリストからそのプロセスを削除するのである。その結果,NtQuerySystemInformation関数はそのプロセスを報告しなくなる。これはNtQuerySystemInformationが自らの情報を作るとき,カーネルが持つアクティブ・プロセスのリストを利用するためだ。ただし,カーネルはプロセス内で動作するスレッドをスケジュールし続ける。この手法は,デバイス・ドライバ構造を隠すときに利用されてきた。とはいえ,レジストリ・キー,レジストリ値,ファイル,ディレクトリの偽装には適用できない。理由は,これらのオブジェクトが単純な静的構造で維持されていないことだ。直接的なカーネル・オブジェクトの操作で偽装を実現しているルートキットとしては,FUがある。

 3つ目に説明するカーネル・モードのルートキットの手法は,「ファイル・システム・フィルタ・ドライバ」と呼ばれるものに隠ぺい機能を実装するというものだ。ファイル・システム・フィルタ・ドライバは,NTFSのようなファイル・システム・ドライバの上で,かつシステムコールAPIレイヤーの下に位置するプログラムである。これにより,ファイル・システム・フィルタ・ドライバは,すべてのファイル・システムの処理を監視できる。常駐型ウイルス対策ソフトは,この仕組みを使い,ファイルのオープン操作を横取りし,ウイルス・ファイルを検出することで,ウイルスの活動を未然に防いでいる。

 この手法を採用するルートキットの例はNT Rootkitで,ディレクトリ一覧表示処理を横取りし,ファイル・システム・ドライバから返される出力からマルウエアのファイル名を取り除く。その結果,ディレクトリ表示動作を実行するあらゆるプログラムがNT Rootkitの隠ぺい処理を見破れなくなる。ユーザー・モードのWindowsエクスプローラはもちろん,カーネル・モードのドライバも影響を受ける。

実行中の正当なプロセスの中に隠れる場合も
 最後に最も巧妙なルートキットの手口を説明しよう。これは恐らく,正当に動作しているプロセスが使用するメモリーをハイジャックすることだ。この手口は,MicrosoftのInternet Information Services(IIS)に影響を及ぼしたCode Redワームが採用していた。この手口を使うと,タスク・マネージャのようなプロセス表示ツールに対して,わざわざ身を隠す必要がなくなる(訳注:正当なプロセスとしてマルウエアが表示されるため)。しかし,この場合,システムがシャットダウンする前に,マルウエアはディスク上のどこかに自らを保存する必要がある。システムを再起動すれば,マルウエアが消えてしまうからだ。ただし,マルウエア作成者の中には,検出を避けることを優先し,再起動の時点でシステムの制御を失ってもよいと考えるものがいる。