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