Rootkitsといかに戦うか

この記事は、Kaspersky Labの"Rootkits and how to combat them"のう ち「Windows Rootkits」を中心にした和訳です。

§1.はじめに

ウィルス製作者によって直面させられている最大の難問の一つは隠蔽された悪意あるコードが汚染させられたPCユーザに保持し続けられていることである。 ウィルス製作者の理想世界では、悪意あるコードはウィルス対策ソフトのようなものに検出されてはならない。製作された悪意あるコードは愉快犯的な私的喜び を少くすると共に、犯罪としてのビジネスの有益性を増加させる。彼らのトラックを隠蔽することは金銭目当てに仕事するハッカーにとってますます重要になっ ている。銀行のアカウントの詳細を盗むためや、PCの所有者の認識無しにスパムを送るためのプロキシサーバーをインストールするために仕込んだプログラム をどのように隠せばいいのか?

現代のサイバー犯罪は10〜15年前のサイバー破壊によって使用されたアプローチを取っている。PC用既知の最初のウィルスの一つは Virus.Boot.Brain.aである。このブートセクター ウィルスはシステム関数のディスクへのアクセスを横取りした。ブートセクターが読み込まれたとき(例えば、ウィルス対策プログラムによって)、ウィルスは 感染したデータをオリジナルのクリーンなデータに置き換える。このようなステルス メカニズム(システム関数の横取りし、データを置き換えて返す)は以来Windowsウィルス(Virus.Win32.Cabanas.a)で使用され 続けている

今日まで、UNIX用の悪意あるプログラムはDOSやWindows環境のように広く拡散していない。"Rootkit"という用語はUNIX世界で創造 された。しかし、今日"Rootkit"と言う言葉はWindows用トロイの木馬の製作者によってステルステクノロジに利用するためにるしばしば使用さ れる。まず、"Rootkit"はハッカーが検出の回避を可能にするためのプログラムのコレクションを意味した。検出回避を実行するために、実行可能なシ ステム ファイル(login, ps, ls, netstat 等)やシステム ライブラリ(libproc.a)は置き換えられた。あるいは、カーネル モジュールがインストールされた。二つのアクションは同じ目的(コンピュータ上で起っていることについてユーザが正確な情報を受け取ることを妨げる)を 持っている。

下図に示すように、Rootkitsは感染させられたシステム上の悪意あるコードの存在を隠蔽するために幅広く使用されるようになってきている。

マルウェアでの Rootkit使用の増加

Rootkit人気の増大は部分的には多くのRootkitのソースコードが今インターネット上でオープンに利用可能であるという事実に負うものである。 ウィルス製作者がそのようなコードに多少の修正を加えることは比較的に容易である。Rootkitsの使用の増加に影響している他の因子は、大多数の Windowsユーザが個別のユーザアカウントを作成するより、むしろ管理者権限を使用しているという事実である。これは生贄のマシン上に Rootkitsをインストールすることを大変容易にする。

Rootkitsがユーザとアンチウィルスソリューションの両方から悪意あるコードの存在をマスクするために使用できるという事実は、ウィルス製作者や合 法的であるかのようなスパイウェア開発者によってユニークなセールスポイントとして理解されている。

Windows Rootkits、UNIX Rootkits で検索すればより詳しい情報が得られるだろう。

§2.Windows Rootkits

2-1.マスキング方法

現在、Rootkitsはシステム中のそれらの存在をマスクするために二つの方法を用いている。

  • パスの改竄
  • システム構造の修正

このような手法はネットワーク アクティビティ、レジストリキー、プロセス等、悪意あるプログラムがシステム中でアクティブである事実をユーザに警告するあらゆるものをマスクするために 使用される。

パスの改竄による方法は、ユーザモードRootkitsでもカーネルモードRootkitsでも使用される。ユーザモードRootkitsでの実現は比較 的容易である。たいていはフッキング用API関数(データを横取りするためのAPI関数)を基本とする方法が実行可能パスの改竄に使用される。

Hooking API functions

    *****************************<メッセージフック余談>********************
    未だCPUがIntel486だった頃、TrueSpace(三次元グラフィックソフト)のデモ(フロッピーディスク1枚)を入手しました。 このデモ版はIntel586以上でなければ動作しない設定になっていました。最初にユーザのシステムをチェックするのです。そこで、フッキング用API 関数を使用した簡単なプログラムを作成しました。このプログラム(通常スパイと呼びます)を起動しておくと、他のプログラムとWindowsの間の遣り取 り(データの受け渡し)は全てスパイを通るようになります。そして、CPUデータの問い合わせに対するWindowsの返信をIntel586に変更する のです(実際はIntel486)。結果、システムチェックは誤魔化されこのデモ版は動作しました。
    *************************************************************************

この方法はAPI関数が、特別なデータフィールド(入出力テーブル)を使用しているアプリケーションやGetProcAddress APIを使用するこ とで取得されるアドレスにコンタクトすることで呼び出されるという事実を利用している。プログラムコードはDLLモジュール中で実現される。それから、プ ログラムコードは実在のシステムプロセスのアドレス空間に統合される。全てのユーザアプリケーションを制御する能力を遠隔地にいる悪意あるユーザに与える ために。パスの改竄方法は沢山の記録があるし、容易な実現のアプローチであり、Rootkitsの使用を単純化する。

けれども、そのようなアプローチはユーザーモードRootkitsによって利用される他のアプローチとともに多くの利点を提供するが、そこには重要な欠点 もある。Rootkitsは活動を隠蔽するが、それは公平に非効果的にもする。これはRootKit RevealerやSoftIce等のようなユーティリティが稼動しているシステム中ではユーザーモードRootkitsは容易に検出されることを意味し ている。このことが、開発することが寄り困難であるにもかかわらず、カーネルモードRootkitsがより人気を博す偽りのない理由である。

カーネルモードRootkitsは情報を隠蔽するためのより良いものであることは疑いない。カーネルモードRootkitsの大半は公開されていないOS 構造物を利用する。例えば、そのようなRootkitsはしばしばKeServiceDescriptorTableサービスをフックする。このテーブル のサービスの多くはOSのバージョンに対応して変更できる。このことはテーブル中のRootkits開発者がテーブル中のインデクスのハンドラを発見する ためにOSコードの更なる解析を処理しなければならないことを意味している。 このアプローチはAPI関数をフックすることと大変類似している。

PsActiveProcessListの改竄は二つ目のアプローチ、即ちシステム構造の変更、の一つの例である。このアプローチはFU Rootkitによって使用されている。FU Rootkitは使用している主なシステムユーティリティを検出され、視認されることからあらゆるプロセスを隠蔽することを可能にする。

Rootkits起動前 のプロセスリスト

Rootkits起動後 のプロセスリスト

「Rootkits起動前のプロセスリスト」の図で、NotepadはNotepad.exeとしてアクティブなプロセスリスト中に存在している。 「Rootkits起動後のプロセスリスト」の図はFU rootkitがプロセスを隠すためのコマンドで起動された後に取得されたスクリーンショットである。このスクリーンショットはアクティブである編集プロ グラムさえ、その名前がアクティブなプロセスリストから失われている。

2-2.ルートキットの検出

Rootkitsとの戦いの第一段階はそれらを検出することである。Rootkit製作者は常にRootkit検出ツールに一歩先んじる能力(恒常的に開 発されている新しいテクノロジとか)を持っている。アンチウィルスソフトウェア開発者はこれらテクノロジの解析と検出ツールの開発に時間を必要とする。し かしながら、Rootkitsの複雑さにもかかわらず Kaspersky Lab version 6 はRootkitsの効果的検出を内包している(Kaspersky Lab version 6 は現在テスト中である)。私たちの製品は上述したFU Rootkitsにどのように反応するのだろうか?

繰り返すと、Rootkitsのインストレーションはシステムプロセスを隠すこととなる。アンチRootkitsサブシステムはこれを検出し、ユーザに警 告を表示する。図(未知の隠されたプロセスの検出)参照。

未知の隠されたプロセス の検出

このサブシステムは既に加えられたアンチウィルス データベース アップデートのRootkitsだけでなく、下図(他プロセスへのコードの注入の検出)に示したように未知のRootkitsも検出することが可能であ る。

ユーザモードRootkitsを検出するために使用される類似のサブシステムも存在する(これに関しては先述した)。そしてそれは、DLLを他のプロセス に注入する。

そのような場合、サブシステムは特定のプロセスがコードを他のプロセスに注入しようとしていることをユーザ警告として知らせる

他プロセスへのコードの 注入の検出

§3.結論

アクティブなRootkitsの全ての検出方法は、Rootkitsがなんとかしてシステム関数を破壊する事実に依存する。Kaspersky Lab製品はこれを利用している。そして、これらの製品は未知のRootkitsを検出することも可能である。このことはWindowsの将来バージョン でRootkitsを記述することをより困難にするだろう。そこではシステムコードやシステムアーキテクチャの改竄は不可能である。一時的にせよ、OS開 発者によって踏まれるこのステップは新バージョンのWindowsに対する新たなRootkitsの数を減少させるだろう。

現在、Windows用の悪意あるコードはWindowsが最も広く使用されているOSであるがためにUNIXのものよりはるかに多い。しかし、UNIX が人気を獲得し始めれば、状況は自然に変化する。UNIX用の新しいRootkitsが記述され、それらに対する新たな戦いの方法が開発されるだろう。

最終的に、Rootkitsに対する最大の防御は「全てのシステムが適切に防御されていることを保証する予防措置をとることである」ことに気づくべきであ る。