セキュリティ機構の開発と評価 のための異常注入システム 大山 恵弘 電気通信大学 背景 コンピュータシステムへの攻撃の脅威は 依然として大きい その対策として、多くのセキュリティシ ステムが研究、開発されている しかし、セキュリティシステムの開発や テストには手間がかかる セキュリティシステムの 開発者が直面する問題 作ったシステムのテストや評価が面倒 典型的な作業の流れ: 脆弱性を持つプログラムを準備する 脆弱性を突く攻撃コードを書く 自分のシステムがその攻撃を検出や防御でき たかを調べる 脆弱性を持つプログラムの 準備の仕方いろいろ 脆弱性情報などをもとに脆弱性を持つソフト ウェアを探して拾ってくる 自分で脆弱なプログラムを書く 探すのが面倒 拾ってきたソフトウェアのバージョンは古くなり がち トイプログラムになりがち 人工的な脆弱性を含ませる改造を施す 改造は面倒であり、スキルも必要 ソースコードが必要 動機 攻撃を受けたときに何が起こるかを、任意の アプリケーションに対して調べたい 特に、セキュリティ機構が作動するかどうかを調 べたい アプリケーションには現在脆弱性が発見されてい ないものとする もし脆弱性があって、もし乗っ取られたら、何が 起こるかを見たい 雑に言えば、攻撃被害のインスタンスを (多少人工的でもいいので)大量生産したい 本研究の目的 攻撃注入システムHyperAttackerの構築 プログラムのメモリ内容を書き換え、攻撃さ れたかのような効果を人工的に作り出す 脆弱性がないプログラムに、外部から異常を 注入 ユーザは異常注入に関するシナリオを記述 実装戦略 ソースコードの変換 アスペクト指向ツールの利用 アプリケーションプロセスのアドレス空間 上のデータを、外の何者かが更新 仮想マシンモニタが更新 長期的に 目指したいもの 他のプロセスが更新 本研究で実装した プロトタイプ HyperAttackerプロトタイプの構造 シナリオ 操作 監視 アプリケーション プロセス 攻撃 効果 HyperAttacker プロセス OS HyperAttackerでできること プログラムがある実行状態になった時に、 あるメモリ領域にデータを書き込む 現在、実行状態として表現可能なもの: 関数の先頭/末尾 関数Aの中での関数Bの呼び出し直前/直後 read_input() { … strcpy(…); … } HyperAttackerでできることの例 関数read_inputからのstrcpyの1000回目の 呼び出し直後に、指定のバイト列を現在 のスタックフレームに書き込む 関数parse_dataの先頭に来た時に、0.003の 確率で、指定の長さのランダムバイト列 をバッファbufに書き込む 関数copy_bufferからの最初の復帰で、関 数delete_passwordのアドレスを、リター ンアドレス領域に書き込む シナリオ例1 関数read_inputからのstrcpyの1000回目の 呼び出し直後に、指定のバイト列を現在 のスタックフレームに書き込む condition: after strcpy in read_input numcalled=1000 manipulation: sp <- bytes 10 ab 97 cd シナリオ例2 関数parse_dataの先頭に来た時に、0.003の 確率で、200バイトのランダムバイト列を バッファbufに書き込む condition: head in parse_data possibility=0.003 manipulation: var buf <- randbytes 200 シナリオ例3 関数copy_bufferからの最初の復帰で、関 数delete_passwordのアドレスを、リター ンアドレス領域に書き込む condition: tail in copy_buffer numcalled=1 manipulation: retaddr <- varaddr delete_password 実装 ptraceシステムコールを利用 HyperAttacker (親)プロセスがアプリケー ション(子)プロセスの動作を追跡 子のシグナル受信、実行終了、システムコー ル呼び出しなどを検知 ブレークポイントを利用 ptraceにより、シナリオで指定されたプログ ラムポイントにブレークポイントを挿入 アプリケーションが指定の場所に到達したこ とを検知 アプリケーションのコード領域へ のブレークポイントの挿入 関数の先頭/末尾のコードアドレスを得る 指定の関数内のcall命令の情報を得る 実行型およびオブジェクトファイルが貼り付 けられた領域のアドレスを/procから得る 領域内の関数のオフセットをobjdumpコマン ドで得る objdumpコマンドで逆アセンブルする ptraceにより、得られたアドレスの内容を 0xccで上書きする 異常の注入処理 シナリオに沿って子プロセスのメモリの 内容を更新 ptraceを利用 データを書き込める場所 大域変数のあるアドレスから始まる領域 スタックポインタが指すアドレスから始まる 領域 現在のスタックフレームのリターンアドレス 領域 fork 監視 アプリケーション プロセス fork アプリケーション プロセス HyperAttacker プロセス 監視 fork HyperAttacker プロセス exec progA用 シナリオ 監視 progA progB HyperAttacker プロセス progB用 シナリオ コードに関する細かい事項 対象プラットフォーム: Linux/x86 コードサイズ HyperAttacker本体: Cで約1000行 プロセス監視ライブラリPROMON: Cで約1400行 実験1 Webサーバthttpに異常を注入 GCCのStack-Smashing Protector (SSP) を有効に してthttpdをビルド StackGuardに似た機構 関数send_response_tail内のmy_snprintfの最初 の呼び出し直後にスタックを破壊 SSPによって安全に実行が停止することを確 認 thttpdのソースコードの抜粋 static void send_response_tail( httpd_conn* hc ) { char buf[1000]; (void) my_snprintf( buf, sizeof(buf), "\ <HR>\n\ <ADDRESS><A HREF=\"%s\">%s</A></ADDRESS>\n\ </BODY>\n\ </HTML>\n", SERVER_ADDRESS, EXPOSED_SERVER_SOFTWARE ); add_response( hc, buf ); } thttpdに異常を注入するシナリオ condition: after my_snprintf in send_response_tail numcalled=1 manipulation: sp <- randbytes 2000 実験2 WebブラウザFirefoxに異常を注入 配布バイナリ内にはシンボル情報はないが、 ライブラリ境界に異常を注入可能 strcpyを一定数実行したらspが指す領域にラン ダムバイト列を書き込むなどの実験を実施 一つのアナロジ HyperAttacker = 避難訓練システム 火事がない建物に疑似的な火事を発生させる 30年地震がない地域に大地震を発生させる どの時間にどの場所でどういう災害が発生す るかのシナリオは人間が明確に定める 避難訓練は安全性の向上に不可欠 議論(1) なぜアスペクト指向を使わないのか? → アプリを再ビルドしたくない → ソースを持っていないアプリに異常を 注入したいこともある マルチスレッドアプリケーションには対 応している? → 対応していません 議論(2) ptraceベースのセキュリティシステムと衝 突するのではないのか? → はい、衝突します → だから将来はVMM層で実現したい シンボル情報をstripしたバイナリに異常を 注入できるか? → stripされたシンボルの関数にまつわる 地点での異常注入はできません → 動的リンクライブラリの呼び出し前後 での異常注入はできます オーバヘッド 大きく分けて2つ コンテキストスイッチ システムコールを呼び出したとき ブレークポイントを踏んだとき シグナルを受信したとき 異常注入のためのメモリ内容の読み出しと更新 システムコールフックのみのオーバヘッドは 経験的には、100%程度 ブレークポイント通過や異常注入のオーバ ヘッドはシナリオによって大きく変動 関連研究 Software-implemented fault injection (SWIFI) Xception [Carreira et al. ’98] カーネルモジュールを用いた障害注入システム 扱われているのは主にハードウェア障害 FIG [Broadwell et al. ’01] アドレスバス、浮動小数ユニットなど ライブラリ置き換えにより障害を発生させるシステム 障害はライブラリ関数の返り値の異常に限られる [Le et al. ’08] VMMを用いた障害注入システム 障害はメモリの内容を1bit反転するなどの単純なものに 限られる まとめ 脆弱性も攻撃もないプログラム内に、攻 撃された効果を作るシステムを提案した 本システムはセキュリティ機構が正しく 動作するかを検査するのに有用である 今後の課題 VMM層でのHyperAttackerの実現 ptrace衝突問題を解決する カーネル空間への異常注入も可能になる シナリオ言語の洗練 より複雑な条件やメモリ内容更新操作が書け るようにする 局所変数が指す領域やレジスタにもデータを注入 できるようにしたい 条件に書く関数、注入される領域、注入するデー タの部分にも乱数性を入れたい
© Copyright 2024 ExpyDoc