セキュリティ機構の開発と評価のための異常注入システム
DESCRIPTION
セキュリティ機構の開発と評価のための異常注入システム. 大山 恵弘 電気通信大学. 背景. コンピュータシステムへの攻撃の脅威は依然として大きい その対策として、多くのセキュリティシステムが研究、開発されている しかし、セキュリティシステムの開発やテストには手間がかかる. セキュリティシステムの 開発者が直面する問題. 作ったシステムのテストや評価が面倒 典型的な作業の流れ: 脆弱性を持つプログラムを準備する 脆弱性を突く攻撃コードを書く 自分のシステムがその攻撃を検出や防御できたかを調べる. 脆弱性を持つプログラムの 準備の仕方いろいろ. - PowerPoint PPT PresentationTRANSCRIPT
セキュリティ機構の開発と評価のための異常注入システム
大山 恵弘電気通信大学
背景コンピュータシステムへの攻撃の脅威は
依然として大きいその対策として、多くのセキュリティシス
テムが研究、開発されているしかし、セキュリティシステムの開発やテ
ストには手間がかかる
セキュリティシステムの開発者が直面する問題
作ったシステムのテストや評価が面倒
典型的な作業の流れ: 脆弱性を持つプログラムを準備する 脆弱性を突く攻撃コードを書く 自分のシステムがその攻撃を検出や防御でき
たかを調べる
脆弱性を持つプログラムの準備の仕方いろいろ
脆弱性情報などをもとに脆弱性を持つソフトウェアを探して拾ってくる 探すのが面倒 拾ってきたソフトウェアのバージョンは古くなり
がち自分で脆弱なプログラムを書く
トイプログラムになりがち人工的な脆弱性を含ませる改造を施す
改造は面倒であり、スキルも必要 ソースコードが必要
動機攻撃を受けたときに何が起こるかを、任意の
アプリケーションに対して調べたい 特に、セキュリティ機構が作動するかどうかを
調べたい アプリケーションには現在脆弱性が発見されて
いないものとする もし脆弱性があって、もし乗っ取られたら、何
が起こるかを見たい雑に言えば、攻撃被害のインスタンスを
(多少人工的でもいいので)大量生産したい
本研究の目的攻撃注入システム HyperAttacker の構築
プログラムのメモリ内容を書き換え、攻撃されたかのような効果を人工的に作り出す
脆弱性がないプログラムに、外部から異常を注入
ユーザは異常注入に関するシナリオを記述
実装戦略ソースコードの変換アスペクト指向ツールの利用アプリケーションプロセスのアドレス空間
上のデータを、外の何者かが更新 仮想マシンモニタが更新
他のプロセスが更新
長期的に目指したいもの
本研究で実装したプロトタイプ
HyperAttacker プロトタイプの構造
OS
アプリケーションプロセス
HyperAttackerプロセス
監視
操作
攻撃効果
シナリオ
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_inputnumcalled=1000
manipulation:sp <- bytes 10 ab 97 cd
シナリオ例2関数 parse_data の先頭に来た時
に、 0.003 の確率で、 200 バイトのランダムバイト列をバッファ buf に書き込む
condition:head in parse_datapossibility=0.003
manipulation:var buf <- randbytes 200
シナリオ例3関数 copy_buffer からの最初の復帰で、
関数 delete_password のアドレスを、リターンアドレス領域に書き込む
condition:tail in copy_buffernumcalled=1
manipulation:retaddr <- varaddr delete_password
実装ptrace システムコールを利用
HyperAttacker (親)プロセスがアプリケーション(子)プロセスの動作を追跡
子のシグナル受信、実行終了、システムコール呼び出しなどを検知
ブレークポイントを利用 ptrace により、シナリオで指定されたプログ
ラムポイントにブレークポイントを挿入 アプリケーションが指定の場所に到達したこ
とを検知
アプリケーションのコード領域へのブレークポイントの挿入
関数の先頭 / 末尾のコードアドレスを得る 実行型およびオブジェクトファイルが貼り付
けられた領域のアドレスを /proc から得る 領域内の関数のオフセットを objdump コマ
ンドで得る指定の関数内の call命令の情報を得る
objdump コマンドで逆アセンブルするptrace により、得られたアドレスの内容
を 0xcc で上書きする
異常の注入処理シナリオに沿って子プロセスのメモリの
内容を更新 ptrace を利用
データを書き込める場所 大域変数のあるアドレスから始まる領域 スタックポインタが指すアドレスから始まる
領域 現在のスタックフレームのリターンアドレス
領域
fork
アプリケーションプロセス
HyperAttackerプロセス
監視
監視アプリケーション
プロセス
fork
HyperAttackerプロセス
fork
exec
progAHyperAttack
erプロセス
監視
progB
progA用シナリオ
progB用シナリオ
コードに関する細かい事項対象プラットフォーム : Linux/x86コードサイズ
HyperAttacker 本体 :C で約 1000 行
プロセス監視ライブラリ PROMON:C で約 1400 行
実験1Webサーバ 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_tailnumcalled=1
manipulation:sp <- randbytes 2000
実験2Webブラウザ 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衝突問題を解決するカーネル空間への異常注入も可能になる
シナリオ言語の洗練 より複雑な条件やメモリ内容更新操作が書け
るようにする局所変数が指す領域やレジスタにもデータを注入
できるようにしたい条件に書く関数、注入される領域、注入するデー
タの部分にも乱数性を入れたい