仮想マシンモニタによる
きめ細かい
パケットフィルタリング
安積 武志* 光来 健一** 千葉 滋*
*東京工業大学
**九州工業大学
踏み台攻撃
sshで不正にログインされ、他のホストへ攻撃
特定ホストに対して大量のパケットを送信
サービスの妨害
不特定多数のホストにポートスキャン
更なる踏み台を求める
大量の
パケット
検出したらその通信を
即座に制限する必要がある
被害の拡大を防ぐため
対象ホスト
スパム
ソフト
一般的な対処法
外部のファイアウォールによる通信制限
ポートやIPアドレス単位で通信を制限する
踏み台攻撃でない通信まで制限してしまう
制限が大雑把過ぎる
ファイアウォール
メールサーバ
port:25
スパム
ソフト
port:25
sendmail
従来のきめ細かい対処法
サーバ内部で通信制限
OS内部の情報も使って通信を制限する
例:送信元のプロセス名、所有者
ipfwやiptablesで利用可能
通信制限を無効化される恐れがある
メールサーバ
ファイアウォール
port:25
port:25
スパム
ソフト
sendmail
xFliter
仮想マシンモニタ(VMM)におけるきめ細かい
フィルタリング
仮想マシン(VM)でサーバを
立ててVMMでフィルタリング
すべてのパケットを検査できる
VMから隔離されているので安全
ゲストOSの内部のプロセス情報
を利用
VMのメモリを解析して取得
物理マシン
VM
ゲストOS
VMM
xFilter
xFilterの構成
フィルタモジュール
xFilter本体からパケット
情報を受け取る
メモリ解析して必要な情
報を取得
VM
プロセス
ゲストOS
パケット
プロセス名、ユーザIDなど
解析
VMM
フィルタリングルールに基
づいて判断を本体に返す
xFilter
破棄
送信
フィルタ
モジュール
フィルタリングの流れ
VM
xFilterにルールを追加
ルールに基づき特定のプロ
セス、ユーザからの通信のみ
遮断できる
ヘッダ情報からプロセスを特定
スパム
ソフト sendmail
ゲストOS
パケット
プロセス情報を取得
解析
VMM
xFilter
指定するプロセス名、ユーザIDは
通信一覧表示機能から
破棄
送信
フィルタ
モジュール
開発時のシステム構成
ユーザランドでモジュール
を動作
ゲストOSのメモリを参照
するためにVMMの機能
VM
プロセス
解析
フィルタ
モジュール
ゲストOS
メモリマップ
フィルタリング性能は低下
パケット
syscall
VMM
クラッシュしても立ち上げ
なおすだけで良い
VMM内だとシステム全体が
クラッシュする危険性
xFilter
破棄
送信
Xenを用いた実装
VMMとして Xen、ゲストOSとして Linux を使用
ドメインUからのパケットはドメイン0を通過
netfrontからnetbackへ
netbackから実ドライバへ
netbackと実ドライバの間
にxFilterを実装
domain0
process
driver netback
xFilter
domainU
フィルタモジュールとは
ハイパーコールでやり取り
hypercall
module
netfront
メモリ
解析
Xen VMM
メモリ解析
型情報を用いてゲストOSのメモリを解析
型情報はカーネルのデバッグ情報より取得
init_task
プロセスID順に
リンクされている
task_struct
files_struct
fdtab
file
private_data
task_struct ・・・ task_struct
files
ルールに一致
プロセス名
すればsock
fdtable
ユーザID
までたどる
fd
を取得
socket
sk
sock
ポートやIP
アドレスなど
の情報
を取得
一貫性
メモリ解析の前にゲストOSをpause
カーネルがtask_structを操作していないことを確認
task_structのリストの spinlock をチェック
ロックが取られていなければメモリ解析を行う
メモリ解析の後にゲストOSをunpause
アドレス変換
VMMからゲストOSにアクセスするためには
アドレス変換が必要
ドメインU上のアドレスは仮想アドレスを使用
VMM上ではマシンメモリアドレスを使用
仮想メモリ
マシンメモリ
VM
ページ
テーブル
task_struct{
pid
}
task_struc{
pid
}
VMM 仮想アドレス
変換
xFilter
テーブル
マシン
アドレス
解析結果のキャッシュ
TCP通信に関しては検査結果をキャッシュする
同一コネクションの通信は結果が変わらない
パケットのTCPヘッダを解析してフラグを取得
SYN:コネクションの確立
→フィルタリング結果をキャッシュ
FIN:コネクションの終了
→キャッシュからエントリを削除
パケット
受信
xFilter
miss フィルタ
キャッシュ
モジュール
hit
ユーザランドの実装
メモリマップ
ページテーブルを引いて
マシンメモリを取得
ドメイン0のプロセスの
アドレス空間にマップ
Xenの機能を用いる
domain0
domainU
メモリ
解析
module
syscall
xFilter
driver netback
システムコールで本体に
解析結果を通知
process
Xen VMM
netfront
一括検査
キューにためておいてまとめて検査
パケット到着毎だとオーバーヘッドが大きい
メモリ解析には時間がかかる
その間は一貫性のためにゲストOSを停止
検査を行う代わりにパケットをキューに入れる
一定時間毎にキュー内の パケット
受信
パケットをすべて検査
xFilter
一回のメモリ解析で検査できる
キュー
フィルタ
モジュール
実験
xFilterのオーバーヘッドを測定
ドメインU上で Apache 2.0 を動作
クライアントマシンで httperf 0.9.0 を動作
3918byteのHTMLファイルにリクエストを送信
パケットの送信が許可されている状態で測定
実験環境
Intel Core i7 860
Xen 3.4.2 (x86_64)
domain0:Linux 2.6.18.8, 7Gbyte
domainU:Linux 2.6.18.8, 1Gbyte
ルールに一致するプロセスがない状態での性能を測定
リクエストのレートを100、200、300、400、500のそれぞれ
について測定した
リクエスト処理時間はコネクションを張り始めてから終了するま
での時間
0.45
実験結果
レート500まで処理時間に
影響はなかった
メモリ解析にかかる時間は
平均19μsだった
リクエスト処理時間(ms)
0.4
0.35
0.3
0.25
xFilterあり
xFilterなし
0.2
0.15
0.1
0.05
0
100
200
300
リクエストレート
400
500
検査するソケット数と性能
ルールに指定したプロセスがオープンしているソケット
数を変えてオーバーヘッドを測定
ソケット数0、10、20、30、40、50で測定
0.7
実験結果
ルールにマッチするソケット数
が増えると、オーバーヘッドが
大きくなる
メモリ解析にかかる時間も
同様に増加
50ソケットで平均35μs
0.6
リクエスト処理時間(ms)
0.5
0.4
xFilterあり
xFilterなし
0.3
0.2
0.1
0
10
20
30
ソケット数
40
50
キャッシュを有効にした場合
検査結果をキャッシュした場合の性能を測定
リクエストレートは100req/s
ルールにマッチするソケットを50
0.7
実験結果
オーバーヘッドを削減できた
一旦コネクションを張れば結果
がキャッシュされるため
レスポンス性能が向上
→キャッシュは充分に効果がある
0.6
リクエスト処理時間(ms)
0.5
0.4
レスポンス
コネクション
0.3
0.2
0.1
0
xFilterなし
キャッシュon
キャッシュoff
開発時の性能
ドメイン0でフィルタモジュールを動作させた場合の
性能を測定
ルールに一致するプロセスがない状態の性能
35
実験結果
毎秒100リクエストでもかなり
大きなオーバーヘッド
レートが上がるとさらに増加
開発時であれば問題ない
実用には使えない
30
リクエスト処理時間(ms)
25
20
xFilterあり
xFilterなし
15
10
5
0
100
200
リクエストレート
300
関連研究
Livewire [Gerfinkel et al. ’03]
identd [RFC 1413]
VMMでVMの侵入検知
VMのメモリを解析してプロセスの情報を取得
TCPを張ったユーザのIDを取得することができる
正しい情報を返す保証がない
ステートフルインスペクション
SYNパケットはルールベースで、それ以降はステート
テーブルでチェック
まとめと今後の課題
xFilterを用いたVMMによるフィルタリングを提案
送信元のプロセスやユーザを指定してフィルタリング
踏み台攻撃に対して安全かつきめ細かい通信制限が可能
VMのメモリを解析してゲストOS内の情報を取得
カーネルの型情報を利用
今後の課題
ルールの実装を完成させる
受信パケットについても実装を行う
現在は送信パケットのみの実装
© Copyright 2026 ExpyDoc