最も分かりやすい例で云えば「TDL4」や「Olmasco, Rovnix」です。
こうしたブートキットはそれぞれに違った感染経路を持っており、MBR(マスター・ブート・レコード)を不正に改変したり、VBR/IPL(ボリューム・ブート・レコード/イニシャル・プログラム・ローダー)を不正に改変したりしてきます。まとめると下の図のようになります。
当ブログでは、比較的最近になって登場したブートキットの新しい手口を紹介したいと思います。
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以上
■ Win32/Gapz:MBR感染型
システムに感染する初期型のブートキットは、2つの部分からできています。
・ 悪意のあるMBR
・ ユーザーモードのプロセスに感染するカーネルモード・コードとペイロード
カーネルモード・コードとペイロードは、ハードディスクの先端と最後尾に書き込まれています。Rovnixで使われていた手口とすごく似ています。Rovnixと言っても、VBRに感染するタイプを除きます。
Win32/Gapzブートキットが持つ機能は、別に目新しくもありません。悪意あるMBRのコードが実行されると、オリジナルのコードはメモリの中へ引っ込み、ハードディスクから次のレベルのブートキット・コードが読み込まれます。その新たなブートキット・コードはint 13hハンドラーを順次乗っ取ります。結果として、以下のシステム・モジュールのロードが支配下に置かれます。
・ ntldr
・ bootmgr
・ winload.exe
ブートキットはこれらのシステム・モジュールを、特別なバイト・シーケンス(8桁の2進数)で認識します。以下に、ホックされたシステム・モジュール内のプログラムコードを一覧にしておきます。
リストアップされたようなモジュールのうちどれか1つがハードウェアから読み出されたときにマルウェアに見つかると、マルウェアはすぐにパッチしてしまいます。プロセスが保護モードに切り替わった後でも、コントロールができるようにパッチしてしまうのです。
まず、ブートキットはホックをntldrかbootmgrのシステム・モジュールのどちらかに作ります(どちらに作るかはOSによります)。仮にホックがbootmgrの中に作られたとします(Microsoft Vistaかそれ以降のOSの場合)。するとブートキットはさらにwinload.exe内にあるOslArchTransferToKernelのプログラムコードをホックします。
こうしたホックがあるために、カーネル・イメージがロードされた瞬間、マルウェアが起動してしまうのです。
次は、OSカーネルの初期化が行なわれている間に起動するlolnitSystemにホックが作られます。このホックは、ntldrかwinload.exeのどちらかから行なわれます。どちらかになるかはOSのバージョンによります。
さらに、lolnitSystemのホックが実行されると、マルウェアはパッチした数バイトをカーネル・イメージに移動し、さらにコントロールをオリジナルのlolnitSystemプログラムコードに移します。
コントロールがオリジナルのlolnitSystemプログラムコードに移動する前に、ブートキットはリターンアドレスをチェックします。lolnitSystemの移動が完了した後で悪意あるプログラムコードを実行できるように、ブートキットはどこかのアドレスに格納されます。
この方法を使って、カーネルが初期化された後でも、マルウェアはコントロールを握ってしまうのです。この時点で、ブートキットはカーネルをどうにでもできるようになります。ハードドライブにアクセスしたり、メモリを組み替えたり、ユーザーへの脅威を作ったりと自由自在です。以下に掲載したスクリーンショットには、ホックされたlolnitSystemの逆コンパイルコードが見てとれます。
次に、マルウェアはハードドライブから残りのブートキット・コードを読み込み、システムスレッドを作成し、最後にコントロールをカーネルに戻します。
ここまで来た時点で、ブートキットの役割は終わりとなります。悪意のあるカーネルモード・コードが、カーネルモードのアドレススペースですでに実行されたからです。
以下に、図表を掲載します。ブートキット・コードがどのような流れをとるか示してあります。
悪意のあるカーネルモード・コードは、ルートキットの役を果たします。ペイロードをプロセスに組み込み、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に先行する数セクタがターゲットです。以下の表に記した通りです。
通常は起動時に、VBRコードが15個のセクタを、ターゲットとなる数セクタから読み込み、コントロールをそこに移すのですが、このプロセスをブートキットは悪用します。ブートキットはターゲットの領域をざっとチェックし、ハードドライブに格納した悪意のあるブートキット・コードに、ターゲットの位置を示します。このようにしてWin32/Gapzは、システムを管理するハードドライブに感染するのです。
さらに悪意のあるVBRコードが実行されると、悪意のあるコードがロードされ、正常なIPLの代わりにブートキット・コードが実行されます。ブートキット・イメージは、ハードドライブの先端と最後尾に書き込まれます。それ以外の部分では、ブートキット・コードは先ほど紹介したMBR感染型と同じ働きをします。
■ Win32/Gapz カーネルモード・コード
今紹介したブートキットは、悪意のあるコードをカーネルモードのアドレススペースに組み込むために存在します。この悪意のあるコードは、ルートキットの役割を果たすために、発見がしにくくなります。
システムの中であろうと、C&Cコミュニケーション・メカニズムの中であろうと、ユーザーモードのアドレスに組み込まれたペイロードの中であっても一緒です。
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や他のブートキットも一緒です。理解を深めるべく、以下の図をご覧ください。
Gapzの場合、lonitSystemのプログラムコードが実行された直後に、カーネルモード・コードはロードされてしまします。ELAMが立ち上がるよりも前の話です。ですから、ELAMでは悪意のあるコードが実行されるプロセスを未然には防げないのです。
■ 結論
このブログでは、新しいブートキットの手法を考えました。何が最も興味深いかと言えば、VBRのほんの4バイトをいじっただけのブートキットだという点です。
MBRもVBRコードもIPLは完全にノータッチです。改良されたマルウェアと複雑なカーネルモードの機能を組み合わせたWin32/Gapzは、最も注目すべき脅威の1つでありながら、最も発見が困難な脅威となっています。
出典:blog.eset.com