140 likes | 271 Views
アスペクト指向プログラミングを用いた IDS オフロード. 九州工業大学 情報工学部 機械情報工 学科 光来研究室 B4 西村謙一郎. 侵入検知システム( IDS ). IDS は攻撃者 の 侵入を検知するために用いられる 例:不正なプログラムが実行されていないかチェック 侵入を検知したら管理者に通知して対処 IDS が攻撃されると 正しく検知できなくなる 例 :IDS を停止 例:不正なプログラムを検知 しないよう に IDS を改ざん. 攻撃者. IDS. 検知.
E N D
アスペクト指向プログラミングを用いたIDSオフロードアスペクト指向プログラミングを用いたIDSオフロード 九州工業大学 情報工学部 機械情報工学科 光来研究室 B4 西村謙一郎
侵入検知システム(IDS) • IDSは攻撃者の侵入を検知するために用いられる • 例:不正なプログラムが実行されていないかチェック • 侵入を検知したら管理者に通知して対処 • 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ではメモリにアクセスする箇所は膨大 task->pid; IDS 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のメモリにアクセスするようにプログラムを変換 IDS sec = time->tv_sec; : pid = task->pid; アスペクト 織り 込み sec = time->tv_sec; : pid= *(pid_t *) g(&task->pid); 生成されるオフロード用IDS アスペクト 処理系 判別 変換
メモリアクセスの判別 • データの種類に基づいてメモリアクセスを判別 • IDSがアクセスするデータの種類は監視対象VMとIDS-VMで異なる • OSカーネルが使う構造体(カーネル構造体) • アプリケーションが使う構造体 • アスペクトでカーネル構造体のメモリアクセスだけを抽出 • 構造体の名前を指定 pointcutkernel_data() = get(“%:task_struct”); sec = time->tv_sec; : pid = task->pid; IDS アスペクト
メモリアクセスの自動変換 • カーネル構造体へのアクセスを監視対象VMへのメモリにアクセスするプログラムに変換 • アスペクトに変換先のプログラムを記述 • アクセスするメモリのアドレスを取得 • 監視対象VMのメモリから対応するデータを読み出す sec = time->tv_sec; : pid = task->pid; IDS advice kernel_data() :round(){ /*アドレスを取得 */ /*取得したデータを返す*/ } アスペクト
アスペクト処理系の開発 • C言語向けアスペクト処理系のAspectC++を改良した • メモリアクセスの抽出への対応 • メモリアクセスの抽出を行うパッチ[Mugnusson’06]をあてた • 配列への対応 • 構造体の中の配列へのアクセスを扱えるようにするためにAspectC++を修正した • マクロへの対応 • コンパイル手順を工夫することでマクロを用いたIDSプログラムをコンパイルできるようにした
実験 • AOPを用いたIDSの開発における開発者の負担と実行性能を調べた • プロセスリストを取得する簡単なIDSを開発 • 比較対象として • 関数を用いた場合 • マクロを用いた場合 • キャストを省略 • C++の演算子のオーバー ロードを用いた場合 • ->演算子の役割を変更 pid = *(pid_t)g(&task->pid);
実験1:プログラムサイズの比較 • IDSプログラムの変更箇所とプログラムサイズの増加量を測定 • AOPを用いた場合が変更箇所、プログラムサイズの増加量ともに最も少なかった
実験2:実行時間の測定 • AOPを使用することで、実行時間がどのように変化するか調査した • 3~4ms程度増加していた • 関数呼び出しが増加することに起因すると考えられる 21.0 17.7 17.4 17.6
関連研究 • AspectJ [Kiczales et al. '01] • Java言語向けのアスペクト処理系 • C言語で書かれたオフロードIDSには適用できない • VM Shadow[飯田ら'11] • 既存のIDSをそのままオフロードできる機構を提案 • カーネル構造体にアクセスするIDSには対応できない • VMST [Fu et al.'12] • 実行時にメモリアクセスの追跡を行うことでメモリアクセスを判別 • 本研究ではコンパイル時に判別するので実行時のオーバヘッドが小さい
まとめ • アスペクト指向プログラミング(AOP)を用いたIDSのオフロードIDSの開発支援を提案 • アスペクトを用いて監視対象VMへのメモリアクセスを判別し、プログラムを自動的に変換 • オフロードのことを意識せずにIDSを開発することができる • 今後の課題 • より規模の大きいIDSの開発に適用する