【セキュリティ最前線】仮想マシンとセキュリティ「セキュアVM」
第3回:VMを用いたセキュリティ強化とは?
著者:東京工業大学 光来 健一
公開日:2008/1/23(水)
フォレンジック
万一システムへの侵入を許してしまった場合に備えて、攻撃を解析できるようにしておくことが重要である。どのような攻撃を受けたのかが解析できれば、システムの脆弱性を修正し、侵入者から受けた被害を回復しやすくなるからである。
そのために「ReVirt」というシステムでは、監視対象のシステムをVM内で動作させ、そのVM内で起こったハードウェアに関するイベントをログに保存しておく。そうすることで後からそのログに記録されたイベントに基づいてVMの実行を再生でき、攻撃手法や被害状況の解析が可能となる。
ReVirtではログを取るソフトウェアを監視対象のVMの外で動作させている。このような構成を取ることで、VM内のシステムが攻撃を受けた後でもログを取り続けることができる。また、ログファイルをVM内のファイルシステム上に置く必要がなくなるので、ログの改ざんも防ぐことができる。
さらにReVirtはタイミングに依存した攻撃も後から正しく再生することができる。この機能を実現するために、割り込みのような発生時刻に依存するイベントや、キーボード入力やネットワーク通信のような外部からのイベントもその発生タイミングとともにログに記録している。
図2:カーネルモード時のメモリのパーミッション
OSカーネルの保護「SecVisor」
システムへの侵入を許してしまったとしても、OSカーネルの制御は奪われないようにすることが重要である。OSカーネルはカーネルモードと呼ばれるCPUの特権モードで動作している。カーネルモードではあらゆる特権命令を発行することができ、デバイスにも自由にアクセスできる。そのためOSカーネルの制御を奪われるとシステム全体の制御を奪われることになる。
「SecVisor」ではVM内でOSを動作させることで、許可されたコード以外はカーネルモードで実行できないようにする。攻撃者はバッファオーバフロー攻撃によってOSカーネルにコードを挿入できたとしても、そのコードを実行することはできない。また、許可されたコードを書き換えることも許されない。
このような機能を実現するために、SecVisorの仮想マシンモニタは許可されたカーネルのコードが配置されているメモリページを書き込み禁止に設定する(図2)。VM内からはこのパーミッションを変更することはできないため、攻撃者がカーネルのコードを書き替えることはできない。
また、VM内のOSカーネルをカーネルモードで実行している間はユーザプログラムが配置されているメモリページを実行禁止にする。多くのOSではユーザプログラムはカーネルのコードと同じアドレス空間に配置されている。そのため、カーネルモードで悪意があるかもしれないユーザプログラムを実行されるのを防ぐことが必要である。
さらにSecVisorではカーネルモードとユーザモードが切り替わる際に、許可されていないコードが実行されないことを保証する。ユーザプログラムがシステムコールを発行するなどしてカーネルモードに切り替わる時には、割り込みベクタテーブルなどに登録されたエントリポイントから実行がはじまる。SecVisorはこのようなエントリポイントが許可されていないコードを指さないように監視する。 次のページ