仮想マシンを用いた 既存IDSのオフロード 九州工業大学 飯田貴大 九州工業大学/JST CREST 光来健一
侵入検知システム(IDS) IDSは攻撃者の侵入を検知するために用いられる IDSが攻撃を受けると検知できなくなる ファイル、ネットワーク、OSなどを監視 例:chkrootkit 攻撃者によって仕込まれたrootkitを発見 rootkitはファイルの改ざん等を行う攻撃者用ツール IDSが攻撃を受けると検知できなくなる psコマンドが置き換えられるとchkrootkitが騙される 攻撃者 サーバ chkrootkit コマンド群 置換 rootkit
仮想マシンを用いたIDSのオフロード サーバを仮想マシン上で動かし、IDSだけ別の仮想マ シン上で動かす手法 IDSが停止される恐れがない ログが改ざんされる恐れがない IDS-VM サーバVM 攻撃者 サーバ IDS 侵入
IDSをオフロードする際の問題 サーバVMを監視するようにIDSを修正する必要があ る 単純にIDS-VMで動かすだけではIDS-VMの監視を行ってし まう chkrootkitのpsはIDS-VMのプロセス情報を返す VMをまたがって監視を行うには特殊なアクセス方法を用い る必要がある 例:サーバVMのメモリを覗く VMwatcher [Jiang et al.’07] VIX [Hay et al.’08] IDS-VM サーバVM IDS IDS IDS-VMの 監視 サーバVMの 監視
提案:Transcall IDSに修正を加えることなくオフロードを可能にするシ ステム サーバVMの監視を行うための実行環境であるVMシャドウを 提供 VMシャドウ内のIDSはサーバVM内と同様に実行できる サーバVMの情報を安全に取得 VMシャドウ IDS システムコール エミュレータ シャドウ ファイルシステム Transcall サーバVM IDS-VM
システムコール・エミュレータ VMシャドウ内のIDSが発行したシステムコールに対し て必要に応じてサーバVMの情報を返す カーネルについての情報の取得 不必要ならIDS-VMのカーネルにシステムコールを発行 メモリ管理 ネットワーク処理 VMシャドウ IDS システムコール エミュレータ Transcall サーバVM IDS-VM カーネル
例:unameのエミュレーション unameシステムコールが返す情報をサーバVMから 取得 サーバVMのカーネルメモリの中からutsname構造体を発見 カーネル名、ホスト名、バージョン等が格納されている init_task変数からたどることができる unameが返す情報を上書き VMシャドウ IDS システムコール エミュレータ Transcall サーバVM IDS-VM カーネル init_task Linux server-vm 2.6.27.35 task_struct utsname uname
サーバVMのメモリを直接見る必要性 サーバVMのカーネルが改ざんされない限り、正しい 情報を取得できる サーバVMへのRPCは脆弱 OS名を改ざんされるとOSに依存した攻撃を見逃す危険性 Transcall VMシャドウ IDS サーバVM IDS-VM RPC サーバ カーネル 攻撃 uname uname
シャドウファイルシステム VMシャドウ内のIDSからサーバVMで使われている ファイルシステム全体を参照可能 サーバVMの仮想ディスク ファイルシステムの整合性を保つために読み込み専用でマウン ト 特殊なファイルシステム サーバVMを参照して エミュレート proc、sys、dev VMシャドウ IDS シャドウ ファイルシステム カーネル Transcall サーバVM IDS-VM 仮想ディスク
シャドウprocファイルシステム サーバVMのプロセス情報を返すファイルシステム Linuxのprocファイルシステムと同じインタフェースを提供 /proc/PID/statはサーバVM上のプロセス番号PIDのプロセス 情報を返す プロセス情報はサーバVMのカーネルメモリから直接取得 init_task変数から順番にたどれるtask_struct構造体を参照 VMシャドウの/procにマウントする IDS-VM サーバVM カーネル シャドウprocfs Transcall IDS VMシャドウ init_task task_struct /proc/100/stat
psコマンドの実行例 psコマンドは/proc を参照しながら実行 /proc/self をチェック サーバVM上にpsプロセスは存在しない IDS-VMで実行中のpsプロセスの情報を返す(例外処理) /proc 上のディレクトリエントリ一覧を取得 サーバVM上で動いているプロセスのPIDの一覧を返す 各プロセスのディレクトリからstat、statusファイルを読み込 む 実行されている端末、実行時間、コマンド名などを取得 サーバVM カーネル シャドウprocfs Transcall PS IDS-VM VMシャドウ ps
Transcallのポリシファイル VMシャドウ内のIDSがIDS-VM上のファイルを使うこ とを可能にする /boot/vmlinuz /var/log/a.log
ポリシファイルの記述例 IDSがアクセスするパスとIDS-VM上のパスの対応を 記述 Tripwireの例 TripwireのポリシファイルはサーバVMごとに異なるパスに置く サイトキーは共通のパスに置く ログはサーバVMごとに異なるパスに保存 それ以外のファイルはサーバVMを参照 /etc/tripwire/tw.pol /etc/tripwire/VM1/tw.pol /etc/tripwire /etc/tripwire /var/lib/tripwire /var/lib/tripwire/VM1
実装 Xenを使ってIDSのオフロードを実現 Transcallはカーネルを変更せずに実現 ドメイン0をIDS-VM、ドメインUをサーバVMとする Transcallはカーネルを変更せずに実現 システムコールエミュレータの子プロセスとしてIDSを実行 FUSEを用いてシャドウprocファイルシステムを実装 IDS Linux ドメインU ドメイン0 FUSE シャドウ procfs カーネル システムコール エミュレータ Transcall カーネル
システムコールのトラップ ptraceシステムコールを用いてシステムコールのト ラップを行う エミュレートするシステムコールの場合 uname 引数が指すメモリの内容を書き換える ファイル関連のシステムコールの場合 open,stat 引数のパス名を置換する ポリシ /proc / IDS uname(buf) open("/proc") システムコール エミュレータ
サーバVMのカーネル情報の取得 カーネルの内部データ構造を基にメモリを解析 あらかじめカーネルの型情報やシンボル情報を取得しておく デバッグ情報やSystem.mapを利用 サーバVMのメモリページをIDS-VMにマップしてアクセス 仮想アドレス→疑似物理アドレス→マシンアドレスへの変換 1 Transcall ページ テーブル 3 2 ターゲット VMM P2Mテーブル
実験:Transcallの性能 VMシャドウ内で動かしたpsコマンドの実行時間を測 定 サーバVMで直接動かした場合の3.3倍 原因はptraceおよびFUSEを用いたことによるオーバヘッド サーバVMからの情報取得のオーバヘッドは含まれない VMシャドウの作成時に取得しているため 平均実行時間 (ミリ秒) ps(サーバVM) 20 Transcall+ps (IDS-VM) 66 表1 実行速度比較 実験環境 CPU Intel Quad 2.83GHz メモリ 4GB Xen3.4.0 ドメイン0Linux2.6.18.8 ドメインU Linux2.6.27.35
実験:隠しプロセスの発見 Transcallを用いて隠しプロセスの発見ができるかど うかの実験を行った VMシャドウ内とサーバVM上でのpsの実行結果を比較 サーバVMではinitプロセスを隠蔽するpsコマンドを実行 隠蔽されたinitプロセスの発見を行えた
関連研究(1/2) HyperSpector [Kourai et al.’05] IDS-VMからサーバVMを監視するシステム シャドウファイルシステム、シャドウプロセスを提供 既存のIDSが利用可能だが、設定の変更は必要 OSの仮想化機能を利用 名前空間の操作だけでサーバVMの情報を参照できる Transcallはシステムレベルの仮想化を前提 サーバVMの情報を取得するのは容易ではない
関連研究(2/2) VIX [Hay et al.’08] VMwatcher [Jiang et al.’07] IDS-VMからサーバVMの情報を取得するコマンド群を提供 提供されているコマンドを使わないIDSは修正が必要 VMwatcher [Jiang et al.’07] IDS-VMで既存のアンチウィルスを動かすことができる サーバVMのファイルシステムを参照するのみ スキャンするパスをマウント先に変更する必要がある Proxos [Ta-min et al.’06] 機密情報を扱うプロセスを別のVMで実行 ポリシファイルに従ってシステムコールのRPCを行う 元のVMのカーネルの修正が必要
まとめ 既存のIDSを変更することなく、VMを用いてオフロー ドできるようにするシステムTranscallを提案 VMシャドウ内でIDSを動作させる IDS-VMからサーバVMを監視するための実行環境 Transcallの構成 システムコール・エミュレータ シャドウファイルシステム シャドウprocファイルシステム ポリシファイル 既存のpsを動作させて隠しプロセスを見つけられた
今後の課題 シャドウprocファイルシステムを完成させる 既存のIDSをオフロードできるようにする 取得できる情報がまだ不完全 実行中のプログラムのパス名が取得できない 既存のIDSをオフロードできるようにする Tripwire ポリシファイルの実装を完成させる必要がある chkrootkit netstatコマンドもオフロードできるようにする必要がある Transcallのオーバヘッドを削減する
仮想ディスクのマウント 仮想ディスクがLVMを使っている場合 仮想ディスクに使われているループバックデバイスを探す /dev/loop1 見つかったループバックデバイスに対してデバイスマップを 作成 LVMでなければ作成したデバイスを直接マウント可能 物理ボリュームを探してから、論理ボリュームを探す 物理ボリューム名が一意である必要 /dev/VolGroupXen00/LogVol00 論理ボリュームをアクティブにしてマウント