侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している

Slides:



Advertisements
Similar presentations
九州工業大学 塩田裕司 光来健一.  仮想マシンは必要なときだけ動かす使い方が一般 的 ◦ 一台の計算機上に複数の計算機を仮想的に作成できる ◦ デスクトップ  異なる OS を使用するため作成 ◦ サーバ  最大負荷に合わせた数の仮想マシンを作成  長期間使わない仮想マシンも存在する VM.
Advertisements

ファイルキャッシュを考慮したディスク監視のオフロード
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
クラウド上の仮想マシンの安全なリモート監視機構
クラウドにおける ネストした仮想化を用いた 安全な帯域外リモート管理
Xenを用いたクラウドコンピュー ティングにおける情報漏洩の防止
IaaS 仮想マシン(VM)をネットワーク経由で提供 負荷に応じてVM数や性能を変更できる ハードウェアの導入・管理・維持コストの削減
中村孝介(九州工業大学) 光来健一(九州工業大学/JST CREST)
KVMにおけるIDSオフロードのための仮想マシン監視機構
仮想マシンの並列処理性能に対するCPU割り当ての影響の評価
ファイルシステムキャッシュを 考慮した仮想マシン監視機構
メモリ暗号化による Android端末の盗難対策
OSが乗っ取られた場合にも機能するファイルアクセス制御システム
XenによるゲストOSの解析に 基づくパケットフィルタリング
クラウドにおけるアプリケーション単位での VM構成の動的最適化
大きな仮想マシンの 複数ホストへのマイグレーション
ファイルシステムキャッシュを 考慮したIDSオフロード
ネストした仮想化を用いた VMの安全な帯域外リモート管理
帯域外リモート管理の継続を 実現可能なVMマイグレーション手法
VMマイグレーションを可能にするIDSオフロード機構
クラウドの内部攻撃者に対する安全なリモートVM監視機構
アスペクト指向プログラミングを用いたIDSオフロード
サスペンドした仮想マシンの オフラインアップデート
型付きアセンブリ言語を用いた安全なカーネル拡張
KVMにおける仮想マシンの 内部監視機構の実装と性能評価
Xenによる ゲストOSの監視に基づく パケットフィルタリング
仮想計算機を用いて OSを介さずに行う安全な ファイルアクセス制御
暗黙的に型付けされる構造体の Java言語への導入
セキュリティ機構のオフロードを考慮した 仮想マシンのスケジューリング
分散IDSの実行環境の分離 による安全性の向上
VMのメモリ暗号化による クラウド管理者への情報漏洩の防止
VM専用仮想メモリとの連携による VMマイグレーションの高速化
IaaS型クラウドにおける インスタンス構成の動的最適化手法
リモートホストの異常を検知するための GPUとの直接通信機構
実行時情報に基づく OSカーネルのコンフィグ最小化
仮想メモリを用いた VMマイグレーションの高速化
複数ホストに分割されたメモリを用いる仮想マシンの監視機構
仮想計算機を用いたサーバ統合に おける高速なリブートリカバリ
クラウドにおけるIntel SGXを用いた VMの安全な監視機構
IaaS環境におけるVMのメモリ暗号化による情報漏洩の防止
クラウドにおけるVMリダイレクト攻撃を防ぐためのリモート管理機構
GPUDirect RDMAを用いた リモートホストの異常検知手法
クラウドにおけるVM内コンテナを用いた 自動障害復旧システムの開発
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
仮想マシンを用いた 既存IDSのオフロード
バイトコードを単位とするJavaスライスシステムの試作
Intel SGXを用いた仮想マシンの 安全な監視機構
軽量な仮想マシンを用いたIoT機器の安全な監視
複数ホストにまたがって動作する仮想マシンの障害対策
セキュリティ機構のオフロード時の 性能分離
C言語を用いたマシン非依存な JITコンパイラ作成フレームワーク
信頼できないクラウドにおける仮想化システムの監視機構
VM内コンテナを用いた サービス単位の オートスケール機構
仮想環境を用いた 侵入検知システムの安全な構成法
Cell/B.E.のSPE Isolationモードを用いた監視システム
仮想マシンの監視を継続可能なマイグレーション機構
仮想マシンと物理マシンを一元管理するための仮想AMT
同期処理のモジュール化を 可能にする アスペクト指向言語
仮想マシンに対する 高いサービス可用性を実現する パケットフィルタリング
Cell/B.E. のSPE上で動作する 安全なOS監視システム
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
VMリダイレクト攻撃を防ぐための 安全なリモート管理機構
強制パススルー機構を用いた VMの安全な帯域外リモート管理
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
IPmigrate:複数ホストに分割されたVMの マイグレーション手法
複数ホストにまたがるVMの メモリ使用状況に着目した高速化
Virtual Machine Introspectionを可能にするVMCryptの拡張 田所秀和 光来健一 (九州工業大学)
強制パススルー機構を用いた VMの安全な帯域外リモート管理
管理VMへの キーボード入力情報漏洩の防止
Presentation transcript:

LLVMの中間表現を用いた IDSオフロードの開発支援 九州工業大学 情報工学部 機械情報工学科 光来研究室 11237009 植木あずさ 2015/2/23

侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している 例:不正なプログラムの実行、システムの改ざん IDS自体が攻撃を受けると、不正アクセスの 検知ができなくなる 近年、インターネットを通じたサーバへの不正アクセスが増加しています。不正アクセスによって、不正なプログラムを実行したりシステムの改ざんを行ったりする攻撃をされる可能性があります。この攻撃を検知するためのシステムとして侵入検知システムIDSがあります。しかし、IDS自体が攻撃を受けると、不正アクセスを検知できなくなってしまいます。攻撃者はまずIDSに攻撃しIDSを停止させ、攻撃の検知をできないようにします。そして、サーバに攻撃を行っても検知されなくなります。 サーバ IDS 停止 攻撃 攻撃 2015/2/23

IDSオフロード IDS 監視対象システムとIDSを別々の仮想マシン (VM)で動作させる手法 IDS-VMから監視対象VMを安全に監視 IDSが停止されるのを防ぐために、IDSオフロードという手法が提案されています。IDSオフロードとは監視対象システムとIDSを別々の仮想マシンで動作させる手法です。こうすることで、監視対象VMに侵入してもIDSが停止することはなく、IDS-VMから安全に監視を行うことができます。IDS-VMではIDSしか動作させないため、監視対象VMより攻撃が難しくなっています。 監視対象VM IDS-VM IDS 監視 2015/2/23

t = *(u64 *)translate(&jiffies) / HZ メモリ解析の必要性 監視対象VMのメモリを解析してOS内の情報 を取得する必要がある 監視するデータの論理的なアドレスを監視対象 VM内の物理的なアドレスに変換 IDS-VMからアクセスできるアドレスに変換 これをIDSの開発者が手作業で行うのは労力 が大きい IDSをオフロードして監視を行うには、監視対象VMのメモリを解析してOS内の情報を取得する必要があります。具体的には、監視するデータの論理的なアドレスを監視対象VM内の物理的なアドレスに変換し、それをさらにIDS-VMからアクセスできるアドレスに変換する必要があります。例としてシステム稼働時間を取得する場合を示しています。jiffiezはシステムが起動してからの時間で、マクロで定義されたHZを用いて変数tにシステム稼働時間を格納しています。これをメモリ解析を行うようにすると、右のようになります。translate関数でアドレスの変換を行っています。このような変更をIDSの開発者が手作業で行うのは大きな労力がかかります。 jiffies:システムが起動してからの時間、グローバル変数 t:システム稼働時間の取得 t = jiffies / HZ t = *(u64 *)translate(&jiffies) / HZ 2015/2/23

Transcall [飯田ら ‘10] 既存のIDSをオフロード可能にするシステム Transcallの開発には膨大な労力を要する 監視対象VM内のOSをエミュレーション OS内のデータへのアクセスをIDSの代わりに行う Linuxのソースコードをベースに開発 Transcallの開発には膨大な労力を要する アドレス変換を13,000カ所以上で行う必要 OSのバージョンごとに開発する必要 オフロード用のIDS開発にかかる労力を削減するために、既存のIDSをオフロードできるようにするシステムTranscallが提案されています。このシステムは監視対象VM内のOSをエミュレーションして、OS内のデータへのアクセスをIDSの代わりに行います。しかし、Transcallの開発にはIDSをオフロードに対応させる以上の労力が必要となるという問題があります。まず、アドレス変換を13000カ所以上で行う必要があります。そして、OSのバージョンごとに開発する必要があります。オフロード用のIDSを開発するのも、既存のIDSをオフロードするのも、どちらも膨大な労力が必要となります。 監視対象VM IDS Transcall 監視 2015/2/23

提案:LLView LLVMの中間表現を変換することでIDSのオ フロードを支援するフレームワーク LLVMを用いてIDSをコンパイル Linuxのソースコードに適用することでTranscall を半自動生成 そこで、LLVMを用いてIDSのオフロードを支援するフレームワークであるLLViewを提案します。IDSのソースコードにLLViewを適用することでオフロード用のIDSとすることができます。LLViewでは、LLVMを用いてIDSをコンパイルして、監視対象VM内のデータにアクセスする箇所にアドレス変換を行うプログラムを自動で挿入します。また、Linuxのソースコードに適用することで、Transcacllを半自動生成することができます。 IDS ソースコード LLView オフロード用 2015/2/23

LLVM コンパイラ作成のために必要な機能を提供する コンパイラ基盤 C言語などのプログラムをコンパイルして中間表現 を生成 中間表現を特定のCPUの機械語に変換 プログラミング言語やCPUとは独立に最適化 LLVMとはコンパイラ作成のために必要な機能を提供するコンパイラ基盤です。C言語などのプログラムをコンパイルしてLLVMの中間表現を生成できます。さらに中間表現を特定のCPUの機械語に変換することができます。また、プログラミング言語やCPUとは独立した最適化を行うことができます。 C/C++ プログラム 中間表現 ターゲットCPUの機械語 2015/2/23

中間表現 様々な命令が用意されている C言語などと同様の変数が使える load/store:メモリ上のデータの読み書き @変数名:グローバル変数 %変数名または%数値:ローカル変数 型を指定して使う(i64) LLVMの中間表現について説明します。中間表現では様々な命令が用意されています。例えば、メモリ上のデータの読み込み命令であるload命令や書き込み命令であるstore命令などがあります。また、C言語などと同様の変数が使えます。中間表現では@変数名でグローバル変数、%変数名または%数値でローカル変数を表します。これらの変数を使う際、型を指定する必要があります。図の例では先ほども例に出したシステム稼働時間を取得するプログラムを中間表現に変換しています。1行目ではload命令で64ビットの整数であるグローバル変数jiffiesを一時変数%1に読み込みます。2行目ではudiv命令で、1行目で読み込んだ値をHZに定義されている100で割って%2に格納しています。3行目では2行目で求めた値をstore命令でローカル変数tに格納しています。 jiffies:システムが起動してからの時間、グローバル変数 load:読み出し udiv:割り算 store:書き出し t = jiffies / HZ %1 = load i64* @jiffies %2 = udiv i64 %1, 100 store i64 %2, i64* %t C言語 中間表現 2015/2/23

中間表現の変換 load命令を変換することでIDSをオフロード に対応させる データを読み込む際には必ずload命令が使われる 読み込もうとしているデータに対してアドレス変 換を行う関数呼び出しを挿入 bitcast命令で型変換、call命令でtranslate関数の呼び出し 中間表現をさらに変換してIDSをオフロードに対応させます。読み込もうとしているデータにアドレス変換を行う関数呼び出しを挿入します。中間表現ではデータを読み込む際に必ずload命令が使われるため、アドレス変換を行う箇所が明確になっています。図の例では先ほどの例のload命令を変換した結果を示しています。1行目ではbitcast命令で64ビット整数のポインタから8ビット整数のポインタへの型変換を行っています。2行目ではcall命令でアドレス変換関数translateを呼び出しています。3行目で元の64ビット整数のポインタへの型変換を行っています。4行目でアドレス変換が行われた値をload命令で読み込んでいます。 %1 = bitcast i64* @jiffies to i8* %2 = call i8* @translate(i8* %1) %3 = bitcast i8* %2 to i64* %4 = load i64* %3 %1 = load i64* @jiffies 2015/2/23

Passを用いた実装 最適化のために中間表現を変換する仕組み load命令を探す 型変換命令、関数呼び出し命令を挿入 load命令の変換を行うのに、LLVMの最適化機能であるPassを作成しました。今回作成したPassでは、まずload命令を探し、型変換命令と関数呼び出し命令を追加します。次に新しいload命令を追加して、その命令で読み込んだ値を使うように変更します。図の例ではudiv命令の引数である%1が%4に変わっています。最後にもとのload命令を削除します。 : %4 = load i64* %3 %1 = load i64* @jiffies %5 = udiv i64 %4, 100 %2 = udiv i64 %1, 100 2015/2/23

カーネルシンボルの解決 IDSはカーネルのグローバル変数を知る必要 がある グローバル変数のアドレスを定義 メモリを解析する起点となる リンカ・スクリプトに定義を記述 IDSのリンク時に指定 jiffies = 0xffffffff81c26480; symbols.lds 2015/2/23

Transcallの半自動生成に向けて Linuxのソースコードを用いて監視対象VMの OS内の情報を取得 clangを用いてコンパイルして中間表現を出力 optを用いて中間表現にアドレス変換を挿入 llcを用いて中間表現からオブジェクトファイルを 作成 Transcallを半自動生成するために、Linuxのソースコードを用いて監視対象VMのOS内の情報を取得する必要があります。まずIDSをLLVMのフロントエンドであるclangを用いてコンパイルして、中間表現を出力します。次にoptで中間表現にPassを適用させてアドレス変換を挿入します。最後にllcで中間表現からオブジェクトファイルを作成します。 //プログラム例の説明(インクルード、init_task、pid) #include <linux/sched.h> : struct task_stract *p = &init_task; printf(“%d¥n”, p->pid); 2015/2/23

実験 簡単なIDSにLLViewを適用して、IDSオフ ロードの動作確認および性能測定を行った OSのバージョン情報を取得 動作中のプロセス一覧を取得 実験環境 IDS-VM CPU Intel Xeon E3-1290 メモリ 30GB 32GB OS Ubuntu 14.04 監視対象VM VMM Xen 4.4.0 2GB 実験を行いました。簡単なIDSを作成し、LLViewを適用してIDSの動作確認と性能測定を行いました。今回はOSのバージョン情報を取得するIDSと動作中のプロセス一覧を取得するIDSを作成しました。 2015/2/23

バージョン情報を取得 OS内の変数linux_proc_bannerの文字列を取 得して表示するIDSを実行 実行結果 2015/2/23 1つめのOSのバージョン情報を取得するIDSでは、OS内の変数であるlinux_proc_bannerの文字列を取得して表示します。実行結果は図のようになりました。 2015/2/23

バージョン情報を取得 OS内の変数linux_proc_bannerの文字列を取 得して表示するIDSを実行 実行時間 2015/2/23 また、LLViewを適用した場合とアスペクト指向プログラミングを適用した場合の実行時間を測定しました。結果はグラフのようになっています。LLViewでは26ミリ秒、アスペクトでは0.65ミリ秒とかなり差が出ました。これはLLViewの方が変更を加える箇所が多くなっているからだと考えます。 2015/2/23

プロセス一覧を取得 動作しているプロセスのIDと名前の一覧を取 得して表示するIDSを実行 実行結果 2015/2/23 2つめの動作中のプロセス一覧を取得するIDSでは、プロセスIDとプロセス名の一覧を取得して表示します。この図は実行結果の一部となっています。 2015/2/23

プロセス一覧を取得 動作しているプロセスのIDと名前の一覧を取 得して表示するIDSを実行 実行時間 2015/2/23 また、LLViewを適用した場合とアスペクト指向プログラミングを適用した場合の実行時間を測定しました。結果はグラフのようになっています。LLViewでは1.4秒、アスペクトでは0.03秒とこちらもかなり差が出ました。理由は先ほどと同様に変更箇所の違いによるものだと考えます。 2015/2/23

関連研究 AOPを用いたIDSオフロード [西村 ’13] Volatility VMST [Fu et al.’12] ソースコードレベルで変換を自動挿入 コンパイラの互換性の問題でLinuxのソースコードを大き く書き換える必要がある Volatility Pythonプラグインを用いてVMのメモリを解析 アドレス変換を意識する必要がある VMST [Fu et al.’12] IDS-VMが監視対象VMのメモリを共有して監視 オーバーヘッドが大きい 関連研究です。 AOPを用いたIDSオフロードはIDSをオフロードするための変換をアスペクトを用いてソースコードレベルで自動で挿入します。コンパイラの互換性が低いので、Linuxのソースコードを大きく書き換える必要があります。 VolatilityはPythonプラグインを用いてVMのメモリを解析するツールです。アドレス変換を意識して使用する必要があります。 VMSTはIDS-VMが監視対象VMのメモリを共有して監視するシステムです。監視対象VMの構成と同じ構成のVMを用意して監視を行います。実行時のオーバーヘッドが大きいという問題があります。 AOP:オブジェクト指向では難しいところを記述するための 2015/2/23

まとめ LLVMを用いてIDSのオフロードを支援する フレームワークLLViewを提案 今後の課題 Linuxのソースコードに適用し、簡単なIDSを開発 した 今後の課題 既存のIDSをオフロード可能にするシステム Transcallを半自動生成できるようにする まとめです。LLVMを用いてIDSのオフロードを支援するフレームワークLLViewを提案しました。LLVMの中間表現を変換して、アドレス変換を行うプログラムをIDSに自動で挿入します。また、Linuxのソースコードに適用し、簡単なIDSを開発しました。今後の課題は既存のIDSをオフロード可能にするシステムであるTranscallを半自動で生成できるようにすることです。 2015/2/23