slide (PowerPoint 2007)

セキュリティ機構の開発と評価
のための異常注入システム
大山 恵弘
電気通信大学
背景

コンピュータシステムへの攻撃の脅威は
依然として大きい

その対策として、多くのセキュリティシ
ステムが研究、開発されている

しかし、セキュリティシステムの開発や
テストには手間がかかる
セキュリティシステムの
開発者が直面する問題

作ったシステムのテストや評価が面倒
典型的な作業の流れ:



脆弱性を持つプログラムを準備する
脆弱性を突く攻撃コードを書く
自分のシステムがその攻撃を検出や防御でき
たかを調べる
脆弱性を持つプログラムの
準備の仕方いろいろ

脆弱性情報などをもとに脆弱性を持つソフト
ウェアを探して拾ってくる



自分で脆弱なプログラムを書く


探すのが面倒
拾ってきたソフトウェアのバージョンは古くなり
がち
トイプログラムになりがち
人工的な脆弱性を含ませる改造を施す


改造は面倒であり、スキルも必要
ソースコードが必要
動機


攻撃を受けたときに何が起こるかを、任意の
アプリケーションに対して調べたい

特に、セキュリティ機構が作動するかどうかを調
べたい

アプリケーションには現在脆弱性が発見されてい
ないものとする

もし脆弱性があって、もし乗っ取られたら、何が
起こるかを見たい
雑に言えば、攻撃被害のインスタンスを
(多少人工的でもいいので)大量生産したい
本研究の目的

攻撃注入システム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衝突問題を解決する
カーネル空間への異常注入も可能になる
シナリオ言語の洗練

より複雑な条件やメモリ内容更新操作が書け
るようにする


局所変数が指す領域やレジスタにもデータを注入
できるようにしたい
条件に書く関数、注入される領域、注入するデー
タの部分にも乱数性を入れたい