セキュリティ機構の開発と評価のための異常注入システム

30
セセセセセセセセセセセセセセセセセセセセセセセ セセセ セセ セセ セセセセセセ

Upload: john-fletcher

Post on 01-Jan-2016

19 views

Category:

Documents


4 download

DESCRIPTION

セキュリティ機構の開発と評価のための異常注入システム. 大山 恵弘 電気通信大学. 背景. コンピュータシステムへの攻撃の脅威は依然として大きい その対策として、多くのセキュリティシステムが研究、開発されている しかし、セキュリティシステムの開発やテストには手間がかかる. セキュリティシステムの 開発者が直面する問題. 作ったシステムのテストや評価が面倒 典型的な作業の流れ: 脆弱性を持つプログラムを準備する 脆弱性を突く攻撃コードを書く 自分のシステムがその攻撃を検出や防御できたかを調べる. 脆弱性を持つプログラムの 準備の仕方いろいろ. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: セキュリティ機構の開発と評価のための異常注入システム

セキュリティ機構の開発と評価のための異常注入システム

大山 恵弘電気通信大学

Page 2: セキュリティ機構の開発と評価のための異常注入システム

背景コンピュータシステムへの攻撃の脅威は

依然として大きいその対策として、多くのセキュリティシス

テムが研究、開発されているしかし、セキュリティシステムの開発やテ

ストには手間がかかる

Page 3: セキュリティ機構の開発と評価のための異常注入システム

セキュリティシステムの開発者が直面する問題

作ったシステムのテストや評価が面倒

典型的な作業の流れ: 脆弱性を持つプログラムを準備する 脆弱性を突く攻撃コードを書く 自分のシステムがその攻撃を検出や防御でき

たかを調べる

Page 4: セキュリティ機構の開発と評価のための異常注入システム

脆弱性を持つプログラムの準備の仕方いろいろ

脆弱性情報などをもとに脆弱性を持つソフトウェアを探して拾ってくる 探すのが面倒 拾ってきたソフトウェアのバージョンは古くなり

がち自分で脆弱なプログラムを書く

トイプログラムになりがち人工的な脆弱性を含ませる改造を施す

改造は面倒であり、スキルも必要 ソースコードが必要

Page 5: セキュリティ機構の開発と評価のための異常注入システム

動機攻撃を受けたときに何が起こるかを、任意の

アプリケーションに対して調べたい 特に、セキュリティ機構が作動するかどうかを

調べたい アプリケーションには現在脆弱性が発見されて

いないものとする もし脆弱性があって、もし乗っ取られたら、何

が起こるかを見たい雑に言えば、攻撃被害のインスタンスを

(多少人工的でもいいので)大量生産したい

Page 6: セキュリティ機構の開発と評価のための異常注入システム

本研究の目的攻撃注入システム HyperAttacker の構築

プログラムのメモリ内容を書き換え、攻撃されたかのような効果を人工的に作り出す

脆弱性がないプログラムに、外部から異常を注入

ユーザは異常注入に関するシナリオを記述

Page 7: セキュリティ機構の開発と評価のための異常注入システム

実装戦略ソースコードの変換アスペクト指向ツールの利用アプリケーションプロセスのアドレス空間

上のデータを、外の何者かが更新 仮想マシンモニタが更新

他のプロセスが更新

長期的に目指したいもの

本研究で実装したプロトタイプ

Page 8: セキュリティ機構の開発と評価のための異常注入システム

HyperAttacker プロトタイプの構造

OS

アプリケーションプロセス

HyperAttackerプロセス

監視

操作

攻撃効果

シナリオ

Page 9: セキュリティ機構の開発と評価のための異常注入システム

HyperAttacker でできることプログラムがある実行状態になった時に、

あるメモリ領域にデータを書き込む 現在、実行状態として表現可能なもの:

関数の先頭 / 末尾 関数 A の中での関数 B の呼び出し直前 / 直後

read_input(){ … strcpy(…); …}

Page 10: セキュリティ機構の開発と評価のための異常注入システム

HyperAttacker でできることの例関数 read_input からの strcpy の 1000

回目の呼び出し直後に、指定のバイト列を現在のスタックフレームに書き込む

関数 parse_data の先頭に来た時に、 0.003 の確率で、指定の長さのランダムバイト列をバッファ buf に書き込む

関数 copy_buffer からの最初の復帰で、関数 delete_password のアドレスを、リターンアドレス領域に書き込む

Page 11: セキュリティ機構の開発と評価のための異常注入システム

シナリオ例1関数 read_input からの strcpy の 1000

回目の呼び出し直後に、指定のバイト列を現在のスタックフレームに書き込む

condition:after strcpy in read_inputnumcalled=1000

manipulation:sp <- bytes 10 ab 97 cd

Page 12: セキュリティ機構の開発と評価のための異常注入システム

シナリオ例2関数 parse_data の先頭に来た時

に、 0.003 の確率で、 200 バイトのランダムバイト列をバッファ buf に書き込む

condition:head in parse_datapossibility=0.003

manipulation:var buf <- randbytes 200

Page 13: セキュリティ機構の開発と評価のための異常注入システム

シナリオ例3関数 copy_buffer からの最初の復帰で、

関数 delete_password のアドレスを、リターンアドレス領域に書き込む

condition:tail in copy_buffernumcalled=1

manipulation:retaddr <- varaddr delete_password

Page 14: セキュリティ機構の開発と評価のための異常注入システム

実装ptrace システムコールを利用

HyperAttacker (親)プロセスがアプリケーション(子)プロセスの動作を追跡

子のシグナル受信、実行終了、システムコール呼び出しなどを検知

ブレークポイントを利用 ptrace により、シナリオで指定されたプログ

ラムポイントにブレークポイントを挿入 アプリケーションが指定の場所に到達したこ

とを検知

Page 15: セキュリティ機構の開発と評価のための異常注入システム

アプリケーションのコード領域へのブレークポイントの挿入

関数の先頭 / 末尾のコードアドレスを得る 実行型およびオブジェクトファイルが貼り付

けられた領域のアドレスを /proc から得る 領域内の関数のオフセットを objdump コマ

ンドで得る指定の関数内の call命令の情報を得る

objdump コマンドで逆アセンブルするptrace により、得られたアドレスの内容

を 0xcc で上書きする

Page 16: セキュリティ機構の開発と評価のための異常注入システム

異常の注入処理シナリオに沿って子プロセスのメモリの

内容を更新 ptrace を利用

データを書き込める場所 大域変数のあるアドレスから始まる領域 スタックポインタが指すアドレスから始まる

領域 現在のスタックフレームのリターンアドレス

領域

Page 17: セキュリティ機構の開発と評価のための異常注入システム

fork

アプリケーションプロセス

HyperAttackerプロセス

監視

監視アプリケーション

プロセス

fork

HyperAttackerプロセス

fork

Page 18: セキュリティ機構の開発と評価のための異常注入システム

exec

progAHyperAttack

erプロセス

監視

progB

progA用シナリオ

progB用シナリオ

Page 19: セキュリティ機構の開発と評価のための異常注入システム

コードに関する細かい事項対象プラットフォーム : Linux/x86コードサイズ

HyperAttacker 本体 :C で約 1000 行

プロセス監視ライブラリ PROMON:C で約 1400 行

Page 20: セキュリティ機構の開発と評価のための異常注入システム

実験1Webサーバ thttp に異常を注入

GCC の Stack-Smashing Protector (SSP) を有効にして thttpd をビルド

StackGuard に似た機構 関数 send_response_tail 内の my_snprintf

の最初の呼び出し直後にスタックを破壊 SSP によって安全に実行が停止することを確認

Page 21: セキュリティ機構の開発と評価のための異常注入システム

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 );}

Page 22: セキュリティ機構の開発と評価のための異常注入システム

thttpd に異常を注入するシナリオ

condition:after my_snprintf in send_response_tailnumcalled=1

manipulation:sp <- randbytes 2000

Page 23: セキュリティ機構の開発と評価のための異常注入システム

実験2Webブラウザ Firefox に異常を注入

配布バイナリ内にはシンボル情報はないが、ライブラリ境界に異常を注入可能

strcpy を一定数実行したら sp が指す領域にランダムバイト列を書き込むなどの実験を実施

Page 24: セキュリティ機構の開発と評価のための異常注入システム

一つのアナロジHyperAttacker = 避難訓練システム

火事がない建物に疑似的な火事を発生させる 30年地震がない地域に大地震を発生させる どの時間にどの場所でどういう災害が発生す

るかのシナリオは人間が明確に定める避難訓練は安全性の向上に不可欠

Page 25: セキュリティ機構の開発と評価のための異常注入システム

議論(1)なぜアスペクト指向を使わないのか?→ アプリを再ビルドしたくない→ ソースを持っていないアプリに異常を注入したいこともある

マルチスレッドアプリケーションには対応している?→ 対応していません

Page 26: セキュリティ機構の開発と評価のための異常注入システム

議論(2)ptraceベースのセキュリティシステムと衝

突するのではないのか?→ はい、衝突します→ だから将来は VMM層で実現したい

シンボル情報を strip したバイナリに異常を注入できるか?→ strip されたシンボルの関数にまつわる地点での異常注入はできません→ 動的リンクライブラリの呼び出し前後での異常注入はできます

Page 27: セキュリティ機構の開発と評価のための異常注入システム

オーバヘッド大きく分けて 2 つ

コンテキストスイッチ システムコールを呼び出したときブレークポイントを踏んだとき シグナルを受信したとき

異常注入のためのメモリ内容の読み出しと更新システムコールフックのみのオーバヘッドは経験的には、 100%程度

ブレークポイント通過や異常注入のオーバヘッドはシナリオによって大きく変動

Page 28: セキュリティ機構の開発と評価のための異常注入システム

関連研究Software-implemented fault injection (SWIFI)

Xception [Carreira et al. ’98]カーネルモジュールを用いた障害注入システム扱われているのは主にハードウェア障害

アドレスバス、浮動小数ユニットなど FIG [Broadwell et al. ’01]

ライブラリ置き換えにより障害を発生させるシステム障害はライブラリ関数の返り値の異常に限られる

[Le et al. ’08] VMM を用いた障害注入システム障害はメモリの内容を 1bit反転するなどの単純なものに限ら

れる

Page 29: セキュリティ機構の開発と評価のための異常注入システム

まとめ脆弱性も攻撃もないプログラム内に、攻

撃された効果を作るシステムを提案した本システムはセキュリティ機構が正しく動

作するかを検査するのに有用である

Page 30: セキュリティ機構の開発と評価のための異常注入システム

今後の課題VMM層での HyperAttacker の実現

ptrace衝突問題を解決するカーネル空間への異常注入も可能になる

シナリオ言語の洗練 より複雑な条件やメモリ内容更新操作が書け

るようにする局所変数が指す領域やレジスタにもデータを注入

できるようにしたい条件に書く関数、注入される領域、注入するデー

タの部分にも乱数性を入れたい