VMI

仮想マシンモニタからゲストのリソースを監視・制御する技術をVMI(Virtual Machine Introspection)という.
その発祥は2003年に遡る.当時はハニーポットの研究が盛んな時期であり,VMIは仮想マシンにおける侵入検知を実現する手法として提案された.これはマルウェア解析の自動化に応用されており,仮想マシンモニタによるサンドボックスを構築し,VMIによってマルウェアの挙動を監視するというアプローチが一般的となっている.
さて,VMIにおける問題点にセマンティックギャップというものがある.原義は高級言語とハードウェアとの乖離であるが,OSと同じ粒度で情報を取得することのできるゲスト内部(in-the-box)とハードウェアの粒度で情報を取得することしかできないゲスト外部(out-of-the-box)の乖離という意味でも援用される.

Transparent Sandbox

セマンティックギャップを解決する方法として,ゲスト内部にエージェントを挿入し,仮想マシンモニタに情報を送信するというアプローチが考えられる.
だがマルウェア解析において,ゲスト内部にエージェントを挿入することは,自らの姿を曝け出していることにほかならない.ファイルやサービス名,フックによって変化するAPIの挙動といったものは,マルウェアがエージェントと同じ権限で動作する限り避けられない.そもそも仮想マシンモニタは特権を有していたところでRDTSCICEBPなどの命令,あるいはハードウェア名やIDTといった要素から検出される可能性を孕んでいる.そのため,ゲスト内部にエージェントを挿入することは,仮想マシンモニタがマルウェアから検出される可能性を高めることに繋がる.フォレンジックにおける完全性(integrity)のためにも,ゲスト内部にエージェントを挿入すべきではないと私は考える.
この議論に関して,マルウェアから検出されない仮想マシンモニタをtransparent sandbox(透明なサンドボックス?)といい,仮想マシンモニタの検出を試みるマルウェアをevasive malwareという.
ではどのような仮想マシンモニタがより「透明」に近いのか.

仮想マシンモニタの歴史

ここでPopekとGoldbergの仮想化要件に立ち返ると,ベアメタルな仮想マシンモニタは等価性(equivalence),資源管理(resource control),効率性(efficiency)の三原則を実現しており,なおかつユーザセンシティブ命令が特権命令でなければならない.センシティブ命令かつ特権命令でなければ,例外によって仮想マシンモニタに通知することができないためである.
だが,以前のx86アーキテクチャはこの要件を満たしていなかった.そこで,ニ種類の解決方法が編み出された.
一つ目はバイナリ変換(binary translation)による完全仮想化である.これはソフトウェアで命令をエミュレートする手法で,QEMUやVMwareが該当する.QEMUは全ての命令を中間コードに変換するのに対し,VMwareはPopekとGoldbergの仮想化要件を満たさない命令をライブラリ呼び出しに変換する.
二つ目は準仮想化である.これはPopekとGoldbergの仮想化要件を満たさない命令に差し掛かると仮想マシンモニタに通知されるようゲストOSのカーネルを修正する手法で,Xenが該当する.
ではバイナリ変換による完全仮想化とカーネル書き換えによる準仮想化のどちらがより「透明」に近いのか.
その前にIntel VT-xについて考えなければならない.Intel VT-xはCPUのモード切り替えによってセンシティブ命令かつ特権命令でない命令のトラップを実現する拡張機能である.すなわちPopekとGoldbergの仮想化要件を満たすハードウェア側からのアプローチである.これにより準仮想化カーネルの必要はなくなった.エージェントの挿入が「透明」性に関わるのと同様,カーネルの書き換えは仮想マシンモニタを検出する手掛かりとなる.
そのためマルウェア解析においては,バイナリ変換による完全仮想化か,Intel VT-xによる完全仮想化が前提となる.なおKVMはIntel Vt-xを前提としているが,部分的にQEMUを用いている.
ではどちらの手法がより「透明」に近いのか.

バイナリ変換とIntel VT-x

Christopher KruegelはWineのようなシステムコール単位のエミュレーションあるいはフックは情報量として不十分であり,またIntel VT-xによる完全仮想化はRedPillのようなアプローチで検出可能であることから,バイナリ変換による完全仮想化すなわちQEMUを支持している.
システムコール単位の監視はIsDebuggerPresentのようなカーネルモードに遷移せず構造体を参照するだけの処理を見逃してしまう.システムコールのフックを用いた研究や製品は多数存在するが,それらは不完全である.この点で私は氏と意見を一にするが,バイナリ変換がより「透明」に近いかどうかは検討の余地があるだろう.寧ろ氏は実行パスの拡張がより容易に行えるがゆえにバイナリ変換を支持しているのだろうということは読み取れるが,氏がチーフサイエンティストを務めるLastlineの製品がQEMUをベースとしていることもあり,些かポジショントークのようにも感じられる.
このような論調でバイナリ変換とIntel VT-xを二項対立の図式に落とし込んでいる論文が数多く見られる.しかし,どちらがより「透明」に近いのかという議論はナンセンスであろう.
ゲスト内部にエージェントを挿入することで,果たして本当にマルウェアから検出されやすくなるのかと言うと,それは飽くまで可能性でしかない.だがゲスト内部にエージェントを挿入しないという選択で,その問題は検討項目から外すことができる.一方で,バイナリ変換であるという理由でIntel VT-xを用いた仮想マシンモニタよりも検出されにくいといったことはない.逆もまた然りである.
そしてそもそも,ネットワーク経由で仮想マシンモニタを検出するという手法がある以上,完全に「透明」なサンドボックスは実現不可能であるとされる.
ゆえにそれぞれのアプローチについて「透明」性の他にもメリット・デメリットを検討し,なおかつ両者を接合するようなシステムこそが望ましい.

参考文献