九州工業大学 情報工学部
機械情報工学科
光来研究室 B4 西村謙一郎
IDSは攻撃者の侵入を検知するために用いられる
◦ 例:不正なプログラムが実行されていないかチェック
◦ 侵入を検知したら管理者に通知して対処
攻撃者
IDSが攻撃されると
正しく検知できなくなる
IDS
◦ 例:IDSを停止
◦ 例:不正なプログラムを検知
しないようにIDSを改ざん
検知
侵入
IDSと監視対象システムを別々の仮想マシン(VM)で
動かす手法が提案されている
◦ IDSは安全に監視対象システムを監視できる
攻撃者は監視対象VMに侵入してもIDSを攻撃できない
◦ IDS-VMは最小限のサービスのみ提供
攻撃者
侵入されにくくする
IDS
検知
IDS-VM
監視対象VM
オフロードして動くIDSを開発するのは負担が大きい
◦ IDSは監視対象VMとIDS-VMの両方のメモリにアクセスする
監視したいプロセス情報は監視対象VMのメモリにある
時刻情報はIDS-VMのメモリに保存される
◦ どちらへのアクセスかを一つ一つ判別する必要がある
大規模なIDSではメモリにアクセスする箇所は膨大
IDS
time->tv_sec
メモリ
時刻情報
IDS-VM
task->pid;
アクセス
メモリ
プロセス情報
監視対象VM
監視対象VMのメモリにアクセスする箇所すべてにつ
いて、プログラムを書き換える必要がある
◦ IDS-VMから監視対象VMにアクセスするには様々な処理を
行う必要がある
それらの処理を行う関数の呼び出しを追加
適切なキャストを追加
◦ 書き換えミスが発生しやすく、正確なプログラミングを行う労
力が大きい
オフロード前
sec = time->tv_sec;
:
pid = task->pid;
オフロード後
sec = time->tv_sec;
:
pid = *(pid_t *)g(&task->pid);
アスペクト指向プログラミング(AOP)とは?
◦ プログラム全体にわたる煩雑な処理をアスペクトとして記述
◦ プログラムとアスペクトを合成
アスペクトを用いることで以下を自動化
◦ 監視対象 VM に対するメモリアクセスの判別
◦ 監視対象VMのメモリにアクセスするようにプログラムを変換
IDS
sec = time->tv_sec;
:
pid = task->pid;
アスペクト
判別
変換
織り
込み
アスペクト
処理系
生成されるオフロード用IDS
sec = time->tv_sec;
:
pid = *(pid_t *)
g(&task->pid);
データの種類に基づいてメモリアクセスを判別
◦ IDSがアクセスするデータの種類は監視対象VMとIDS-VMで
異なる
OSカーネルが使う構造体(カーネル構造体)
アプリケーションが使う構造体
◦ アスペクトでカーネル構造体のメモリアクセスだけを抽出
構造体の名前を指定
IDS
sec = time->tv_sec;
:
pid = task->pid;
アスペクト
pointcut kernel_data() =
get(“%:task_struct”);
カーネル構造体へのアクセスを監視対象VMへのメモ
リにアクセスするプログラムに変換
◦ アスペクトに変換先のプログラムを記述
アクセスするメモリのアドレスを取得
監視対象VMのメモリから対応するデータを読み出す
IDS
sec = time->tv_sec;
:
pid = task->pid;
アスペクト
advice kernel_data() :round(){
/*アドレスを取得 */
}
/*取得したデータを返す*/
C言語向けアスペクト処理系のAspectC++を改良した
◦ メモリアクセスの抽出への対応
メモリアクセスの抽出を行うパッチ[Mugnusson’06]をあてた
◦ 配列への対応
構造体の中の配列へのアクセスを扱えるようにするために
AspectC++を修正した
◦ マクロへの対応
コンパイル手順を工夫することでマクロを用いたIDSプログラムをコ
ンパイルできるようにした
AOPを用いたIDSの開発における開発者の負担と実
行性能を調べた
プロセスリストを取得する簡単なIDSを開発
比較対象として
pid = *(pid_t)g(&task->pid);
◦ 関数を用いた場合
◦ マクロを用いた場合
キャストを省略
◦ C++の演算子のオーバー
ロードを用いた場合
->演算子の役割を変更
CPU
Intel Core i7 870
メモリ
4GB
OS
Linux 2.6.39.3
VMM
Xen 4.1.1
IDSプログラムの変更箇所とプログラムサイズの増加
量を測定
◦ AOPを用いた場合が変更箇所、プログラムサイズの増加量ともに最も少
なかった
関数
マクロ
オーバー
ロード
AOP
変更箇所
9
8
6
1
サイズ増加量(バイト)
106
89
225
22
AOPを使用することで、実行時間がどのように変化す
るか調査した
◦ 3~4ms程度増加していた
◦ 関数呼び出しが増加することに起因すると考えられる
25
20
実行時間 [ms]
21.0
17.4
17.6
17.7
15
10
5
0
関数
マクロ
オーバーロード
AOP
AspectJ [Kiczales et al. '01]
◦ Java言語向けのアスペクト処理系
◦ C言語で書かれたオフロードIDSには適用できない
VM Shadow[飯田ら'11]
◦ 既存のIDSをそのままオフロードできる機構を提案
◦ カーネル構造体にアクセスするIDSには対応できない
VMST [Fu et al.'12]
◦ 実行時にメモリアクセスの追跡を行うことでメモリアクセスを判別
本研究ではコンパイル時に判別するので実行時のオーバヘッドが
小さい
アスペクト指向プログラミング(AOP)を用いたIDSの
オフロードIDSの開発支援を提案
◦ アスペクトを用いて監視対象VMへのメモリアクセスを判別
し、プログラムを自動的に変換
◦ オフロードのことを意識せずにIDSを開発することができる
今後の課題
◦ より規模の大きいIDSの開発に適用する
© Copyright 2026 ExpyDoc