McAfee Avert Labs Blog
「Exploring StealthMBR Defenses」より
March 23, 2008 Posted by Aditya Kapoor, Rachit Mathur

 以前に執筆した記事で約束した通り,今回はルートキット「StealthMBR」(関連記事:MBR感染機能付きルートキット「StealthMBR」--古い瓶に詰めた新しいワイン)で用いられているいくつかの興味深いテクニックと,その背後にある目的を検討する。ここで紹介する新しい亜種は,カーネル・レベルで広範な防衛策を実装しており,その何層にもわたる防御を見る限り,組織化され,技術力のあるカーネル・コードの開発者(集団)が,一定の品質を保ちながらも非合法に報酬を得ているようだ。StealthMBRは,かつての「BootRoot」のテクニックを受け継いでいるものの,その防御手法は刻々と進化している。

 StealthMBRは,我々がこれまで目にしたカーネル・モードのルートキットの中でも特異な存在だ。その理由は,MBRの内容を上書きするのみならず,さまざまな自己防衛策を導入しており,いったんシステムの制御権を得ると,自らが検出/削除されるのを阻止するからだ。

 StealthMBRの自己防衛策と目的は次のようなものがある。

(1)「\\driver\Disk」のI/O要求パケット(IRP)ディスパッチ・テーブルをフックする

目的:これは,カーネルにおける最も低レベルのフックの一つだ。「IRP_MJ_READ」および「IRP_MJ_WRITE」にフックを設け,MBRにアクセスを試みようとするアプリケーションの読み取り/書き込み許可を拒否する。

(2)\\driver\DiskのIRPディスパッチ・テーブルをダミーでフックする

目的:おそらく同一範囲内におけるすべてのフックを確保する目的で,ダミーのフックを別に作成している。これにより,すべての有効なフックがデバイスの同じオブジェクト範囲内にあるかどうかチェックするアンチルートキット・ツールは,だまされる可能性がある。

(3)\\driver\CDRomのIRPディスパッチ・テーブルをフックする

目的:IRPディスパッチ・テーブルにおける,ハード・ディスクとCD-ROMのポインタは同じ場所を指すため,StealthMBRではCR-ROMのIRPテーブルをフックして,このフックに対応するハード・ディスクのディスパッチ・ルーチンと同じ場所を指すようハード・ディスクとCD-ROMのポインタを変更する。このテーブルにパッチが当てられていない場合,アンチウイルス(AV)ツールによっては,これら二つのポインタを比べて矛盾を発見するとフラグを立てる。また,ハード・ディスクのIRPディスパッチ・テーブルで元のポインタを復元することにも用いられる。

(4)classpnp.sys!ClassInitialize関数にパッチを当てる

目的:ClassInitialize関数は,ClassPNP.sysドライバのエクスポート関数で,元々のIRPディスパッチ・テーブルのさまざまなポインタ・ロケーションを参照する(図1)。この点を把握しているAVツールは,二つのポインタを比較して,矛盾を発見した場合はフラグを立てる。また,また,ハード・ディスクのIRPディスパッチ・テーブルで元のポインタを復元することにも用いられる。

図1 ClassInitialize関数を実行した結果 赤色で強調表示したのが元のアドレスで,これらはルートキットによってパッチが当てられる。
図1 ClassInitialize関数を実行した結果 赤色で強調表示したのが元のアドレスで,これらはルートキットによってパッチが当てられる。

(5)「ウォッチャ」スレッドを作成する

目的:これは同マルウエアの第2の防御策,すなわちフェイルセーフ手段である。元のポインタが既知のもので,AVツールなどがフックの復元を試みた場合(MBRを書き戻すのに必要な最初のステップ)でも,マルウエア本体が削除されるのを防ぐ。このスレッドでは,元のIRP_MJ_READ/WRITEフックを復元しようとする試みを継続的に監視する。これらのフックが変更された場合,スレッドでは,以下の四つの処理をこの順番で実行する。

(a)ディスパッチ・ルーチンIRP_MJ_READおよび同IRP_MJ_WRITEを復元し,自らのルーチンを指定する
(b)0番セクターのMBRを書き換える
(c)60番セクターと61番セクターにあるルートキットのロード用コード,および62番セクターの元のMBRコードを書き換える
(d)ハード・ディスクの後方セクターにある,ルートキット・モジュール全体を書き換える

(6) ハード・ディスクのセクター書き込みアクセスを命じる

目的:ほぼ1カ月の間に,StealthMBRはMBRへの書き込みルーチンを改変している。MBRへの書き込みにユーザー・モードAPIを使わず,IoBuildSynchronousFsdRequest APIを呼び出しており,\\driver\diskのIRP_MJ_WRITEを利用してハード・ディスクの複数のセクターに直接書き込むようになっている。この改変で考えられる目的は,やはり侵入検出ツールの検知を逃れることだ。

 以下のコード[図2]はウォッチャ・スレッドの一部で,ここではIRP_MJ_READ/WRITEの値が,EDIレジスタの値と同じかどうかチェックしている。値が変更された場合,上記の(5)で説明した通り,手順(a)~(d)を実行する。以下のコードは,注目すべき箇所に注釈が付いており,見ればすぐ分かるようになっている。ルートキットのWriteToDisk関数を3回呼び出し,さまざまな感染を復元する点に注意してほしい。

図2 StealhMBRの「ウォッチャ」スレッドに関する注釈付きコード
図2 StealhMBRの「ウォッチャ」スレッドに関する注釈付きコード

米マカフィーの利用者へ

 マカフィーでは,この脅威を定義ファイル(DAT)「5256」で,「Generic Packed.g」「StealthMBR」として検出している。さらにメモリー内のフックは,最新のベータ版DATでは「StealthMBR!rootkit*」として検出し,DATファイル「5258」で対応する。つまり,DATを最新のものにアップデートすれば,これまで例を見ない今回のステルス・ルートキットから引き続き保護される。

結論:

 我々はこのマルウエアが,最新の亜種が出てからもかなり改変されていることを確認しており,同マルウエアの作者はコードの変更を重ねて,AVベンダーと力の戦いに挑んでいるようだ。これらの脅威については今後も監視を重ね,最新の状況を伝えていくつもりだ。

 注:メモリー内のルートキットの検出と修復は,以下の「VirusScan」製品でのみ対応している。今回のようなステルス型のマルウエアからうまく身を守るためにも,これらの対象製品にアップグレードしてほしい。

「VirusScan Enterprise」(バージョン8.5)
「VirusScan Online 」(バージョン11.2以降)


Copyrights (C) 2008 McAfee, Inc. All rights reserved.
本記事の内容は執筆時点のものであり,含まれている情報やリンクの正確性,完全性,妥当性について保証するものではありません。
◆この記事は,マカフィーの許可を得て,米国のセキュリティ・ラボであるMcAfee Avert Labsの研究員が執筆するブログMcAfee Avert Labs Blogの記事を抜粋して日本語化したものです。
オリジナルの記事は,「Exploring StealthMBR Defenses」でお読みいただけます。