• 検索結果がありません。

第 5 章 呼出し元識別手法 45

5.3 BTS による VM 上のスレッドの観測

本節では,BTSの概要と,VM上で動作するスレッドをVMMからBTSを用いて 観測する手法について述べる.これは,5.2節で述べた機能(1)に相当する.

5.3.1 BTS

Intel 製のプロセッサには,発生した分岐の情報を MSR (Model Specific Register) に保存するLBR (Last Branch Record) やメモリ上に保存するBTS,分岐命令の度に

5.3. BTSによるVM上のスレッドの観測 47 デバッグ例外を発生させる BTF (Single Step on Branches) といったブランチトレー ス機能が搭載されているものがある.提案手法では,分岐情報を保存する2つの機能 のうち,保存できる分岐数を指定できるBTSを用いる.

BTSは,分岐命令の実行時に分岐元アドレス,分岐先アドレス,分岐予測の成否の 3つの情報を指定されたカーネル空間内のバッファに記録する機能である.BTS は,

Debug Store save area (DS save area)と呼ばれるデータ構造と,いくつかの MSRを 用いてプロセッサのコア毎に設定が可能である.DS save areaは,バッファの仮想ア ドレスやサイズなどを保持し,IA32 DS AREA MSR に当該データ構造を指す仮想ア ドレスを設定する.BTS は,IA32 DEBUGCTL MSRの TR ビット(第6ビット)と BTSビット(第7ビット)をセットすることで有効にすることができる.BTS OFF OS ビット (第9ビット),BTS OFF USR ビット (第10ビット) は,セットするとそれ ぞれ特権モード時,非特権モード時の分岐情報が記録されなくなる.さらに,BTINT ビット (第8ビット)をセットすることで,バッファが全て埋まると任意の割込みを発 生させることが可能となる.なお,BTINTビットがセットされていない場合は,バッ ファはリングバッファとして扱われ,古い記録から上書きされる.

5.3.2 VM 上で発生する分岐の取得

BTSは,VMMからVM上のプロセスを観測するような用途を想定していない.こ れは,BTSバッファとして,観測対象の動作中に有効な仮想メモリ領域が必要なため である.すなわち,VMMがVM上のプロセスを観測するためには,VM上のカーネ

ル内にDS save area やバッファを確保する必要がある.さらに,マルウェアの動作を

観測するという観点から,BTS関連の制御が観測対象が動作するVMから透過的に行 われる必要がある.そこで,Alkanet は,Windows 内部のデータ構造を書き換えて,

BTSバッファ用のページと物理メモリ領域の設定を行うことで,VMMによる透過的 なBTS利用を実現する.

図5.1に,提案手法におけるBTSバッファの管理機能の構成を示す.本項では,図中 のBTSバッファについて述べ,退避用バッファについては5.3.3項で述べる.Alkanet

は,Windows のカーネル空間内で未使用の仮想メモリ領域に対応するPTEを書き

換えて,BTSバッファ用に確保した物理メモリ領域を指すように設定する.さらに,

Windows が物理アドレスを管理するデータ構造である MmPfnDatabase を書き換え

て,BTSバッファ用の物理メモリ領域を使用できない領域として認識されるように する.

図 5.1 BTS用バッファの管理 [19]

確保したメモリ領域をBTSバッファとして設定し,BTSを有効化するためにVM 内のMSRを設定する.Alkanetは,Intel製プロセッサの仮想化支援機能であるIntel VTを利用している.そのため,VM 上の IA32 DEBUGCTL は,VMCS で設定可能

である.IA32 DS AREA は,VMCS に設定項目がないため物理 MSR に設定する.

以上の設定により,Windows 上で発生した分岐の情報を BTS バッファに記録する ことが可能となる. また,本論文では,システムコールの呼出し元を特定する目的で BTS を使用するため,OS 内部で発生する分岐については記録しない.したがって,

BTS OFF OS ビットをセットし,ユーザモードで発生する分岐のみを記録する.な

お,バッファの確保やMSRの設定は,プロセッサのコア毎に行う.

5.3.3 スレッド毎の分岐記録の取得

BTS にはスレッドやプロセスを区別する機能はないため,複数のスレッド・プロセ スで発生した分岐の情報が混交してしまう.マルウェアが実行した分岐命令の情報を 取得するためには,スレッド毎に分けて分岐情報を記録する機能を実現する.具体的

には,Alkanetは,BTS 用のバッファをスレッド毎に管理し,コンテキストスイッチ

5.4. 関数呼出し階層の抽出 49