• 検索結果がありません。

スタックフレームのセグ メント化によ るバッファオーバーフロー対策法

N/A
N/A
Protected

Academic year: 2022

シェア "スタックフレームのセグ メント化によ るバッファオーバーフロー対策法"

Copied!
35
0
0

読み込み中.... (全文を見る)

全文

(1)

2004

年度修士論文

スタックフレームのセグ メント化によ るバッファオーバーフロー対策法

提出日

:2005

年  

2

月  

2

指導

:

  山名早人助教授

早稲田大学大学院 理工学研究科 情報・ネットワーク専攻 学籍番号  

:

3603U114-5

蛭田   智則

(2)

概 要

 近年、バッファオーバーフローと呼ばれる脆弱性を利用した攻撃が増えつつある。バッ ファオーバーフローはプ ログラムの変数用に用意された領域に 、領域の大きさを越えた データが入力されることで発生する。バッファオーバーフローを利用した攻撃は、近年で は全体の50%を占めている。

バッファオーバーフローのなかで、最も危険なものがスタックオーバーフローである。

スタックオーバーフローが発生すると、リターンアドレスが書き換えられ、悪意あるコー ドが実行可能になる。それゆえ、スタックオーバフローを防ぐことは、多くの攻撃を防ぐ

ことに繋がるため非常に重要である。

スタックオーバーフローを防ぐ 手法として、StakGurad等のソフトウェアによる手法が 提案されている。しかし 、ソフトウェアによる手法は性能への影響が大きい。そのため、

近年になってSRASようなハード ウェアによる手法が提案された。SRASは性能への影響

が小さいが 、longjmpのようなLIFOとは異なる動作には対応が困難である。

本論文ではスタックフレームのセグ メント化によるスタックオーバーフローの解決手法 を提案する。SimpleScalarツールセット ver3.0dを用いて、本手法を実装し 、SPECINT95

を用いて性能への影響を検証した。検証の結果、提案手法適用による性能低下率は平均

2.53%であった。この値は 、ソフトウェアによる手法適用による性能低下率よりも低い値

である。

(3)

目 次

1章 はじめに 1

2章 バッファオーバーフロー 3

2.1 バッファオーバーフロー問題の動向 : : : : : : : : : : : : : : : : : : : : : : 3 2.2 スタックオーバーフロー : : : : : : : : : : : : : : : : : : : : : : : : : : : : 3 2.2.1 仮想メモリ空間 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 4 2.2.2 スタック: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 5 2.2.3 stack smaching : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7

3章 関連研究 8

3.1 ソフトウェアによる静的な解決手法 : : : : : : : : : : : : : : : : : : : : : : 8 3.1.1 コンパイラによる解決手法 : : : : : : : : : : : : : : : : : : : : : : : 8 3.1.2 ライブラリによる動的な解決手法 : : : : : : : : : : : : : : : : : : : 9 3.2 ハード ウェアによる解決手法: : : : : : : : : : : : : : : : : : : : : : : : : : 11 3.3 関連研究のまとめ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 15

4章 提案手法 17

4.1 方針 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 17 4.1.1 利便性 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 17 4.1.2 SRASが抱える問題点 : : : : : : : : : : : : : : : : : : : : : : : : : 18 4.2 手法 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 18 4.2.1 フレームポインタの利用 : : : : : : : : : : : : : : : : : : : : : : : : 19 4.2.2 動作 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 19

(4)

4.3 予備評価 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 20 4.4 性能オーバーヘッド : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 22

5章 実験環境、評価、考察 23

5.1 実験環境 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 23 5.2 評価結果 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 24 5.2.1 手続きの深さ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 24 5.2.2 性能への影響 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 25 5.3 考察 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 27

6章 おわりに 28

7章 謝辞 29

(5)

1

章 はじめに

 近年、バッファオーバーフローと呼ばれる脆弱性を利用した攻撃が増えつつある。バッ ファオーバーフローとはプログラムの変数用に用意された領域に、領域の大きさを越えた データが入力されることで発生する。バッファオーバフローを利用した攻撃を行うウィル スの例として、2001年に発生したCode Red2003年に発生したBlasterが挙げられる。

バッファオーバーフローを利用した攻撃は、CERT報告によれば 、近年では全体の50%

占めている1]

バッファオーバーフローにはいくつか種類がある。そのなかで、最も危険なものがスタッ クオーバーフローである。スタックオーバーフローが発生すると、リターンアドレスが書 き換えられ 、悪意あるコードが実行可能になる。その結果、システム全体がのっとられて しまう可能性が発生する。それゆえ、スタックオーバフローを防ぎ 、リターンアドレスの 改竄を防ぐことは 、多くの攻撃を防ぐことに繋がるため、非常に重要である。

スタックオーバーフローを防ぐ 手法として既に利用されているものにStakGurad2]や、

StackShiled3]がある。StakGuradStackShiledgccのパッチという形で提供されて

いる。Stackguardはプ ログラムコンパイル時にスタックオーバフローを防ぐコード を追

加する。StackShieldはプログラムコンパイル時に 、リターンアドレ スをデータ領域にコ

ピーする。これらの手法は、コンパイル済みのプログラムには適用できず、また、ソース コードが必ず必要なる。そこで、コンパイル済みのプログラムにも有効で、ソースコード を必要しないlibverify4]等が提案された。libverifyはプログラム実行時に、リターンアド レ スを保護する関数を追加する。

上で述べた各手法はスタックオーバーフローに対して効果的である。しかし 、ソフトウェ アによる実装であるため、性能のオーバーヘッドが大きい。2003年にSRAS5]6]という

ハード ウェアによる解決手法が提案された。SRASではリターンアドレスを保持するハー

(6)

ド ウェアリターンアドレススタックが用いられている。SRASはソースコード を必要とせ ず、オーバーヘッド も小さい。しかし 、longjmpのようなLIFOと異なる動作には対応が 困難である。

本論文ではスタックのセグ メント化によるスタックオーバーフローの解決手法を提案す る。本手法ではスタックフレームを2つのセグ メントに分けることで、ローカル変数とリ ターンアドレスを分離し 、リターンアドレス改竄を防ぐ。また、フレームポインタを利用 することで、longjmpへの対応を容易にしている。本実験では、SimpleScalarツールセッ

ト ver3.0dを用いて、提案手法を実装し 、SPECINT95を用いて性能への影響を検証した。

以下、第2章で、スタックオーバーフローの詳細について述べる。第3章では関連研究

について述べる。第4章では提案手法について述べる。第5章では実験環境、実験結果、

考察を述べる。第6章では 、本論文のまとめを述べる。

(7)

2

章 バッファオーバーフロー

2.1

バッファオーバーフロー問題の動向

本節では 、バッファオーバーフローを利用し た攻撃の動向について述べる。図2.1 CERT報告による最近10年のバッファオーバーフローを利用した攻撃の割合について示 したものである1]。図から 、近年になって 、バッファオーバーフローを利用した攻撃が 急激に増え、全体の50%以上を占めていることがわかる。特に、2001年に発生したCode Red2003年に発生したBlasterは世界規模でその被害が報告されている。

図2.1: CERT

2.2

スタックオーバーフロー

本節では、スタックオーバーフローについて述べる。はじめに、仮想メモリ空間につい て述べる。次に、仮想メモリ空間を構成する領域の1つであるスタック領域について述べ

(8)

る。最後にスタックオーバーフローについて述べる。

2.2.1

仮想メモリ空間

図2.2に一般的な仮想メモリ空間について示す。仮想メモリ空間はテキスト領域、静的 領域、ヒープ 領域、スタック領域の4つの領域で構成される。各領域について説明する。

なお、スタックについては次節で説明する。

テキスト領域は実行コードが格納されるメモリ空間である。テキスト領域は読み取り専 用の領域であるため、バッファオーバーフローは発生しない。

静的領域はスタティック変数やグローバル変数が格納されるメモリ空間である。静的領 域とヒープ 領域を合わせて、データ領域と呼ぶこともある。

ヒープ領域は動的に確保される変数が格納されるメモリ空間である。C言語ではmalloc

関数を介して利用することができる。ヒープ 領域はプ ログラマが自由に扱えるメモリ空 間であるが 、ガーベージコレクションがない言語ではメモリリークを引き起こす可能性が ある。

図2.2: 仮想メモリ空間

(9)

2.2.2

スタック

スタックはLIFOデータ構造のメモリ領域であり、手続き呼び出しとリターンの間の状 態を保持するために用いられる。

図2.3に示すように、メモリスタックは高位アドレスから低位アドレスに成長する連続 したメモリ領域としてインプリメントされる。スタックはフレームポインタ(FP)とスタッ

クポインタ(SP)で示されるスタックフレームで構成される。FPは実行中の手続きのス

タックフレームのベースを指し示し 、SPは実行中の手続きのスタックフレームのトップ を指す。スタックポインタ(SP)はスタックのトップを保持するために用いられる。デー タがスタックにプッシュ、もし くはスタックからポップされた場合、SPはそれに応じて変

化する。また、スタック上のデータを参照するためには 、SPにオフセットアドレ スを加 えたり、SPを直接変更したりする。手続きが新たに呼ばれた場合、現在スタックフレー ムのFPは新しい手続きのスタックフレーム内に保持される。

図2.3に図2.4のプログラムの場合のスタックの変化を示す。手続きfが手続きgを呼ぶ

と、新しいスタックフレームがスタック領域にプッシュされる。このフレームには、ポイ ンタs1、リターンアドレス、FP、ローカル変数abufが含まれる。手続きgが終了した

場合、プログラムはgのスタックフレーム内に保持されているアドレスに戻る。SPFP

は 、手続きfに属するスタックフレームの値に戻り、手続きgに属するスタックフレーム は効果的にスタック領域からポップされる。

(10)

図2.3: stack

図 2.4: sample program

(11)

2.2.3 stack smaching

図2.5に、図2.4のプログラムにおけるバッファオーバーフロー攻撃を示す。図2.4中の

手続きstrcpy()は入力データの領域チェックを行なわないため、バッファオーバーフロー

を引き起こす可能性がある。関数gにおいて、変数s1が指す文字列が 、変数bufのサイズ

を超える場合、手続きstrcpy()bufの領域を超えてデータを上書きする。攻撃者はこの 性質を利用し 、悪意あるコード と改竄したリターンアドレス含む文字列をスタック上に挿 入する。s1がそのような文字列であった場合、strcpy()は悪意あるコード をスタックにコ ピーし 、手続きgのスタックフレームにある手続きfのリターンアドレ スを悪意あるコー ド の最初の命令のアドレ スに上書することになる。その結果、手続きgが終了した場合、

プログラムは手続きfの代わりに悪意あるコード の先頭にジャンプし 、悪意あるコード を 実行することになる。

図2.5: stack smashing

(12)

3

章 関連研究

 本節では、スタックオーバフロー問題を解決する手法について述べる。スタックオーバー フロー問題の解決手法はソフトウェアによる手法と、ハード ウェアによる手法の2つに分 けることができる。従来は、ソフトウェアによる手法の提案が多かったが 、近年になって ハード ウェアを用いた手法が提案されてきている。

3.1

ソフト ウェアによる静的な解決手法

本節ではソフトウェアによる解決手法について述べる。ソフトウェアによる手法は、コ ンパイラによる静的な手法とライブラリによる動的な手法の2つに分けることができる。

3.1.1

コンパイラによる解決手法

StackGuard2]

Cowanらは1998年にStackGuardを提案している。StackGuardはコンパイラベースの解 決手法であり、gccのパッチという形式で提供されている。StackGuardStack Smaching

が発生し リターンアドレスが書き換えられた場合、リターンアドレスが格納されているメ モリの直前のメモリ格納にされている値も書き換えられるという性質を利用している。

StackGuardを用いてコンパイルされたプログラムは 、手続き呼び出し 時に、リターン

アドレスの前にCanaryと呼ばれる乱数を挿入し(3.1)、手続き終了時にCanaryの値を

比較する。Canaryの値が一致しなかった場合、プログラムは実行を停止する。

StackGuardでは 、ソースの再コンパイルが必要なため、ソースコードが残っていない

バイナリプログラムには適用出来ない。

(13)

図3.1: canaryの挿入

StackShield3]

2000年には、StackShieldが提案された。StackShiledはアセンブラを用いたコンパイラ ベースの解決手法であり、gccのパッチという形式で提供されている。

StachShieldはリターンアドレスを保存するためのretarrayと呼ばれるメモリ空間をデー タ領域に用意する(3.2)StackShieldを用いてコンパイルされたプログラムは、手続き 呼び 出し 時に 、リターンアドレ スのコピーをretarrayに保存し 、手続き終了直前に 、リ ターンアドレスのコピーを強制的にスタックに上書きする。したがって、プログラムは手 続き終了時、上書きされたリターンアドレスに実行を移すことになる。

StackShieldもまたコンパイルベースの解決手法であるため、適用にはソースコードが

必要になる。

3.1.2

ライブラリによる動的な解決手法

libsafe4]

Baratlooらは2000年にlibsafeを提案している。libsafeはライブラリベースの解決手法

である。libsafeに登録されている関数は、バッファオーバーフローを引き起こす可能性が

(14)

図 3.2: StackShield

ある標準関数に、配列の境界チェックなどを施した安全な関数である。

libsafeを用いた場合、プログラムは実行開始時に、libsafeに動的にリンクされる。標準 関数が呼ばれる場合、通常の標準ライブラリからではなく、安全なlibsafeから呼び出され

る。すなわち、libsafeはバッファオーバフロー引き起こす可能性がある標準関数を、安全 な関数に置換することでバッファオーバーフローを防ぐのである。

libsafeは、ソースコード を再コンパイルするこなくバッファオーバーフローを防ぐこと

ができる。しかし 、libsafeで防ぐことができるのは特定の標準ライブラリ関数に起因する バッファオーバフローのみである。さらに、標準関数に静的にリンクされたプログラムで は効果を発揮することはできない。

libverify4]

Baratlooらは2000年にlibsafeと共にlibverifyを提案している。libverifylibsafe

同様にライブラリベースの解決手法である。

libverifyStackGuardと同様にCanaryを用いてリターンアドレ スの改ざんを検出す る。StackGuardの場合、Canaryの値は乱数であるが 、libverifyではリターンアドレスと

libverify libverify

(15)

的にリンクされ 、init()関数が呼び出される。init()関数は次の3つステップを行う。

1.全ての手続きをヒープ 領域にコピーする

2.全ての手続きの先頭の命令をwrapper entry関数で上書きする

3.コピーされた手続きのリターン命令をwrapper exit関数で上書きする

wrapper entry関数はcanaryの値を保存し 、コピーされた手続きの先頭にジャンプする関 数である。また、wrapper exit関数はcanary値を比較し 、canary値が一致しない場合に

プログラムを終了させる関数である。

libverifyを適用した場合のプログラムの動作を図3.3に示す。プログラムの実行は次の

とおりである。

1.手続きの入り口でwrapper entryが呼び出される

2.ヒープ 領域にコピーされた手続きにジャンプし 、手続きを実行する

3.手続きの出口でwrapper exitが呼び出さる

4. canary値を比較し 、canary値が一致した場合、手続きに戻る。一致しなかった場合 プログラムを終了する

libverifyStackGuardと異なり、再コンパイルの必要がなく、ソースコード のないバ イナリプログラムにも適用可能である。しかし 、libverifyは全ての手続きをヒープ 領域に コピーするため、コード サイズが非常に大きくなる。

3.2

ハード ウェアによる解決手法

SRAS5],6]

Leeらは2003年にSRASを提案している。SRAS(Secure Return Address Stack)はプ

ログラムの実行中に手続きのリターンアドレスを保存するハード ウェアリターンアドレス スタックを用いてリターンアドレスの改ざんを防ぐものである。

図3.4にその構成を示す。SRASでは、手続き呼び出し時に、リターンアドレスがSRAS

のトップに保存され 、手続き終了時に、SRASのトップからリターンアドレスが取り出さ

(16)

図 3.3: メモリ使用

れ 、スタックからのリターンアドレスと比較する。リターンアドレスが一致しなかった場 合、その旨をプロセッサに通知し リターンアドレ スの改ざんを防ぐ。

SRASは限れたエントリ数のスタックであるため、保持されるリターンアドレス数がエ ントリ数を超えた場合、OSが割り込みをかけ、データを メモリの保存する。スタックが 空になった場合も、データをメモリからスタックに書き込むためにOSが割り込みをかけ

る。このOSによる割り込みがSRASのオーバーヘッド となる。SPEC2000ベンチマーク

を用いて性能評価した場合、SRASによる性能低下率は最大2.11%である。

また、SRASはハード ウェアスタックを用いているため、LIFO動作と異なる動作(C

語の標準関数であるsetjmplongjmp)にはOSの介在が必要である。

SCache7],8]

井上は2004年にSCacheを提案している。SCacheはキャッシュ上のラインにリターン アドレスのコピーを保持するレプ リカラインを用いてリターンアドレスの改ざんを防ぐも

(17)

図 3.4: SRAS

がキャッシュにストアされ、また、手続き終了時にリターンアドレスがキャッシュからロー ド されるという性質を利用している。

図3.5にその構成を示す。SCacheでは、通常のキャッシュに、全てのタグ・エントリに対 して、レプリカであるかを示す1ビットのレプリカフラグが付け加えられている。SCache

はレプ リカラインを1つ、もしくは複数生成可能である。SCacheは手続き呼び出し 時に レプリカラインにリターンアドレスのコピーを保存し 、手続き終了時にコピー元のリター ンアドレスとレプ リカラインからのリターンアドレスを比較する。リターンアドレスが一 致しなかった場合、その旨をプロセッサに通知し リターンアドレスの改ざんを防ぐ。ただ し 、全てのレプ リカラインがキャッシュから追い出されていた場合、リターンアドレスの 改ざんを防ぐことが出来ない。SPEC2000ベンチマーク(small input)を用いて性能評価

した場合、SCacheによる性能低下率は最大1.1%である。

SCacheではリターンアドレスのコピーの保存に通常のキャッシュラインを用いている。

そのため、ラインの追い出しによるリターンアドレスの改ざんの検出漏れが発生する。検 出漏れが発生する確立は0.3%程度であるが 、意図的に検出漏れを発生させる攻撃が考案 される可能性がある。

(18)

図3.5: scache

(19)

Microsoft社は2004年にNonExecutableTableを提案した。NonExecutableTableは メ

モリページ単位で実行可能かど うかを指定することで、データ領域に書き込まれたプログ ラムを実行できないようにするものである。

NonExecutableTableを用いてスタック領域のみを実行不可能とした場合、スタック領

域に挿入されたプログラムの実行は防ぐことはできるが 、リターンアドレスの書き換えを 防ぐ 事はできない。したがって、スタック領域以外に挿入されたプログラムを実行してし まう可能性がある。データ領域全体を実行不可能とした場合、JITのようなプログラムを

動的に生成しながら動作するプログラムが動かなくなってし まう可能性がある。

3.3

関連研究のまとめ

本節では 、第2章で述べた解決手法についてまとめる。表3.1、表3.2は各解決手法つ

いてまとめたものである。

表3.2における完全性とは 、スタックオーバーフローを完全に防げ るかを示すもので ある。この表から 、スタックオーバーフローを完全に防ぐ ことは難し いことが分かる。

StackGhostStackShieldにおいてはすでに検出をすり抜ける手法が指摘されている10]

SCacheは検出をすり抜ける手法は現時点では見つかっていないが 、ラインの追い出しが

あるため完全ではない。性能への影響については、ソフトウェアによる手法よりもハード ウェアによる手法のほうが性能に与える影響が小さいということが言える。

ソフトウェアによる手法は、システムの変更が少なくてすむが、ハード ウェアの場合シ ステム全体の変更が必要になる。しかし 、ハード ウェアによる手法は性能への影響はソフ トウェアにくれべて非常に小さく、既存のプログラムに変更を加えることなく効果は発揮 することができる。したがって、本論文では、ハード ウェアによって完全性を満たす手法 を模索する。

(20)

表3.1: 解決手法のまとめ1

解決手法 提案者 提案年 アプローチ 適応

StackGuard Cripson Cowan 1998 ソフトウェア 静的

StackShield 2000 ソフトウェア 静的

libsafe Arash Baratloo 2000 ソフトウェア 動的 libverify Arash Baratloo 2000 ソフトウェア 動的

SRAS Ruby B.Lee 2003 ハード ウェア 動的

SCache 井上弘士 2004 ハード ウェア 動的

NonExecutablePage Microsoft 2004 ハード ウェア 動的

表3.2: 解決手法のまとめ2

解決手法 システムの変更の必要性 有効性

コンパイラ OS プロセッサ 完全性 既存のプ ログラム 性能への影響

StackGuard Yes No No No No High

StackShield Yes No No No No Moderate

libsafe No Yes No No yes Moderate

libverify No Yes No Yes yes High

SRAS No Yes Yes Yes yes Low

SCache No No Yes No yes Low

NonExecutablePage No Yes Yes No yes Low

(21)

4

章 提案手法

 本節では、スタックフレームのセグ メント化によるスタックオーバーフロー問題の解決 手法を提案する。

4.1

方針

本論文では、スタックオーバーフローに対して完全耐性な耐性を持つこと目標とする。

また、手法の利便性を重視し 、ハード ウェアによる手法を選択する。

4.1.1

利便性

手法の利便性という点を考慮すると、ハード ウェアによる手法はソフトウェアによる手 法よりも有益であると考えられる。第1に、性能への影響が小さいことが挙げられる。第

2に 、ハード ウェアによる手法が利用者に対して透過的であることが挙げられる。ハード ウェアによる手法では、利用者は攻撃に対する手法の適応を意識する必要がない。しかし 、 ライブラリによる手法では、利用者自らがライブラリを用意しなければならない。第3に、

プログラムに変更の必要がないことが挙げられる。ソフトウェアによる手法はプログラム に何らかの変更を加える。プログラムに変更を加えた場合、プログラムが正常に動作する 保証はない。したがって、動作確認テストが必要になる。それに対して、ハード ウェアに よる手法は 、プログラムに変更を加える必要がないため、動作確認テストの必要がない。

これらのことから 、利便性の点から考えた場合、ハード ウェアによる手法は、ソフトウェ アによる手法よりも有益であるといえる。

(22)

4.1.2 SRAS

が抱える問題点

SRASはスタックオーバーフローに対して完全な耐性を持つハード ウェアベースの解決 手法である。しかし 、SRASではリターンアドレスの保存にLIFO動作のハード ウェアス タックを用いているため、longjmpへの対応が困難である。

longjmpLIFOとは異なる動作をする。longjmpが実行されると仮想メモリ上のスタッ クでは、スタックポインタが 、複数のスタックフレームに跨って移動する。それに伴い手 続き終了時のリターンアドレ スが変化する。しかし 、ハード ウェアスタックでは 、図4.1

に示すように 、手続きが終了した場合、頂点に保存されているアドレ スがポップされる。

そのため、ハード ウェアスタックでは、longjmpによる手続きのリターンアドレスの変化 に対応できず、必要なリターンアドレスを取得できない。以上のことから、提案手法では ハード ウェアスタックは使用しない。

図4.1: SRASの問題点

4.2

手法

提案手法では 、リターンアドレスが格納されているアドレスへの書き込みを禁止する。

(23)

数と手続き情報が、スタックフレーム内で分離されていないことにある。したがって、本論 文ではスタックフレームを2つのセグ メントに分割することを提案する。スタックフレー ムをローカル変数領域と手続き情報領域に分離し 、手続き情報領域への書き込みに制限を 加えることでリターンアドレスの改竄を防ぐ。実装では、スタックフレームを2つのセグ

メントに分割するための値を保存する必要が生じるが 、その保存法が重要になる。。SRAS

ではハード ウェアスタックを使用したために 、longjmpへの対応が困難になっている。

4.2.1

フレームポインタの利用

ハード ウェアスタックを単純に利用するのでは、longjmpへの対応が困難になる。そこ で 、本論文ではでは 、LIFO以外の動作に対応するために 、フレームポ インタ(FP)を利

用する。スタックフレームの先頭を指すFPを用いれば 、保存されている値がどの手続き に対応しているかを知ることが可能になる。

4.2.2

動作

値の保存先をセグ メントディスクリプタと呼ぶことにする。セグ メントディスクリプタ にはフレームポインタ(FP)と境界アドレ スが保存される。図4.2に提案手法の動作を示

す。図4.2(1)はデータの保存、開放についての動作を示したものである。手続き呼び 出し時に、FPとリターンアドレスを保存したアドレ スをセグ メントデ ィスクリプタに保 存し 、手続き終了時にセグ メントデ ィスクリプタを開放する。この動作は、ハード ウェア スタックと同様である。

図4.2(2)は書き込み命令実行時の動作について示したものである。始めに 、書き込 み先アドレスに対応するフレームのセグ メントディスクリプタを特定すし 、書き込み先ア ドレスとセグ メントデ ィスクリプタのFPを比較する。書き込み先アドレスがFPよりも

大きい場合、探索を続ける。書き込み先アドレスがFPよりも小さい場合、探索を終了す る。図4.2(2)では2つめのセグ メントデ ィスクリプタの探索で、対象となるセグ メン トディスクリプタを発見する。次に、書き込み先アドレスとセグ メントディスクリプタに 保存されているアドレスを比較する。書き込み先アドレスが、セグ メントディスクリプタ

(24)

に保存されているアドレスより小さい場合、書き込み命令を実行する。書き込み先アドレ スが、フレーム内のアドレ ス以上の場合、書き込み命令を停止する。図4.2(2)では書

き込み先アドレスがセグ メントディスクリプタに保存されているアドレスよりも小さいた め書き込みを実行する。

図4.2: 提案手法の動作

4.3

予備評価

本論文で提案する手法がスタックオーバフローに対して、有効であるかど うかを調べる ために予備評価を行った。予備評価に使用したプログラムを図4.3に示す。このプログラム はWRITNG SECURE CODE11]を参考に作成したものであり、strcpyの脆弱性を利用

している。スタックオーバフローが発生した場合、関数barが実行される。SimpleScalar

ツールセットver.3.0d12]sim-proleを用いて提案手法を実装し 、プログラムを実行し た。図4.4に提案手法を実装する前と、実装後のプログラムの実行結果を示す。図4.4

示すように、提案手法を実装した場合、リターンアドレスの改竄を防ぐことができること がわかる。このことから、本手法がスタックオーバーフローによるリターンアドレス改竄

(25)

図4.3: ハッキングプログラム

図4.4: 予備評価結果

(26)

4.4

性能オーバーヘッド

提案手法はフレームの探索、アドレスの比較を行うため、性能に影響を与える。フレー ムの探索には線形探索を使用している。本論文では探索1回に1サイクルかかると仮定す る。この場合、線形探索にはO(n)のサイクルがかかる。また、アドレスの比較にも1サイ

クルかかると仮定する。すなわち、書き込み命令時に最低でも2サイクルのオーバーヘッ ドが生じる。

(27)

5

章 実験環境、評価、考察

 本章では4章で提案手法の評価、考察を行う。

5.1

実験環境

提案手法による性能低下を検証するため、SimpleScalarツールセットver.3.0dsim- outorderを用いて提案手法を実装した。sim-outorderはアウト・オブ・オーダー実行可能 なサイクルレベルプロセッサシミュレータであり、提案手法実装時の性能への影響を計測 することができる。シミュレータのパレ メータを表5-1に示す。本論文では、デフォルト 値をそのまま使用した。計測するベンチマークとしてSPEC CINT95を使用した。入力

データとしてはtrain入力セットを使用している。詳細を表5.2に示す。

表 5.1: パラメータ

パイプライン段数 5

フェッチ幅 4

デコード 幅 4

発行幅 4

コミット幅 4

R UU

1サイズ 16

LSQ

2サイズ 8

分岐予測 bimod 2048KB

L1キャッシュ容量 命令:128KBデータ:512KB 1:Register Update Unit,2:Load Store Qeue

(28)

表5.2: SPEC CINT95ベンチマークプログラム プログラム 入力セット

0.99go 50 9 2stone9.in 124.mk88sim ctl.raw 129.compress 10000 q 2131

130.li train.lsp 132.ijpeg vigo.ppm

134.perl primes.in 147.vortex vortex.raw

5.2

評価結果

5.2.1

手続きの深さ

図5.1は各ベンチマークの手続きの深さを示したものである。図から、手続きの深さは 、

130.liを除いた、全てのベンチマークでは128を下回ることが分かる。

図5.1: 手続きの深さ

(29)

5.2.2

性能への影響

表5.35.45.5に評価結果を示す。表5.3は提案手法を実装しない場合の実行結果を 示している。表5.4は提案手法を実装した場合の実行結果を示している。表5.5は各ベン

チマークのIPCの低下率を示している。なお、表5.35.4中のsim num insnは 、コミッ

トされた命令数を示し 、sim cycleは 、実行にかかったサイクル数を示す。また、IPC sim num insn/sim cycleで求められる。

表5.35.4から、提案手法を適用してもsim num insnは変化していないことがわかる。

これは、提案手法が 、プログラムの実行に変更を加えないためである。また、表5.5から、

提案手法を実装した場合、IPCの低下率が最大5.3%であることが分かる。IPCの平均低

下率は2.53%である。

表5.3: 提案手法未実装

プログラム sim num insn sim cycle IPC 0.99go 553780948 624979255 0.8861 124.mk88sim 113268399 83461762 1.3571 129.compress 6874504 3744033 1.8361 130.li 182403683 120403441 1.5149 132.ijpeg 1404244114 702872240 1.9979 134.perl 10627762 9972317 1.0657 147.vortex 2608470452

(30)

表5.4: 提案手法実装済

プログラム sim num insn sim cycle IPC 0.99go 553780948 624982612 0.8861 124.mk88sim 113268399 83799962 1.3517 129.compress 6874504 3924161 1.7518 130.li 182403683 124984652 1.4594 132.ijpeg 1404244114 741808614 1.8930 134.perl 10627762 10121010 1.0501 147.vortex 2608470452 2393848936 1.0897

表5.5: IPC低下率

プログラム IPC低下率

0.99go 0%

124.mk88sim 0.4%

129.compress 4.6%

130.li 3.7%

132.ijpeg 5.3%

134.perl 1.5%

147.vortex %

(31)

5.3

考察

手続きの深さは 、130.liを除いた全てのベンチーマークで、128を下回っていた。した

がって、実際の実装では、セグ メントディスクリプタは128程度あれば十分であると言え る。手続きの深さがセグ メントデ ィスクリプタ数を超える場合は 、OSによってメモリへ

退避する。

評価実験により、本手法適用による性能低下は平均2.53%であることがわかった。この 結果はソフトウェアによる手法に比べて十分に小さいと言える。しかし 、ハード ウェアに よる手法に比べると大きなものである。本手法は書き込み命令時に、オーバーヘッドがか かるため性能低下率が大きくなる傾向がある。しかし 、本手法は、リミットアドレスを調 整することで、リターンアドレ スだけでなく、FP等の他の手続き情報をも保護すること が可能である。これは 、SRASSCacheに対して大きなアド バンテージである。

また、手続きの深さとIPCの低下に関連性は見られなかった。評価前は手続きの深さが 深いほど 探索にかかるサイクルするが多くなると考えていた。しかし 、関連性が見られな いことから、1回の探索にそれほど サイクルがかからないと考えられる。手続きの深さは 書き込み命令数よりも性能の低下に与える影響が少ないと言える。

本手法の性能を向上させるには 、書き込み時のオーバーヘッド を隠蔽する必要がある。

評価に用いたSimpleScalarツールセットver.3.0dのパイプラインはフェッチ、デコード、

実行、ライトバック、コミットの5段からなり、各ステージが1サイクルで実行される。そ のため、書き込み時のオーバーヘッドを隠蔽することができない。しかし 、デコード 処理 に数サイクルかかる場合は、書き込み時のオーバーヘッド を隠蔽する可能性が生じる。デ コード 処理中に探索を終了することができれば 、結果として、書き込み時のオーバーヘッ ドは減少する。実験の結果から、探索にかかるサイクル数は、多くないと仮定できる。し

たがって、デコード 処理が複数段に跨るプロセッサの場合、提案手法のオーバーヘッドは 隠蔽できると考えられる。

(32)

6

章 おわりに

 近年、バッファオーバーフローと呼ばれる脆弱性を利用した攻撃が増えつつある。CERT

報告によれば 、攻撃全体の50%を占めるほどである。バッファオーバーフローはプ ログ ラムの変数用に用意された領域に、領域の大きさを越えたデータが入力されることで発生 する。

バッファオーバーフローのなかで、最も危険なものがスタックオーバーフローである。

スタックオーバーフローが発生すると、リターンアドレスが書き換えられ、悪意あるコー ドが実行可能になる。その結果、システム全体がのっとられてし まう可能性が発生する。

本論文では、スタックフレームのセグ メント化によるスタックオーバフロー対策法を提 案した。提案手法では 、スタックフレームをローカル変数領域と手続き情報領域に分離 し 、手続き情報領域への書き込みに制限を加えることでリターンアドレ スの改竄を防ぐ 。

SimpleScalarツールセットver.3.0dsim-outorderを用いて提案手法を実装し 、評価実 験を行った。評価実験の結果、本手法の適応による性能への影響は平均2.53%であった。

この結果はソフトウェアによる手法に比べて十分に小さいと言える。

今後は 、提案手法のオーバーヘッドが小さくなるように改良を行っていく必要がある。

評価実験の結果から、デコード 処理が複数段に跨るプロセッサでは、提案手法適用による オーバヘッド を隠蔽できると可能性が生じた。したがって、SimpleScalarのデコード 処理

を複数段に改良し 、提案手法適用によるオーバーヘッド の評価を行う予定である。

(33)

7

章 謝辞

 本研究の一部は、21世紀COEプログラム「プロダクティブICTアカデミア」によるも

のである。

本研究に当たり、たくさんの指導、助言を頂いた早稲田大学理工学部情報学科山名早人 助教授に感謝の意を表します。

(34)

参考文献

1] CERT Advisories:http://www.cert.org/advisories

2] Cripson Cowan,Calton Pu,Dave Maier,Heather Hinton,Jonathan Walpole,Peat Bakke,Steve Beattie,Aaran Grier,Perry Wagle and Qian Zhang:StackGuard:Automatic Adaptive Detection and Prevention of Buer- Overow Attacks,Proceedings of the 7th USENIX Security Symposium,pp.63- 78,1998

3] A "stack smashing" technique protection tool for Linux:

http://www.angelre.com/sk/stackshield

4] Arash Baratloo,Navjot Singh and Timothy Tsai:Transparent Run-Time Defense Against Stack Smaching Attacks,Proceedings of the USENIX Security Annual Tech- nical Conference,2000

5] Ruby B.Lee,David K.Karig,John P.McGregor and Zhiijie Shi: Enlisting Hardware Architecture to Thwart Malicious Code Injection, Proceeding ofIEEE International Conference on Security in Pervasive Computing,pp.237-252,2003

6] John P.McGregor,David K.Karig,Zhijie Shi and Ruby B.Lee:A Processor Architec- ture Defense against Buer Overow Attacks,Proceedings of IEEE International Conference on Information Technology:Research and Education,pp.243-250,2003 7] 井上弘士:バッファ・オーバーフロー・アタックを動的に検出するセキュア・キャッシュ-

全性と消費エネルギーのトレードオフ-,先進的計算基盤システムシンポジウムSACSIS

(35)

8] 井上弘士:不正プログラムの実行防止を目的とするオンチップ・キャッシュ・アーキテ クチャ,情報処理学会研究報告,ARC-159,pp.121-126,2004

9] Microsoft TechNet. Change to Functionality in MicroSoft WindowsXP Service Pack2 - Part3 Memory Protection Technologies:

http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2mempr.mspx 10] Gerardo Richarte:Four dierent tricks to bypass StackShield and StackGuard pro-

tection,Technical report Core Security Technologies, 2002

11] Michael Howard and David LeBlanc:WRITING SECURE CODE,Microsoft Press 12] D.Burger and T.M.Austin:The SimpleScalar Tool Set, Version 2.0, University of

Wisconsin-Madison Computer Sciences Department Technical Report no.1342,1997

参照

関連したドキュメント

このモデル事業は、平成 19 年度からの 4

提案手法 本研究で提案する手法の処理手順を図 2.1 に示す.

議案との関係性について株主総会において説明することであり,

テスト戦略 (テスト計画) D-Case テスト戦略の合意 テスト全体の戦略の合意を取るため  テストの 前提条件 と ゴール を明確にする  残す エビデンス

概要:マルチコア環境における並列プログラミングでは,メモリアクセスの調停には一般にロックが用い

衷1:文献[2】の手法と掟案手法による最良解甲平均の比較 1244.39 1267.45 問題タイプ [2]・の結果 提案手法 rl* cl 828.31 828.31 rcl* 1266.45

提案手法では検査モデル生成の困難さの解決法として、環境モデリング手法、同意義パ ターン定義の

4 近傍にある seed を chain filter によってまとめる 5 Seed を中心にギャップありで伸長を行う gapped extension を実行する