24
仮仮仮仮仮仮仮仮仮 仮仮 IDS 仮仮仮仮仮仮 九九九九九九 九九九九 九九九九九九JST CREST 九九九

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

  • Upload
    nariko

  • View
    74

  • Download
    0

Embed Size (px)

DESCRIPTION

仮想マシンを用いた 既存 IDS のオフロード. 九州工業大学 飯田貴大 九州工業大学/ JST CREST 光来健一. 侵入検知システム( IDS ). IDS は攻撃者の侵入を検知するために用いられる ファイル、ネットワーク、 OS などを監視 例: chkrootkit 攻撃者によって仕込まれた rootkit を発見 rootkit はファイルの改ざん等を行う攻撃者用ツール IDS が攻撃を受けると検知できなくなる ps コマンドが置き換えられると chkrootkit が騙される. 攻撃者. サーバ. chkrootkit. コマンド群. 置換. - PowerPoint PPT Presentation

Citation preview

Page 1: 仮想マシンを用いた 既存 IDS のオフロード

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

九州工業大学飯田貴大

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

Page 2: 仮想マシンを用いた 既存 IDS のオフロード

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

攻撃者によって仕込まれた rootkitを発見 rootkitはファイルの改ざん等を行う攻撃者用ツール

IDSが攻撃を受けると検知できなくなる◦ psコマンドが置き換えられると chkrootkitが騙される

侵入検知システム( IDS)

chkrootkit

攻撃者

rootkit

サーバ

コマンド群 置換

Page 3: 仮想マシンを用いた 既存 IDS のオフロード

サーバを仮想マシン上で動かし、 IDSだけ別の仮想マシン上で動かす手法◦ IDSが停止される恐れがない◦ IDSの設定ファイルやデータベースを変更される恐れがない

◦ログが改ざんされる恐れがない

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

IDS-VM サーバ VM 攻撃者

IDS

サーバ

侵入

Page 4: 仮想マシンを用いた 既存 IDS のオフロード

サーバ VMを監視するように IDSを修正する必要がある◦単純に IDS-VMで動かすだけでは IDS-VMの監視を行ってしまう chkrootkitの psは IDS-VMのプロセス情報を返す

◦ VMをまたがって監視を行うには特殊なアクセス方法を用いる必要がある 例:サーバ VMのメモリを覗く

VMwatcher [Jiang et al.’07] VIX [Hay et al.’08]

IDSをオフロードする際の問題

IDS-VM サーバ VM

IDSIDS

サーバ VMの監視

IDS-VMの監視

Page 5: 仮想マシンを用いた 既存 IDS のオフロード

IDSに修正を加えることなくオフロードを可能にするシステム◦サーバ VMの監視を行うための実行環境である VMシャドウを提供 VMシャドウ内の IDSはサーバ VM内と同様に実行できる

◦サーバ VMの情報を安全に取得

提案: Transcall

VMシャドウIDS

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

シャドウファイルシステ

ムTranscall

サーバ VMIDS-VM

Page 6: 仮想マシンを用いた 既存 IDS のオフロード

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

カーネルについての情報の取得◦不必要なら IDS-VMのカーネルにシステムコールを発行

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

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

VMシャドウIDS

システムコール

エミュレータTranscall

サーバ VMIDS-VM

カーネルカーネル

Page 7: 仮想マシンを用いた 既存 IDS のオフロード

unameシステムコールが返す情報をサーバ VMから取得◦サーバ VMのカーネルメモリの中から utsname構造体を発見 カーネル名、ホスト名、バージョン等が格納されている init_task変数からたどることができる

◦ unameが返す情報を上書き

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

VMシャドウIDS

システムコール

エミュレータTranscall

サーバ VMIDS-VM

カーネルカーネル

unameinit_task

Linuxserver-vm2.6.27.35

task_struct utsname

Page 8: 仮想マシンを用いた 既存 IDS のオフロード

サーバ VMのカーネルが改ざんされない限り、正しい情報を取得できる◦サーバ VMへの RPCは脆弱

システムコールをサーバ VM上で実行させその結果を取得 RPCサーバが改ざんされると偽の情報を返される可能性がある OS名を改ざんされると OSに依存した攻撃を見逃す危険性

サーバVMのメモリを直接見る必要性

Transcall

VMシャドウIDS

サーバ VMIDS-VM

RPCサーバ

カーネル

uname uname

攻撃

Page 9: 仮想マシンを用いた 既存 IDS のオフロード

VMシャドウ内の IDSからサーバ VMで使われているファイルシステム全体を参照可能◦サーバ VMの仮想ディスク

仮想ディスクを VMシャドウのルートにマウント ファイルシステムの整合性を保つために読み込み専用でマウント

◦特殊なファイルシステム サーバ VMを参照してエミュレート

proc、 sys、 dev

シャドウファイルシステム

VMシャドウIDS

シャドウファイルシステム

カーネル

Transcall

サーバ VMIDS-VM

仮想ディスク

シャドウファイルシステム

Page 10: 仮想マシンを用いた 既存 IDS のオフロード

サーバ VMのプロセス情報を返すファイルシステム◦ Linuxの procファイルシステムと同じインタフェースを提供 /proc/PID/statはサーバ VM上のプロセス番号 PIDのプロセス情報を返す

◦プロセス情報はサーバ VMのカーネルメモリから直接取得 init_task変数から順番にたどれる task_struct構造体を参照

◦ VMシャドウの /procにマウントする

シャドウ procファイルシステム

サーバ VM

カーネルシャドウprocfs

Transcall

IDS

/proc/100/statinit_task

task_struct

IDS-VMVMシャドウ

Page 11: 仮想マシンを用いた 既存 IDS のオフロード

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

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

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

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

psコマンドの実行例

サーバ VM

カーネルシャドウprocfsTranscall

PS

IDS-VM

VMシャドウ ps

Page 12: 仮想マシンを用いた 既存 IDS のオフロード

VMシャドウ内の IDSが IDS-VM上のファイルを使うことを可能にする◦デフォルトではサーバ VM上のファイルにアクセス◦設定ファイルやログなどは IDS-VM上のファイルを使うようにポリシを記述 サーバ VMの攻撃者に改ざんされるのを防ぐ

Transcallのポリシファイル

Transcall

ポリシファイルIDS

/var/log/a.log

/boot/vmlinuz

IDS-VM サーバ VMVMシャドウ

Page 13: 仮想マシンを用いた 既存 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 14: 仮想マシンを用いた 既存 IDS のオフロード

Xenを使って IDSのオフロードを実現◦ドメイン 0を IDS-VM、ドメイン Uをサーバ VMとする

Transcallはカーネルを変更せずに実現◦システムコールエミュレータの子プロセスとして IDSを実行

◦ FUSEを用いてシャドウ procファイルシステムを実装

実装

IDS

Linux

ドメイン U

ドメイン 0

FUSE

シャドウ

procfs カーネル

システムコール

エミュレータ

Transc

al

l

カーネル

Page 15: 仮想マシンを用いた 既存 IDS のオフロード

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

uname 引数が指すメモリの内容を書き換える

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

ポリシ /proc /

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

IDS

システムコール

エミュレータ

open("/proc")uname(buf)

Page 16: 仮想マシンを用いた 既存 IDS のオフロード

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

◦サーバ VMのメモリページを IDS-VMにマップしてアクセス 仮想アドレス→疑似物理アドレス→マシンアドレスへの変換

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

ページテーブル

VMM

Transcall

P2Mテーブル

1

2 3 ターゲット

Page 17: 仮想マシンを用いた 既存 IDS のオフロード

VMシャドウ内で動かした psコマンドの実行時間を測定◦サーバ VMで直接動かした場合の 3.3 倍◦ 原因は ptraceおよび FUSEを用いたことによるオーバ

ヘッド◦サーバ VMからの情報取得のオーバヘッドは含まれない

VMシャドウの作成時に取得しているため

実験: Transcallの性能

平均実行時間(ミリ秒)

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

Page 18: 仮想マシンを用いた 既存 IDS のオフロード

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

較◦サーバ VMでは initプロセスを隠蔽する psコマンドを実行

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

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

VMサーバIDS-VM

Page 19: 仮想マシンを用いた 既存 IDS のオフロード

HyperSpector [Kourai et al.’05] ◦ IDS-VMからサーバ VMを監視するシステム

シャドウファイルシステム、シャドウプロセスを提供 既存の IDSが利用可能だが、設定の変更は必要

◦ OSの仮想化機能を利用 名前空間の操作だけでサーバ VMの情報を参照できる Transcallはシステムレベルの仮想化を前提

サーバ VMの情報を取得するのは容易ではない

関連研究 (1/2)

Page 20: 仮想マシンを用いた 既存 IDS のオフロード

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のカーネルの修正が必要

関連研究 (2/2)

Page 21: 仮想マシンを用いた 既存 IDS のオフロード

既存の IDSを変更することなく、 VMを用いてオフロードできるようにするシステム Transcallを提案◦ VMシャドウ内で IDSを動作させる

IDS-VMからサーバ VMを監視するための実行環境◦ Transcallの構成

システムコール・エミュレータ シャドウファイルシステム

シャドウ procファイルシステム ポリシファイル

◦ 既存の psを動作させて隠しプロセスを見つけられた

まとめ

Page 22: 仮想マシンを用いた 既存 IDS のオフロード

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

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

◦ Tripwire ポリシファイルの実装を完成させる必要がある

◦ chkrootkit netstatコマンドもオフロードできるようにする必要がある

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

今後の課題

Page 23: 仮想マシンを用いた 既存 IDS のオフロード
Page 24: 仮想マシンを用いた 既存 IDS のオフロード

仮想ディスクが LVMを使っている場合◦仮想ディスクに使われているループバックデバイスを探す /dev/loop1

◦見つかったループバックデバイスに対してデバイスマップを作成 LVMでなければ作成したデバイスを直接マウント可能

◦ 物理ボリュームを探してから、論理ボリュームを探す 物理ボリューム名が一意である必要 /dev/VolGroupXen00/LogVol00

◦ 論理ボリュームをアクティブにしてマウント

仮想ディスクのマウント