vm shadow: 既存 ids を オフロードするための実行環境

38
VM Shadow: 既既 IDS 既 既既既既既既既既既既既既既既 九九九九九九 九九九九 九九九九九九JST CREST 九九九

Upload: maile-payne

Post on 01-Jan-2016

45 views

Category:

Documents


2 download

DESCRIPTION

VM Shadow: 既存 IDS を オフロードするための実行環境. 九州工業大学 飯田貴大 九州工業大学/ JST CREST 光来健一. 侵入検知システム( IDS ). IDS は攻撃者の侵入を検知するために用いられ る ファイル、ネットワーク、 OS などを監視 IDS が攻撃を受けると検知できなくなる 例: Tripwire のポリシファイルやデータベースが改竄されると Tripwire が騙される. 攻撃者. IDS. 異常. bin. config. 仮想マシンを用いた IDS のオフロード. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: VM Shadow: 既存 IDS を オフロードするための実行環境

VM Shadow: 既存 IDSをオフロードするための実行環境

九州工業大学飯田貴大

九州工業大学/ JST CREST光来健一

Page 2: VM Shadow: 既存 IDS を オフロードするための実行環境

IDS は攻撃者の侵入を検知するために用いられる◦ ファイル、ネットワーク、 OS などを監視

IDS が攻撃を受けると検知できなくなる◦ 例: Tripwire のポリシファイルやデータベースが改竄さ

れると Tripwire が騙される

侵入検知システム( IDS)

IDS

攻撃者

異常

bin

config

Page 3: VM Shadow: 既存 IDS を オフロードするための実行環境

サーバを仮想マシン (VM) 上で動かし、 IDS だけ別の仮想マシン上で動かす手法◦ IDS が攻撃の影響を受けにくくなる

サーバ VM に侵入した攻撃者から実行ファイルや設定ファイル等を改竄されることはない

◦ IDS-VM はサービスを提供しないため脆弱性を利用した攻撃はされにくい

仮想マシンを用いた IDSのオフロード

IDS-VM サーバ VM 攻撃者

サーバ

IDS

bin

config

Page 4: VM Shadow: 既存 IDS を オフロードするための実行環境

オフロードすると既存の IDS を使えなくなる◦ 単純に動かすだけでは IDS-VM の監視を行ってしまう◦ サーバ VM を監視するように IDS を修正するのは大変

内部構造を基にサーバ VM のメモリを解析する必要がある カーネル内部のプロセスの情報を取得

マウントしたサーバ VM のディスクを監視するために監視対象のパスの書き換えが必要となる 設定ファイルやプログラム本体

既存の IDSへの修正が必要

IDS-VM サーバ VM

IDS

カーネル

メモリ解析

仮想ディスク

パスの書き換え

Page 5: VM Shadow: 既存 IDS を オフロードするための実行環境

オフロードした既存の IDS に修正を加えることなく動作させることを可能にする実行環境◦ IDS-VM からサーバ VM の監視を行える◦ サーバ VM 内で実行しているかのように IDS を実行でき

る◦ サーバ VM のカーネルが攻撃されない限り安全に監視で

きる

提案: VM Shadow

VM Shadow

IDS

サーバ VMIDS-VM

VM Shadow

IDS

サーバ VM

Page 6: VM Shadow: 既存 IDS を オフロードするための実行環境

システムコールのエミュレーション◦ IDS がシステムコールを使ってサーバ VM の情報を取得

できるようにする Shadow ファイルシステムの提供

◦ サーバ VM のファイルシステムを同じ名前空間で提供する proc ファイルシステムも含めて

◦ ただし、 IDS の実行には IDS-VM 上のファイルを使わせる

VM Shadowの実現

VM Shadow

IDS

IDS-VM

システムコールエミュレータ

Shadowファイルシステ

サーバVM

Page 7: VM Shadow: 既存 IDS を オフロードするための実行環境

VM Shadow 内の IDS が発行したシステムコールに対して必要に応じてサーバ VM の情報を返す◦ 必要ならサーバ VM のカーネルを解析して情報を取得

サーバ VM についての情報の取得◦ それ以外は IDS-VM のカーネルにシステムコールを発行

メモリ管理 ネットワーク処理

システムコール・エミュレータ

VM Shadow

IDS

システムコール

エミュレータ

サーバ VMIDS-VM

カーネルカーネル

Page 8: VM Shadow: 既存 IDS を オフロードするための実行環境

uname システムコールが返す情報をサーバ VMから取得◦ サーバ VM のカーネルメモリの中から utsname 構造体

を発見 カーネル名、ホスト名、バージョン等が格納されている init_task 変数からたどることができる

例 :unameのエミュレーション

VM Shadow

IDS

システムコール

エミュレータ

サーバ VMIDS-VM

カーネルカーネル

uname

init_task

Linuxserver-vm2.6.27.35

task_struct utsname

Page 9: VM Shadow: 既存 IDS を オフロードするための実行環境

VM Shadow 内の IDS からサーバ VM で使われているファイルシステム全体を参照可能◦ サーバ VM の仮想ディスクを読み込み専用でマウント

整合性を保つため◦ サーバ VM と同じ名前空間を提供

マウント先がルートディレクトリになるようにファイル関連のシステムコールをエミュレーション

例: /home/vm1→/

Shadowファイルシステム

VM Shadow

IDS

Shadowファイルシステム

サーバ VMIDS-VM

仮想ディスク

Page 10: VM Shadow: 既存 IDS を オフロードするための実行環境

実行するためにファイルを読み込む時には安全のために IDS-VM のファイルを参照する◦ 実行ファイル

execve システムコールによる読み込みは IDS-VM から◦ 通常の読み込みの場合にはサーバ VM のファイルを参照

実行されるファイルの監視も行える

実行ファイルの参照

VM Shadow

IDS

Shadowファイルシステ

サーバ VMIDS-VM

仮想ディスク

open

execve

Page 11: VM Shadow: 既存 IDS を オフロードするための実行環境

共有ライブラリの読み込みも IDS-VM から行う◦ プログラムに埋め込まれたダイナミックリンカ (ld.so)

が読み込む システムコールでは通常の読み込みと区別できない

◦ open システムコールが発行されたレジスタの値で区別する ダイナミックリンカのレジスタの値なら IDS-VM から それ以外ならサーバ VM から

共有ライブラリの参照

VM Shadow

Shadowファイルシステ

サーバ VMIDS-VM

仮想ディスク

プログラム

ld.so

プログラム ld.so

Page 12: VM Shadow: 既存 IDS を オフロードするための実行環境

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 がアクセスするパ

Page 13: VM Shadow: 既存 IDS を オフロードするための実行環境

サーバ VM の OS 内の情報を返すファイルシステム◦ Linux の proc ファイルシステムと同じインタフェース

を提供◦ プロセスやネットワーク、システムの情報を返す

例: /proc/*/stat◦ VM Shadow 作成時にサーバ VM のメモリを解析して構

築 アクセスのたびにメモリ解析を行うのはオーバヘッドが大き

いため

Shadow procファイルシステム

サーバ VM

カーネルShadowprocfs

IDS

/proc/*/stat

IDS-VMVM Shadowinit

・・

firefoxvncservermalware

mail

Page 14: VM Shadow: 既存 IDS を オフロードするための実行環境

/proc/ プロセス ID [/task/ スレッド ID] /◦ stat, status

プロセスの状態 サーバ VM のカーネル内の task_struct 構造体から取得

◦ cmdline 実行ファイルのパス、引数 プロセスのメモリから取得

/proc/self/◦ 実行中のプロセス( IDS )の情報

しかし、 IDS プロセスはサーバ VM 上に存在しない◦ IDS-VM の IDS プロセスの情報をコピーする

プロセス情報の構築

Page 15: VM Shadow: 既存 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

Page 16: VM Shadow: 既存 IDS を オフロードするための実行環境

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

カーネル

Page 17: VM Shadow: 既存 IDS を オフロードするための実行環境

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

Page 18: VM Shadow: 既存 IDS を オフロードするための実行環境

chkrootkit を用いてサーバ VM のルートキットの検出を行った◦ chkrootkit は ps や netstat コマンド等を用いており、

proc ファイルシステムも参照する◦ サーバ VM には改竄された ps コマンドを置いた

chkrootkit の検査に引っ掛かる文字列を埋め込んだ IDS-VM からサーバ VM の改竄された ps コマン

ドを検知できた

実験 1: chkrootkitの動作テスト

Page 19: VM Shadow: 既存 IDS を オフロードするための実行環境

実験 2: Tripwireの動作テスト Tripwire を用いてサーバ VM のファイルの整合性チェックを行った◦ サーバ VM でチェックする場合と同じポリシファイルを用

いた◦最初にサーバ VM の「正常な」状態を記録◦ サーバ VM 内で適当なファイルを作成・削除・修正

Tripwire は「追加・削除・修正」されたファイル数を報告◦ IDS-VM からサーバ VM を正しくチェックできた

Added Removed Modified

Page 20: VM Shadow: 既存 IDS を オフロードするための実行環境

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 内での実行

実行時間(秒)

Page 21: VM Shadow: 既存 IDS を オフロードするための実行環境

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 内での実行

実行時間(秒)

Page 22: VM Shadow: 既存 IDS を オフロードするための実行環境

VM Shadow を用いて隠しプロセスの発見ができるかどうかの実験を行った◦ VM Shadow 内とサーバ VM 上での ps の実行結果を比較

◦ サーバ VM では init プロセスを隠蔽する改竄された psを実行

隠蔽された init プロセスの発見を行えた

実験 5:隠しプロセスの発見

VMサーバIDS-VM

Page 23: VM Shadow: 既存 IDS を オフロードするための実行環境

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 はシステムレベルの仮想化を前提

関連研究

Page 24: VM Shadow: 既存 IDS を オフロードするための実行環境

既存の IDS を変更することなく、オフロードすることを可能にする VM Shadow を提案◦ IDS-VM からサーバ VM を監視するための実行環境

システムコール・エミュレータ、 Shadow ファイルシステムから成る

◦ 既存の chkrootkit 、 tripwire 、 ps 、 netstat の動作を確認できた

今後の課題◦ chkrootkit が様々なルートキットを検出できることを確認する

◦ より多くの既存の IDS を動作させられるようにする

まとめ

Page 25: VM Shadow: 既存 IDS を オフロードするための実行環境
Page 26: VM Shadow: 既存 IDS を オフロードするための実行環境

IDS-VM

IDS-VM からサーバ VM の監視が行えるか実験を行った◦ VM Shadow 内とサーバ VM 上の chkrootkit の実行結果を比較

◦ 大部分で同じ結果が得られることを確認 まだ対応出来ていない個所がある

実験: chkrootkitの実行

・・・ ・・・

サーバ VM

Page 27: VM Shadow: 既存 IDS を オフロードするための実行環境

VM Shadow を用いてネットワーク情報が取得できるかどうかの実験を行った◦ VM Shadow 内とサーバ VM 上の netstat の実行結果を比較

◦ 同じ情報が取得できていることを確認

実験:ネットワーク情報取得

VMサーバIDS-VM

Page 28: VM Shadow: 既存 IDS を オフロードするための実行環境

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

Page 29: VM Shadow: 既存 IDS を オフロードするための実行環境

シャドウ proc ファイルシステムを完成させる◦ 取得できる情報がまだ不完全

実行中のプログラムのパス名が取得できない 既存の IDS をオフロードできるようにする

◦ chkrootkit netstat コマンドを完全にオフロードできるようにする必要

がある Transcall のオーバヘッドを削減する

◦ カーネルを変更してオーバヘッドを削減する

今後の課題

Page 30: VM Shadow: 既存 IDS を オフロードするための実行環境

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

Page 31: VM Shadow: 既存 IDS を オフロードするための実行環境

ptrace システムコールを用いてシステムコールのトラップを行う◦ エミュレートするシステムコールの場合

uname 引数が指すメモリの内容を書き換えて IDS に出力を返す

◦ ファイル関連のシステムコールの場合 open,stat 引数のパス名を置換する

ポリシ /proc /

システムコールのトラップ

IDS

システムコール

エミュレータ

open("/proc")uname(buf)

Page 32: VM Shadow: 既存 IDS を オフロードするための実行環境

netstat コマンドは /proc/net を参照しながら実行◦ /proc/net から TCP,UDP の情報を取得

netstatの実行例

サーバ VM

カーネルシャドウprocfsTranscall

PS

IDS-VM

VM シャドウ ps

Page 33: VM Shadow: 既存 IDS を オフロードするための実行環境

ps コマンドは /proc を参照しながら実行◦ /proc/self をチェック

サーバ VM 上に ps プロセスは存在しない IDS-VM で実行中の ps プロセスの情報を返す(例外処理)

◦ /proc 上のディレクトリエントリ一覧を取得 サーバ VM 上で動いているプロセスの PID の一覧を返す

◦各プロセスのディレクトリから stat 、 status ファイルを読み込む 実行されている端末、実行時間、コマンド名などを取得

psコマンドの実行例

サーバ VM

カーネルシャドウprocfsTranscall

PS

IDS-VM

VM シャドウ ps

Page 34: VM Shadow: 既存 IDS を オフロードするための実行環境

前回◦ 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

Page 35: VM Shadow: 既存 IDS を オフロードするための実行環境

サーバ 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 シャドウ

Page 36: VM Shadow: 既存 IDS を オフロードするための実行環境

カーネルの内部データ構造を基にメモリを解析◦ あらかじめカーネルの型情報やシンボル情報を取得しておく デバッグ情報や System.map を利用 例: init_task( アドレス: 0xffffffff814a8340)

◦ サーバ VM のメモリページを IDS-VM にマップしてアクセス

サーバ VMのカーネル情報の取得

TranscallInit_task

0xffffffff814a83400x2b1ceb7a1340

IDS-VM サーバ VM

Page 37: VM Shadow: 既存 IDS を オフロードするための実行環境

追加・削除・修正されたファイルはリスト表示される◦列挙されたファイルを目視でチェックする

実験 2: Tripwireの動作テスト

Page 38: VM Shadow: 既存 IDS を オフロードするための実行環境

プログラム

ld.so

Shadowファイルシステ

アドレス空間