2013年2月13日水曜日

Win32/Gapz:新しいブートキットの手口

  • このエントリーをはてなブックマークに追加
ここ数年で、多くのブートキットが新たに見つかりました。主にWindowsのプラットフォームを狙ったブートキットです。

最も分かりやすい例で云えば「TDL4」や「Olmasco, Rovnix」です。

こうしたブートキットはそれぞれに違った感染経路を持っており、MBR(マスター・ブート・レコード)を不正に改変したり、VBR/IPL(ボリューム・ブート・レコード/イニシャル・プログラム・ローダー)を不正に改変したりしてきます。まとめると下の図のようになります。

ESETセキュリティブログ:ブートキット経路

当ブログでは、比較的最近になって登場したブートキットの新しい手口を紹介したいと思います。

OSローダーが動き出すよりも前にマルウェアを作動させてしまうブートキットで、ほんの数カ所VBRをいじっただけの構造をしています(上に掲載した図の中で、赤く目立たせた「BIOS Parameter Block modification」の部分です)。この全く新しい手口は、Win32/Gapzブートキットに使われていました。


■ Win32/Gapzブートキットの概要

今までのところ、我々は2種類のWin32/Gapzブートキットに関する情報を持っています。2つとも違った手法で被害者のシステムに感染します。

最初に確認したWin32/Gapzブートキットは2012年の初夏に見つかり、MBR感染型でした。

2番目に確認したWin32/GapzブートキットはVBR感染型で、2012年の秋も終わるころに見つけました。

Win32/Gapzは以下のマイクロソフトOSに感染する力を持っています。

x86:Windows XP SP2以上(Window VistaとVista SP1は除く)
x64:Windows Vista SP2以上

ESETセキュリティブログ:Win32/Gapz概要


■ Win32/Gapz:MBR感染型

システムに感染する初期型のブートキットは、2つの部分からできています。

悪意のあるMBR
ユーザーモードのプロセスに感染するカーネルモード・コードとペイロード

カーネルモード・コードとペイロードは、ハードディスクの先端と最後尾に書き込まれています。Rovnixで使われていた手口とすごく似ています。Rovnixと言っても、VBRに感染するタイプを除きます。

Win32/Gapzブートキットが持つ機能は、別に目新しくもありません。悪意あるMBRのコードが実行されると、オリジナルのコードはメモリの中へ引っ込み、ハードディスクから次のレベルのブートキット・コードが読み込まれます。その新たなブートキット・コードはint 13hハンドラーを順次乗っ取ります。結果として、以下のシステム・モジュールのロードが支配下に置かれます。

ntldr
bootmgr
winload.exe

ESETセキュリティブログ:Win32/Gapzモジュールのルーティン


ブートキットはこれらのシステム・モジュールを、特別なバイト・シーケンス(8桁の2進数)で認識します。以下に、ホックされたシステム・モジュール内のプログラムコードを一覧にしておきます。

リストアップされたようなモジュールのうちどれか1つがハードウェアから読み出されたときにマルウェアに見つかると、マルウェアはすぐにパッチしてしまいます。プロセスが保護モードに切り替わった後でも、コントロールができるようにパッチしてしまうのです。

まず、ブートキットはホックをntldrかbootmgrのシステム・モジュールのどちらかに作ります(どちらに作るかはOSによります)。仮にホックがbootmgrの中に作られたとします(Microsoft Vistaかそれ以降のOSの場合)。するとブートキットはさらにwinload.exe内にあるOslArchTransferToKernelのプログラムコードをホックします。

こうしたホックがあるために、カーネル・イメージがロードされた瞬間、マルウェアが起動してしまうのです。

次は、OSカーネルの初期化が行なわれている間に起動するlolnitSystemにホックが作られます。このホックは、ntldrかwinload.exeのどちらかから行なわれます。どちらかになるかはOSのバージョンによります。

ESETセキュリティブログ:Win32/Gapz実行例1


さらに、lolnitSystemのホックが実行されると、マルウェアはパッチした数バイトをカーネル・イメージに移動し、さらにコントロールをオリジナルのlolnitSystemプログラムコードに移します。

コントロールがオリジナルのlolnitSystemプログラムコードに移動する前に、ブートキットはリターンアドレスをチェックします。lolnitSystemの移動が完了した後で悪意あるプログラムコードを実行できるように、ブートキットはどこかのアドレスに格納されます。

この方法を使って、カーネルが初期化された後でも、マルウェアはコントロールを握ってしまうのです。この時点で、ブートキットはカーネルをどうにでもできるようになります。ハードドライブにアクセスしたり、メモリを組み替えたり、ユーザーへの脅威を作ったりと自由自在です。以下に掲載したスクリーンショットには、ホックされたlolnitSystemの逆コンパイルコードが見てとれます。

次に、マルウェアはハードドライブから残りのブートキット・コードを読み込み、システムスレッドを作成し、最後にコントロールをカーネルに戻します。

ESETセキュリティブログ:Win32/Gapz実行例2


ここまで来た時点で、ブートキットの役割は終わりとなります。悪意のあるカーネルモード・コードが、カーネルモードのアドレススペースですでに実行されたからです。

以下に、図表を掲載します。ブートキット・コードがどのような流れをとるか示してあります。

ESETセキュリティブログ:Win32/Gapzブートキットコード例


悪意のあるカーネルモード・コードは、ルートキットの役を果たします。ペイロードをプロセスに組み込み、C&Cサーバーとコミュニケートします。この部分に関しては、「Win32/Gapzカーネルモード・コード」で簡潔に触れます。


■ Win32/Gapz:VBR感染型

後から見つかったWin32/Gapzブートキットは、アクティブパーションのVBRに感染します。このブートキットがなぜ注目に値するのかと言えば、VBRのほんの数バイトしか被害を受けていないからです。そのため、脅威そのものの発見は困難になります。

Win32/GapzはVBRの「隠されたセクタ」を修正するだけで、他のデータやコードはノータッチなのです。

まずは、以下の図で、OSを起動させるアクティブパーション向けのVBR構成をチェックしてみましょう。VBRを構成するブロックをシンプルな形で記述しました。

ロードとIPL(イニシャル・プログラム・ローダー)を受け持つVBRコード
BIOS Parameter Block:NTFSボリューム・パラメーターを持つデータストラクチャ
Text String:仮に何かのエラーが起きたときにユーザーに表示される複数の文字列
0xAA55:VBRにある2バイトのシグネチャー

Win32/Gapzを考える場合、最も気にすべきブロックはBPB(BIOSパラメーター・ブロック)になります。さらに言えば、「隠されたセクタ」領域です。「隠されたセクタ」領域内に含まれ、かつNTFSボリュームのIPLに先行する数セクタがターゲットです。以下の表に記した通りです。

ESETセキュリティブログ:BIOSパラメータブロック


通常は起動時に、VBRコードが15個のセクタを、ターゲットとなる数セクタから読み込み、コントロールをそこに移すのですが、このプロセスをブートキットは悪用します。ブートキットはターゲットの領域をざっとチェックし、ハードドライブに格納した悪意のあるブートキット・コードに、ターゲットの位置を示します。このようにしてWin32/Gapzは、システムを管理するハードドライブに感染するのです。

ESETセキュリティブログ:BIOSパラメータブロック2

さらに悪意のあるVBRコードが実行されると、悪意のあるコードがロードされ、正常なIPLの代わりにブートキット・コードが実行されます。ブートキット・イメージは、ハードドライブの先端と最後尾に書き込まれます。それ以外の部分では、ブートキット・コードは先ほど紹介したMBR感染型と同じ働きをします。

ESETセキュリティブログ:BIOSパラメータブロック3


■ Win32/Gapz カーネルモード・コード

今紹介したブートキットは、悪意のあるコードをカーネルモードのアドレススペースに組み込むために存在します。この悪意のあるコードは、ルートキットの役割を果たすために、発見がしにくくなります。

システムの中であろうと、C&Cコミュニケーション・メカニズムの中であろうと、ユーザーモードのアドレスに組み込まれたペイロードの中であっても一緒です。

ESETセキュリティブログ:ベーシックブロックヘッダー

TDL4やRevnix、その他に拡散したブートキットと違って、Win32/Gapzカーネルモード・コードは、PEイメージとして作られていません。その代わり、バッファメモリの中にあるカーネルモードに設置されたコードにそって感染します。そのコードは12個のブロックからできています。レイアウトは以下の通りです。

ブロックはそれぞれ特定の役割を持っています。ペイロードをインジェクトしたり、ネットワーク・トランスファー・プロトコルを実行したり、C&Cとコミュニケートしたり、自己防衛をしたり、いろいろです。カーネルモード・コードは複雑なので、別々に切り離して考えなければ上手く感染できないのです(この点に関しては、これ以上このブログでは触れません)。


■ ELAM

このブログの最後で、少しELAM(Early Launch Anti-Malware Module)について触れておきたいと思います。Win32/Gapzを例に、ブートキットの脅威にどれだけ有効なのかを考えてみます。

ELAMは新しく、Microsoft8のOSで紹介されました。ELAMがあると、アンチウィルス・ソフトが自動的にロードされます。このELAMは、あらゆるサードパーティーのカーネルモード・ドライバが起動するよりも早く立ち上がるという売りがあります。

ELAMはセキュリティー・ソフトを補完する役割を持ち、セキュリティー・ソフトがルートキットの脅威に対抗する際にも役立ちます。

しかし素朴な疑問ですが、ELAMはブートキットの脅威にも役立つのでしょうか?

結論としては、極めて疑問です。

ELAMはブートキットの脅威に対抗するように設計されていないのです。確かに、カーネルモード・ドライバをロードする際にELAMは役立ちますが、ブートキットの悪意あるコードは、OSカーネルが初期化される前に起動してしまうのです。

ELAMを含んだあらゆるカーネルモード・ドライバがロードされるよりも早くです。さらに、大半のブートキットは、見たこともない手法でカーネルモード・ドライバをロードします。しかし、ELAMは正しくロードされたドライバーしか検知できません。

その結果、マルウェアはセキュリティーを迂回(うかい)して、悪意あるコードをカーネルモードのアドレススペースに送り込めるのです。ブートキットにELAMは役立ちません。Win32/Gapzだけでなく、TDL4、Olamsco、Rovnixや他のブートキットも一緒です。理解を深めるべく、以下の図をご覧ください。

ESETセキュリティブログ:ELAM概要

Gapzの場合、lonitSystemのプログラムコードが実行された直後に、カーネルモード・コードはロードされてしまします。ELAMが立ち上がるよりも前の話です。ですから、ELAMでは悪意のあるコードが実行されるプロセスを未然には防げないのです。


■ 結論

このブログでは、新しいブートキットの手法を考えました。何が最も興味深いかと言えば、VBRのほんの4バイトをいじっただけのブートキットだという点です。

MBRもVBRコードもIPLは完全にノータッチです。改良されたマルウェアと複雑なカーネルモードの機能を組み合わせたWin32/Gapzは、最も注目すべき脅威の1つでありながら、最も発見が困難な脅威となっています。


出典:blog.eset.com
  • このエントリーをはてなブックマークに追加

ページの先頭に戻る