slide (PowerPoint)
Download
Report
Transcript slide (PowerPoint)
異常検知システムにおける
正常動作データのモジュール化
大山恵弘 (科学技術振興事業団)
王維
(筑波大学)
加藤和彦 (筑波大学・科学技術振興事業団)
2002/11/19
コンピュータシステム・シンポジウム
1
研究の背景
セキュリティへの脅威が依然として存在
ウィルス、トロイの木馬、Buggyなプログラム
対策
脆弱性の除去:
異常の早期発見:
2002/11/19
Non-executable stack、型安全な言語、…
アンチウィルス、侵入検知システム、…
コンピュータシステム・シンポジウム
2
侵入検知システム
「異常」のDBを保持 「正常」のDBを保持
ネットワーク
を監視
ホストの動作
を監視
多くの
Network IDS
アンチウィルス
ホストベース
異常検知システム
異常検知システム
基本アイデア
プログラムの正しい動きを表現するDB
(正常動作データ)を作成
プログラムの実行を監視
正常動作データに合わない実行 = 異常
長所
未知の攻撃・異常を検知可能
本研究の目的
独立したコンポーネントを組み合わせた
アプリケーションに適した異常検知システム
ライブラリ、モジュール、外部プログラム、、、
発表の流れ
既存の異常検知システム(3分)
SQUIDS: 我々の異常検知システム(9分)
実験結果(4分)
関連研究(1分)
結論と今後の課題(2分)
2002/11/19
コンピュータシステム・シンポジウム
6
正常動作データ
材料?
パケットの内容
バッファの内容
キーストローク
システムコール
作成方法?
ソースコードから自動生成する
人間が全部書く
機械学習させる
近年活発に
研究されている
システムコール列の学習に基づく
異常検知システム
正常動作データの作り方
実際に発行されたシステムコール列を記録
記録された動作を一般化
既存システム
2002/11/19
計算機免疫系 [Hofmeyr et al. ’98]
オートマトンの自動生成 [Sekar et al. ’01]
テキスト分類による方法 [Liao et al. ’02]
コンピュータシステム・シンポジウム
8
既存の方法 [Sekar et al. ’01]
訓練モード:
システムコールでアプリケーション停止
システムコール、PC等の情報を記録
オートマトン(正常動作データ)作成
検査モード:
システムコールでアプリケーション停止
実行がオートマトンに合っているか検査
既存の方法 [Sekar et al. ’01]
httpd
read
0x600412dc
open
0x3fc08070
fstat
0x3fc08094
mmap
0x600412dc
write
0x600412dc
…
既存の異常検知システムの特徴
アプリケーションごとに「正常」を定義
計算機免疫系 [Hofmeyr et al. ’98]
オートマトンの自動生成 [Sekar et al. ’01]
テキスト分類による方法 [Liao et al. ’02]
etc.
我々の着眼
アプリケーション = コンポーネントの集合体
「アプリケーションってどこからどこまで?」
UNLHA.DLLはアプリケーションに含まれるんでしょうか?
VBランタイムは? libgtkは? libxmlは?
ライブラリを変えたら、アプリケーションの正常動作データは
使えなくなる? それはいやだ!
「結合されるコンポーネントが実行時に初めて決まる
アプリケーションもありますよ」
2002/11/19
臨機応変に動的リンクするアプリケーションでは、「正常」も
めまぐるしく変わるぞ!
コンピュータシステム・シンポジウム
12
我々のアプローチ
鍵アイデア:
コンポーネントごとに正常動作データを作る
正常動作をオートマトンで表現
Sekarの方法をベースに設計
異常検知システムSQUIDS
© Heather Bruton
直感的なイメージ(1)
キメラの正しい動作を
どう記述するか?
© Chimera project in CMU
キメラの動作が正常 =
ライオンの動作が正常
∧ 羊の動作が正常
∧ 蛇の動作が正常
∧ 動物間の相互作用が正常
直感的なイメージ(2)
mod_ssl
libc
httpd
mod_perl
アプリケーションの動作が正常 =
各コンポーネントの動作が正常
∧ コンポーネント間の相互作用が正常
SQUIDSが作る正常動作データ
現在は共有ライブラリ境界をコンポーネント
境界として使用
SQUIDSが作る正常動作データ
libc
httpd
libc:fopen
0x3fc08070
…
stat
open
libc:fread
0x3fc08094
…
fread
mmap
…
libapr:xxx
0x600412dc
fopen
…
read
SQUIDSのセールスポイント
各コンポーネントの正常動作データを
再利用できる
正常動作データの作成・維持の手間を軽減
異常の場所をピンポイントに特定できる
2002/11/19
コンピュータシステム・シンポジウム
18
再利用
mod_ssl
libc
my_libc
httpd
mod_perl
再利用
mod_ssl
libc
my_libc
httpd
mod_perl
正常動作データcarryingライブラリ
再利用
httpd
mod_ssl
libc
my_libc
どこかの誰かが作った
データを再利用
mod_perl
以降も使用可
ピンポイント異常特定
既存のシステム(ex. 計算機免疫系)
「どこの部分がどう悪いのかわかりませんが、
とにかく異常が発生したみたいです」
SQUIDS
「libc.so:fopenの内部の動きが異常です」
「httpdでPCが0xef804から0x62eda0に
遷移してますが、それは異常です」
「httpdがlibgtkを呼ぶ異常が発生してます」
スタックとオートマトンの対応づけ
0x123c
fopen
fprintf
open
…
fopen
…
fopen
0x123c
…
open
httpd
実装の詳細(1)
環境: Linux/x86
我々が作ったloadable kernel module
によりシステムコールフックを実現
プロセスをfork
2002/11/19
親プロセス:監視
子プロセス:アプリケーションを実行
コンピュータシステム・シンポジウム
24
実装の詳細(2)
procfsの情報を使って、アプリケーションの
フレームと共有ライブラリのフレームを区別
mmap-edメモリ内のPC = 共有ライブラリ
nmコマンドの出力情報に基づいて、PCから
関数名を取得
brkシステムコールは無視
2002/11/19
コンピュータシステム・シンポジウム
25
実験
Redhat Linux 7.1 on i386
Kernel 2.4.7, glibc 2.2.4
スタンドアロンマシンでhttpd, ftpd, sshd
を実行
2つを比較
Sekarの方法: アプリケーションごとにオートマトン作成
我々の方法: コンポーネントごとにオートマトン作成
ライブラリのオートマトンの再利用
httpdの実行で作った
httpdバイナリの
正常動作データ
ftpdとsshdの実行で
作った、共有ライブラリの
正常動作データ
合体!
httpd全体の
正常動作データ
これを初期データとして
正常動作データを作成
結果
ftpdとsshdの実行で
作った正常動作データ
•libc: 671枝
•非libcライブラリ: 389枝
httpdの実行で追加
された正常動作データ
+
httpdの正常動作を表現するデータ:
libcに関して 98.1%
非libcライブラリに関して 93.7%
がftpd, sshdと共有されている
•libc: 13枝
•非libcライブラリ: 26枝
正常動作データの
再利用は現実的
異常の検知率
人工的に異常を発生させた効果を作りつつ
httpdを実行
システムコールを10回に1回別のものに変更
httpd
ftpd
sshd
Sekarの方法 943/949
(99.4%)
426/429
(99.3%)
3411/3480
(98.0%)
938/949
(98.8%)
424/429
(98.8%)
3369/3480
(96.8%)
我々の方法
偽警報(false alarm)の数
httpdを異常検知しながら実行
Mozillaで様々な要求を発行
httpdは全部で8000回システムコールを実行
結果
2002/11/19
Sekarの方法: 62回(0.8%)
我々の方法: 30回(0.4%)
コンピュータシステム・シンポジウム
30
異常検知の導入によるhttpdの
スループットの低下
httpdと同じホストでの
wget –r http://localhost:8080/
の完了にかかる時間を測定
50
40
実行時間(秒)
30
20
10
0
異常検知なし
異常検知あり
正常動作データの総サイズ
オートマトンの枝数
3000
libraries
sshd w/o ibs
ftpd w/o libs
httpd w/o libs
sshd
ftpd
httpd
2000
1000
0
monolithic
approach
our approach
関連研究(1)
[Sekar et al. ’01]
アプリケーション1つにオートマトン1つ
どの部分がどう異常なのかの把握が困難
システムコールだけを見る異常検知
[Wagner et al. ’01], [Hofmeyr et al. ’98],
[Liao et al ’02]
スタックが壊れても、システムコール列が正常なら
正常と判断
→ 我々の方式に比べmimicry attackを受けやすい
関連研究(2)
資源へのアクセス制御ポリシーの動的切り替え
SubDomain [Cowan et al. ’00]
細粒度保護ドメイン [品川ら ’01]
[阿部ら ’02]
我々のシステムでは、アクセス制御ポリシーでなく、
プログラムの制御の遷移のポリシーを切り替える
まとめ
正常動作データのモジュール化法を提案
その方法の有効性を実験で評価
2002/11/19
異常検知率の低下は小さい
現在、体感できる位のオーバヘッドあり
共有ライブラリの正常動作データを複数の
アプリケーションで使い回すことは現実的
コンピュータシステム・シンポジウム
35
今後の課題
より現実的な環境で実験
例: 日常業務に実際に使用しているサーバ
共有ライブラリ以外の境界をコンポーネント
境界として使えるよう拡張
2002/11/19
静的リンクの境界
コードの作者、出所の境界
コンピュータシステム・シンポジウム
36
(大上段に構えた)本研究の主張
独立コンポーネントの集合体の実行は
独立ポリシーの集合体で縛るべき
質疑応答スライド
議論(1)
システムコールを呼び出さないライブラリ
関数のチェックは?
→ しません
正常動作データをモジュール化すると、
検知率が落ちる?
→ はい。ほんの少しだけ。
議論(2)
そもそも何を異常と定義しているのか?
→ 正常動作データにない動作すべて
Semanticsに
違反する動作
正常動作データに
ない動作
レアパスの実行など