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