セキュリティブログWin32/Gapz:新しいブートキットの手口2013年2月13日水曜日Win32/Gapz:新しいブートキットの手口ツイートここ数年で、多くのブートキットが新たに見つかりました。Windowsのプラットフォームを狙ったブートキットです。したブートキットはそれぞれに違った感染経路を持っており、MBR(マスター・ブート・レコード)を不正に改変したり、VBR/IPL(ボリューム・ブート・レコード/イニシャル・プログラム・ローダー)を不正に改変したりしてきます。まとめると下の図のようになります。当ブログでは、比較的最近になって登場したブートキットの新しい手口を紹介したいと思います。modification」の部分です)。この全く新しい手口は、Win32/Gapzブートキットに使われていました。今までのところ、我々は2種類のWin32/Gapzブートキットに関する情報を持っています。2つとも違った手法で被害者のシステムに感染します。最初に確認したWin32/Gapzブートキットは2012年の初夏に見つかり、MBR感染型でした。2番目に確認したWin32/GapzブートキットはVBR感染型で、2012年の秋も終わるころに見つけました。Win32/Gapzは以下のマイクロソフトOSに感染する力を持っています。Win32/Gapz:MBR感染型システムに感染する初期型のブートキットは、2つの部分からできています。ユーザーモードのプロセスに感染するカーネルモード・コードとペイロードカーネルモード・コードとペイロードは、ハードディスクの先端と最後尾に書き込まれています。Rovnixで使われていた手口とすごく似ています。Rovnixと言っても、VBRに感染するタイプを除きます。Win32/Gapzブートキットが持つ機能は、別に目新しくもありません。悪意あるMBRのコードが実行されると、オリジナルのコードはメモリの中へ引っ込み、ハードディスクから次のレベルのブートキット・コードが読み込まれます。13hハンドラーを順次乗っ取ります。結果として、以下のシステム・モジュールのロードが支配下に置かれます。winload.exeブートキットはこれらのシステム・モジュールを、特別なバイト・シーケンス(8桁の2進数)で認識します。以下に、ホックされたシステム・モジュール内のプログラムコードを一覧にしておきます。リストアップされたようなモジュールのうちどれか1つがハードウェアから読み出されたときにマルウェアに見つかると、マルウェアはすぐにパッチしてしまいます。プロセスが保護モードに切り替わった後でも、コントロールができるようにパッチしてしまうのです。ブートキットはホックをntldrかbootmgrのシステム・モジュールのどちらかに作ります(どちらに作るかはOSによります)。Vistaかそれ以降のOSの場合)。するとブートキットはさらにwinload.exe内にあるOslArchTransferToKernelのプログラムコードをホックします。したホックがあるために、カーネル・イメージがロードされた瞬間、マルウェアが起動してしまうのです。次は、OSカーネルの初期化が行なわれている間に起動するlolnitSystemにホックが作られます。このホックは、ntldrかwinload.exeのどちらかから行なわれます。どちらかになるかはOSのバージョンによります。lolnitSystemのホックが実行されると、マルウェアはパッチした数バイトをカーネル・イメージに移動し、さらにコントロールをオリジナルのlolnitSystemプログラムコードに移します。コントロールがオリジナルのlolnitSystemプログラムコードに移動する前に、ブートキットはリターンアドレスをチェックします。lolnitSystemの移動が完了した後で悪意あるプログラムコードを実行できるように、ブートキットはどこかのアドレスに格納されます。この方法を使って、カーネルが初期化された後でも、マルウェアはコントロールを握ってしまうのです。この時点で、ブートキットはカーネルをどうにでもできるようになります。ハードドライブにアクセスしたり、メモリを組み替えたり、ユーザーへの脅威を作ったりと自由自在です。以下に掲載したスクリーンショットには、ホックされたlolnitSystemの逆コンパイルコードが見てとれます。次に、マルウェアはハードドライブから残りのブートキット・コードを読み込み、システムスレッドを作成し、最後にコントロールをカーネルに戻します。ここまで来た時点で、ブートキットの役割は終わりとなります。悪意のあるカーネルモード・コードが、カーネルモードのアドレススペースですでに実行されたからです。以下に、図表を掲載します。ブートキット・コードがどのような流れをとるか示してあります。悪意のあるカーネルモード・コードは、ルートキットの役を果たします。ペイロードをプロセスに組み込み、C&Cサーバーとコミュニケートします。この部分に関しては、「Win32/Gapzカーネルモード・コード」で簡潔に触れます。後から見つかったWin32/Gapzブートキットは、アクティブパーションのVBRに感染します。このブートキットがなぜ注目に値するのかと言えば、VBRのほんの数バイトしか被害を受けていないからです。そのため、脅威そのものの発見は困難になります。Win32/GapzはVBRの「隠されたセクタ」を修正するだけで、他のデータやコードはノータッチなのです。以下の図で、OSを起動させるアクティブパーション向けのVBR構成をチェックしてみましょう。VBRを構成するブロックをシンプルな形で記述しました。0xAA55:VBRにある2バイトのシグネチャーWin32/Gapzを考える場合、最も気にすべきブロックはBPB(BIOSパラメーター・ブロック)になります。言えば、「隠されたセクタ」領域です。「隠されたセクタ」領域内に含まれ、かつNTFSボリュームのIPLに先行する数セクタがターゲットです。以下の表に記した通りです。通常は起動時に、VBRコードが15個のセクタを、ターゲットとなる数セクタから読み込み、コントロールをそこに移すのですが、このプロセスをブートキットは悪用します。ブートキットはターゲットの領域をざっとチェックし、ハードドライブに格納した悪意のあるブートキット・コードに、ターゲットの位置を示します。このようにしてWin32/Gapzは、システムを管理するハードドライブに感染するのです。悪意のあるVBRコードが実行されると、悪意のあるコードがロードされ、正常なIPLの代わりにブートキット・コードが実行されます。ブートキット・イメージは、ハードドライブの先端と最後尾に書き込まれます。それ以外の部分では、ブートキット・コードは先ほど紹介したMBR感染型と同じ働きをします。カーネルモード・コード今紹介したブートキットは、悪意のあるコードをカーネルモードのアドレススペースに組み込むために存在します。この悪意のあるコードは、ルートキットの役割を果たすために、発見がしにくくなります。システムの中であろうと、C&Cコミュニケーション・メカニズムの中であろうと、ユーザーモードのアドレスに組み込まれたペイロードの中であっても一緒です。TDL4やRevnix、その他に拡散したブートキットと違って、Win32/Gapzカーネルモード・コードは、PEイメージとして作られていません。その代わり、バッファメモリの中にあるカーネルモードに設置されたコードにそって感染します。そのコードは12個のブロックからできています。レイアウトは以下の通りです。ブロックはそれぞれ特定の役割を持っています。ペイロードをインジェクトしたり、ネットワーク・トランスファー・プロトコルを実行したり、C&Cとコミュニケートしたり、自己防衛をしたり、いろいろです。カーネルモード・コードは複雑なので、別々に切り離して考えなければ上手く感染できないのです(この点に関しては、これ以上このブログでは触れません)。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つでありながら、最も発見が困難な脅威となっています。AMERICAがWeb公開している情報を元に作成しています。