IDS - KSL

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