vm shadow: 既存 ids を オフロードするための実行環境
DESCRIPTION
VM Shadow: 既存 IDS を オフロードするための実行環境. 九州工業大学 飯田貴大 九州工業大学/ JST CREST 光来健一. 侵入検知システム( IDS ). IDS は攻撃者の侵入を検知するために用いられ る ファイル、ネットワーク、 OS などを監視 IDS が攻撃を受けると検知できなくなる 例: Tripwire のポリシファイルやデータベースが改竄されると Tripwire が騙される. 攻撃者. IDS. 異常. bin. config. 仮想マシンを用いた IDS のオフロード. - PowerPoint PPT PresentationTRANSCRIPT
VM Shadow: 既存 IDSをオフロードするための実行環境
九州工業大学飯田貴大
九州工業大学/ JST CREST光来健一
IDS は攻撃者の侵入を検知するために用いられる◦ ファイル、ネットワーク、 OS などを監視
IDS が攻撃を受けると検知できなくなる◦ 例: Tripwire のポリシファイルやデータベースが改竄さ
れると Tripwire が騙される
侵入検知システム( IDS)
IDS
攻撃者
異常
bin
config
サーバを仮想マシン (VM) 上で動かし、 IDS だけ別の仮想マシン上で動かす手法◦ IDS が攻撃の影響を受けにくくなる
サーバ VM に侵入した攻撃者から実行ファイルや設定ファイル等を改竄されることはない
◦ IDS-VM はサービスを提供しないため脆弱性を利用した攻撃はされにくい
仮想マシンを用いた IDSのオフロード
IDS-VM サーバ VM 攻撃者
サーバ
IDS
bin
config
オフロードすると既存の IDS を使えなくなる◦ 単純に動かすだけでは IDS-VM の監視を行ってしまう◦ サーバ VM を監視するように IDS を修正するのは大変
内部構造を基にサーバ VM のメモリを解析する必要がある カーネル内部のプロセスの情報を取得
マウントしたサーバ VM のディスクを監視するために監視対象のパスの書き換えが必要となる 設定ファイルやプログラム本体
既存の IDSへの修正が必要
IDS-VM サーバ VM
IDS
カーネル
メモリ解析
仮想ディスク
パスの書き換え
オフロードした既存の IDS に修正を加えることなく動作させることを可能にする実行環境◦ IDS-VM からサーバ VM の監視を行える◦ サーバ VM 内で実行しているかのように IDS を実行でき
る◦ サーバ VM のカーネルが攻撃されない限り安全に監視で
きる
提案: VM Shadow
VM Shadow
IDS
サーバ VMIDS-VM
VM Shadow
IDS
サーバ VM
システムコールのエミュレーション◦ IDS がシステムコールを使ってサーバ VM の情報を取得
できるようにする Shadow ファイルシステムの提供
◦ サーバ VM のファイルシステムを同じ名前空間で提供する proc ファイルシステムも含めて
◦ ただし、 IDS の実行には IDS-VM 上のファイルを使わせる
VM Shadowの実現
VM Shadow
IDS
IDS-VM
システムコールエミュレータ
Shadowファイルシステ
ム
サーバVM
VM Shadow 内の IDS が発行したシステムコールに対して必要に応じてサーバ VM の情報を返す◦ 必要ならサーバ VM のカーネルを解析して情報を取得
サーバ VM についての情報の取得◦ それ以外は IDS-VM のカーネルにシステムコールを発行
メモリ管理 ネットワーク処理
システムコール・エミュレータ
VM Shadow
IDS
システムコール
エミュレータ
サーバ VMIDS-VM
カーネルカーネル
uname システムコールが返す情報をサーバ VMから取得◦ サーバ VM のカーネルメモリの中から utsname 構造体
を発見 カーネル名、ホスト名、バージョン等が格納されている init_task 変数からたどることができる
例 :unameのエミュレーション
VM Shadow
IDS
システムコール
エミュレータ
サーバ VMIDS-VM
カーネルカーネル
uname
init_task
Linuxserver-vm2.6.27.35
task_struct utsname
VM Shadow 内の IDS からサーバ VM で使われているファイルシステム全体を参照可能◦ サーバ VM の仮想ディスクを読み込み専用でマウント
整合性を保つため◦ サーバ VM と同じ名前空間を提供
マウント先がルートディレクトリになるようにファイル関連のシステムコールをエミュレーション
例: /home/vm1→/
Shadowファイルシステム
VM Shadow
IDS
Shadowファイルシステム
サーバ VMIDS-VM
仮想ディスク
実行するためにファイルを読み込む時には安全のために IDS-VM のファイルを参照する◦ 実行ファイル
execve システムコールによる読み込みは IDS-VM から◦ 通常の読み込みの場合にはサーバ VM のファイルを参照
実行されるファイルの監視も行える
実行ファイルの参照
VM Shadow
IDS
Shadowファイルシステ
ム
サーバ VMIDS-VM
仮想ディスク
open
execve
共有ライブラリの読み込みも IDS-VM から行う◦ プログラムに埋め込まれたダイナミックリンカ (ld.so)
が読み込む システムコールでは通常の読み込みと区別できない
◦ open システムコールが発行されたレジスタの値で区別する ダイナミックリンカのレジスタの値なら IDS-VM から それ以外ならサーバ VM から
共有ライブラリの参照
VM Shadow
Shadowファイルシステ
ム
サーバ VMIDS-VM
仮想ディスク
プログラム
ld.so
プログラム ld.so
VM Shadow 内の IDS が安全のために IDS-VM 上のファイルを使うことを可能にする◦ IDS-VM に隔離することで攻撃者から守ることができる
攻撃者に改竄される危険性が無くなる◦ マッピングを記述することで IDS-VM 上の指定したファ
イルを使わせることができる VM ごとに異なるファイルにマッピングできる
マッピングファイルによる指定
/etc/tripwire/tw.pol /etc/tripwire/vm1/tw.pol/etc/tripwire /etc/tripwire/var/lib/tripwire//etc/lib/tripwire/vm1
Tripwire のマッピングファイル
IDS-VM 上のパス
IDS がアクセスするパ
ス
サーバ VM の OS 内の情報を返すファイルシステム◦ Linux の proc ファイルシステムと同じインタフェース
を提供◦ プロセスやネットワーク、システムの情報を返す
例: /proc/*/stat◦ VM Shadow 作成時にサーバ VM のメモリを解析して構
築 アクセスのたびにメモリ解析を行うのはオーバヘッドが大き
いため
Shadow procファイルシステム
サーバ VM
カーネルShadowprocfs
IDS
/proc/*/stat
IDS-VMVM Shadowinit
・・
firefoxvncservermalware
/proc/ プロセス ID [/task/ スレッド ID] /◦ stat, status
プロセスの状態 サーバ VM のカーネル内の task_struct 構造体から取得
◦ cmdline 実行ファイルのパス、引数 プロセスのメモリから取得
/proc/self/◦ 実行中のプロセス( IDS )の情報
しかし、 IDS プロセスはサーバ VM 上に存在しない◦ IDS-VM の IDS プロセスの情報をコピーする
プロセス情報の構築
/proc/net/◦ tcp, udp, unix
TCP/IP, UDP/IP, UNIX ドメインソケットの情報 サーバ VM のカーネル内の sock 構造体から取得
例: TCP/IP の場合◦ tcp_hashinfo 変数が指すハッシュ表をたどることで取
得できる
ネットワーク情報の構築
サーバ VM
カーネルShadowprocfs
IDS
/proc/net/tcp
IDS-VMVM Shadow tcp_hashinfo
sock
…
VM Shadow を提供するシステム Transcall を開発◦ Xen を使って IDS のオフロードを実現
ドメイン 0 を IDS-VM 、ドメイン U をサーバ VM とする◦ Transcall はカーネルを変更せずに実現
ptrace を用いてシステムコール・エミュレータを実装 FUSE を用いて Shadow proc ファイルシステムを実装
実装
IDS
Linux
サーバ VM( ドメイン U)
IDS-VM( ドメイン 0)
FUSE
Shadow
procfs カーネル
システムコール
エミュレータ
Transc
al
l
カーネル
VM Shadow を用いて既存の IDS がオフロードできるのか実験を行った◦ VM Shadow 内で既存の IDS が正常に監視できるかどう
かの動作テスト◦ VM Shadow 内で動かす IDS の実行時間の測定◦ 既存の ps コマンドを使った隠しプロセスの発見
実験
実験環境•CPU Intel Quad 2.83GHz•メモリ 4GB•Xen3.4.0•IDS-VM Linux2.6.18.8•サーバ VM Linux2.6.27.35
chkrootkit を用いてサーバ VM のルートキットの検出を行った◦ chkrootkit は ps や netstat コマンド等を用いており、
proc ファイルシステムも参照する◦ サーバ VM には改竄された ps コマンドを置いた
chkrootkit の検査に引っ掛かる文字列を埋め込んだ IDS-VM からサーバ VM の改竄された ps コマン
ドを検知できた
実験 1: chkrootkitの動作テスト
実験 2: Tripwireの動作テスト Tripwire を用いてサーバ VM のファイルの整合性チェックを行った◦ サーバ VM でチェックする場合と同じポリシファイルを用
いた◦最初にサーバ VM の「正常な」状態を記録◦ サーバ VM 内で適当なファイルを作成・削除・修正
Tripwire は「追加・削除・修正」されたファイル数を報告◦ IDS-VM からサーバ VM を正しくチェックできた
Added Removed Modified
VM Shadow 内で動かした chkrootkit の実行時間を測定◦ サーバ VM で直接動かした場合の約 1.5倍遅い◦ ps コマンドは約 2.3倍、 netstat コマンドは約 1.1倍
の実行時間がかかっている Shadow proc ファイルシステムを利用するため実行に時間
がかかる
実験 3: chkrootkitの実行時間
ps netstat0
20
40
60
80
100
120
140
160
180
200
59.2
180.4
137.3
190.2
各コマンドの実行時間
サーバ VM での実行
VM Shadow 内での実行
実行時間(ミリ秒)
chkrootkit0
10
20
30
40
50
60
70
38.6
58.5
chkrootkitの実行時間
サーバ VM での実行
VM Shadow 内での実行
実行時間(秒)
VM Shadow 内で動かした Tripwire の実行時間を測定◦ サーバ VM で直接動かした場合より約 1.2倍速い◦ Xen ではドメイン 0 からドメイン U の仮想ディスクにア
クセスするほうが高速 システムコールを ptrace でトラップするオーバヘッドを相殺
実験 4: Tripwireの実行時間
Tripwire0
20
40
60
80
100
120
140
120.8
97.1
Tripwireの実行時間
サーバ VM での実行
VM Shadow 内での実行
実行時間(秒)
VM Shadow を用いて隠しプロセスの発見ができるかどうかの実験を行った◦ VM Shadow 内とサーバ VM 上での ps の実行結果を比較
◦ サーバ VM では init プロセスを隠蔽する改竄された psを実行
隠蔽された init プロセスの発見を行えた
実験 5:隠しプロセスの発見
VMサーバIDS-VM
VIX [Hay et al.’08]◦ IDS-VM からサーバ VM の情報を取得するコマンド群を提
供◦ 提供されているコマンドを使わない IDS は修正が必要
VMwatcher[Jiang et al.’07]◦ IDS-VM で既存のアンチウィルスを動かすことができる◦ サーバ VM のファイルシステムを参照するのみ
スキャンするパスをマウント先に変更する必要がある HyperSpector [Kourai et al.’05]
◦ IDS-VM で既存の IDS を実行できる◦ OS の仮想化機能を利用しているため比較的容易
VM Shadow はシステムレベルの仮想化を前提
関連研究
既存の IDS を変更することなく、オフロードすることを可能にする VM Shadow を提案◦ IDS-VM からサーバ VM を監視するための実行環境
システムコール・エミュレータ、 Shadow ファイルシステムから成る
◦ 既存の chkrootkit 、 tripwire 、 ps 、 netstat の動作を確認できた
今後の課題◦ chkrootkit が様々なルートキットを検出できることを確認する
◦ より多くの既存の IDS を動作させられるようにする
まとめ
IDS-VM
IDS-VM からサーバ VM の監視が行えるか実験を行った◦ VM Shadow 内とサーバ VM 上の chkrootkit の実行結果を比較
◦ 大部分で同じ結果が得られることを確認 まだ対応出来ていない個所がある
実験: chkrootkitの実行
・・・ ・・・
サーバ VM
VM Shadow を用いてネットワーク情報が取得できるかどうかの実験を行った◦ VM Shadow 内とサーバ VM 上の netstat の実行結果を比較
◦ 同じ情報が取得できていることを確認
実験:ネットワーク情報取得
VMサーバIDS-VM
VM Shadow 内で動かした ps コマンドの実行時間を測定◦ サーバ VM で直接動かした場合の 2.3倍◦原因は ptraceおよび FUSE を用いたことによるオーバ
ヘッド◦ サーバ VM からの情報取得のオーバヘッドは含まれない
VM シャドウの作成時に取得しているため
実験: Transcallの性能
平均実行時間(ミリ秒)
ps( サーバ VM) 59.2
VM Shadow+ps(IDS-VM) 137.3
表1 実行速度比較実験環境•CPU Intel Quad 2.83GHz•メモリ 4GB•Xen3.4.0•IDS-VM Linux2.6.18.8•サーバ VM Linux2.6.27.35
シャドウ proc ファイルシステムを完成させる◦ 取得できる情報がまだ不完全
実行中のプログラムのパス名が取得できない 既存の IDS をオフロードできるようにする
◦ chkrootkit netstat コマンドを完全にオフロードできるようにする必要
がある Transcall のオーバヘッドを削減する
◦ カーネルを変更してオーバヘッドを削減する
今後の課題
IDS がアクセスするパスと IDS-VM 上のパスの対応を記述◦ 上から順番に調べ、パスの一部がマッチすれば対応する
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
ptrace システムコールを用いてシステムコールのトラップを行う◦ エミュレートするシステムコールの場合
uname 引数が指すメモリの内容を書き換えて IDS に出力を返す
◦ ファイル関連のシステムコールの場合 open,stat 引数のパス名を置換する
ポリシ /proc /
システムコールのトラップ
IDS
システムコール
エミュレータ
open("/proc")uname(buf)
netstat コマンドは /proc/net を参照しながら実行◦ /proc/net から TCP,UDP の情報を取得
netstatの実行例
サーバ VM
カーネルシャドウprocfsTranscall
PS
IDS-VM
VM シャドウ ps
ps コマンドは /proc を参照しながら実行◦ /proc/self をチェック
サーバ VM 上に ps プロセスは存在しない IDS-VM で実行中の ps プロセスの情報を返す(例外処理)
◦ /proc 上のディレクトリエントリ一覧を取得 サーバ VM 上で動いているプロセスの PID の一覧を返す
◦各プロセスのディレクトリから stat 、 status ファイルを読み込む 実行されている端末、実行時間、コマンド名などを取得
psコマンドの実行例
サーバ VM
カーネルシャドウprocfsTranscall
PS
IDS-VM
VM シャドウ ps
前回◦ access◦ chdir◦ execve◦ open◦ readlink◦ stat◦ uname
VM シャドウ内で行える動作が増加◦ cp,cd など基本的な動作は一通り出来る
対応しているシステムコール追加
◦ chmod◦ chown◦ fchmodat◦ fchownat◦ link◦ lstat◦ mkdir◦ newfstatat◦ openat
◦ rename◦ rmdir◦ statfs◦ symlink◦ unlink◦ unlinkat◦ utime◦ utimensat
サーバ VM のプロセス情報を返すファイルシステム◦ Linux の proc ファイルシステムと同じインタフェース
を提供 /proc/100/stat はサーバ VM 上のプロセス番号 100番のメ
モリ使用量などのプロセス情報を返す◦ プロセス情報はサーバ VM のカーネルメモリから直接取
得 init_task 変数から順番にたどれる task_struct 構造体を参照
◦ ネットワーク情報も同様にサーバ VM のカーネルメモリから直接取得
シャドウ procファイルシステム
サーバ VM
カーネルシャドウprocfs
Transcall
IDS
/proc/100/statinit_task
task_struct
IDS-VMVM シャドウ
カーネルの内部データ構造を基にメモリを解析◦ あらかじめカーネルの型情報やシンボル情報を取得しておく デバッグ情報や System.map を利用 例: init_task( アドレス: 0xffffffff814a8340)
◦ サーバ VM のメモリページを IDS-VM にマップしてアクセス
サーバ VMのカーネル情報の取得
TranscallInit_task
0xffffffff814a83400x2b1ceb7a1340
IDS-VM サーバ VM
追加・削除・修正されたファイルはリスト表示される◦列挙されたファイルを目視でチェックする
実験 2: Tripwireの動作テスト
プログラム
ld.so
Shadowファイルシステ
ム
アドレス空間