(Translated by https://www.hiragana.jp/)
バッファオーバーフロー - Wikipedia

バッファオーバーフローえい: buffer overflow)またはバッファオーバーランえい: buffer overrun)は、コンピュータプログラムにおけるバグのひとつ、またはそれによりこされる現象げんしょうで、プログラムがバッファてられた空間くうかんよりもおおきなデータをむことで、データがバッファ境界きょうかいからあふれ、バッファの範囲はんいがいのメモリを上書うわがきし、元々もともとそのメモリにあったデータを破壊はかいしてしまうことをす。

バッファオーバーフローは、上書うわがきされるメモリ領域りょういきがスタック領域りょういきなのかヒープ領域りょういきなのかにおうじてそれぞれスタックベースのバッファオーバーフローヒープベースのバッファオーバーフローばれる。なお、名称めいしょうているスタックオーバーフローとはべつ現象げんしょうである。

サイバーセキュリティ情報じょうほうセキュリティ分野ぶんやでは、バッファオーバーフローはメモリ破壊はかいけい脆弱ぜいじゃくせいひとつとしてられ[1]攻撃こうげきしゃがバッファオーバーフロー脆弱ぜいじゃくせいのあるプログラムに意図いとてき悪意あくいのあるデータ(コード)をあたえることにより、コンピュータの制御せいぎょってしまうことを可能かのうにする。バッファオーバーフロー脆弱ぜいじゃくせい悪用あくようした攻撃こうげきバッファオーバーフロー攻撃こうげきという[2]

バッファオーバーフローの具体ぐたいれい

編集へんしゅう

簡単かんたんれい

編集へんしゅう

以下いかれいでは、プログラムちゅう隣接りんせつしたアドレスに2つのデータ項目こうもく定義ていぎされている。ひとつは 8 バイトの文字もじれつバッファ A、もうひとつは 2 バイトの整数せいすう B である。初期しょき状態じょうたいでは、A は 0 で初期しょきされており可読かどく文字もじはいっていない。また、B には整数せいすう 1,979 が格納かくのうされている。文字もじのバイトはばは 1 バイトとする。また、エンディアンはビッグエンディアンとする。

変数へんすうめい A B
NUL NUL NUL NUL NUL NUL NUL NUL 1979
16しん数値すうち 00 00 00 00 00 00 00 00 07 BB

ここで、プログラムがバッファ Aヌル終端しゅうたん文字もじれつ「excessive」をきこもうとした場合ばあいかんがえる。文字もじれつながさチェックがおこなわれていないと、この処理しょりB上書うわがきされてしまう。

変数へんすうめい A B
「e」 「x」 「c」 「e」 「s」 「s」 「i」 「v」 25856
16しん数値すうち 65 78 63 65 73 73 69 76 65 00

プログラマとしては B変更へんこうする意図いとはなかったが、B文字もじれつ一部いちぶえられてしまった。このれいではビッグエンディアンとASCIIコードを仮定かていしているため、文字もじ「e」とゼロというバイトれつ整数せいすう 25,856 として解釈かいしゃくされる。ここで、かりにプログラムちゅうAB 以外いがいにデータ項目こうもく変数へんすう定義ていぎされていないとものすると、さらになが文字もじれつんで B終端しゅうたんえた場合ばあいにはセグメンテーション違反いはんなどのエラーが発生はっせいしてプロセスが終了しゅうりょうする。

電子でんしメールアドレスを題材だいざいにしたれい

編集へんしゅう

コンピュータプログラムをつくるとき、固定こていちょうバッファとよばれる領域りょういき確保かくほしてそこにデータ保存ほぞんするという手法しゅほうがよく使つかわれる。

たとえば、電子でんしメールアドレスは200文字もじえないだろうと予想よそうして

  1. 200文字もじぶん領域りょういきをバッファとして用意よういする。
  2. ユーザが200文字もじよりながメールアドレス入力にゅうりょくする。
  3. プログラムがバッファのおおきさをチェックせずに入力にゅうりょくデータをむ。
  4. バッファとして確保かくほした領域りょういきをはみだしてデータがまれてしまう。

これがバッファオーバーフローである。かりにはみした部分ぶぶんにプログラムの動作どうさじょう意味いみつデータがあれば、これを上書うわがきして破壊はかいすることにより、プログラムはユーザの意図いとしない挙動きょどうしめすであろう。

このようにバッファオーバーフローは、プログラムが用意よういしたバッファのおおきさをえてデータをんでしまうバグである。

C言語げんご特有とくゆうれい

編集へんしゅう

C言語げんご標準ひょうじゅん入出力にゅうしゅつりょく関数かんすうであるgets関数かんすうはバッファちょうのチェックをおこなわないで標準ひょうじゅん入力にゅうりょくをバッファにむので、この関数かんすう使つかすべてのプログラムには、バッファオーバーフローによる不正ふせい動作どうさ危険きけんせいがある。また使つかかたかりやすいという理由りゆうでC言語げんご初心者しょしんしゃけの入門にゅうもんプログラミングでしばしばもちいられるscanf関数かんすう書式しょしき指定していあやまった場合ばあいおな危険きけんせいっている[3]。これらの関数かんすう実用じつようてきなプログラムでもちいる場合ばあいには注意ちゅうい必要ひつようである。

つぎのプログラムはgets関数かんすうもちいたれいである(セキュリティじょう、gets関数かんすうはそれ自体じたいをテストする以外いがい目的もくてき使用しようされるべきではない。Linux Programmer's Manualには「gets()は絶対ぜったい使用しようしてはならない」とかれている)。バッファちょうとして200バイト確保かくほされている。gets関数かんすうはバッファのながさについては関知かんちしないため、200バイトをえても改行かいぎょう文字もじかEOFがあらわれなければバッファオーバーフローが発生はっせいする。

#include <stdio.h>
int main(int argc, char *argv[])
{
  char buf[200];
  gets(buf);
  ....
}

gets関数かんすうわりにfgets関数かんすうもちいることで、この問題もんだい回避かいひできる(fgets#getsをえるれいひとし参照さんしょう)。fgets関数かんすうにはバッファのサイズをわたすことができ、このバイトすうえてバッファにみをおこなわない。したがってバッファサイズがただしく設定せっていされていれば、fgets関数かんすうにおいてバッファオーバーフローはこりない。

これ以外いがいのC言語げんご標準ひょうじゅん文字もじれつ処理しょり関数かんすうおおくにも同様どうよう問題もんだい脆弱ぜいじゃくせい)がある。

バッファオーバーフロー攻撃こうげき

編集へんしゅう

情報じょうほうセキュリティ・サイバーセキュリティにおいてバッファオーバーフロー攻撃こうげきは、バッファオーバーフローの脆弱ぜいじゃくせい利用りようした攻撃こうげきである。バッファオーバーフローの脆弱ぜいじゃくせい整数せいすうオーバーフロー書式しょしき文字もじれつバグUse-After-Freeなどと同様どうよう、メモリ破壊はかいけい脆弱ぜいじゃくせい相当そうとうする[1]

共通きょうつう脆弱ぜいじゃくせいタイプCWEには、

番号ばんごう 名称めいしょう
CWE-120 入力にゅうりょくサイズをチェックしないバッファのコピー(古典こてんてきバッファオーバーフロー)[4]
CWE-121 スタックベースのバッファオーバーフロー[5]
CWE-122 ヒープベースのバッファオーバーフロー[6]

などが登録とうろくされており、これら3つはいずれも「CWE-119: メモリバッファの境界きょうかいないにおける操作そうさ不適切ふてきせつ制限せいげん[7]ぞくしている[7][8]

これら3つのバッファオーバーフロー脆弱ぜいじゃくせい頻繁ひんぱんしょうじるのはC言語げんごC++であり[4][5][6]古典こてんてきバッファオーバーフローはアセンブリ言語げんごでもしょうじる[4]

これら3種類しゅるいのバッファオーバーフローはセキュリティポリシーの外側そとがわ任意にんいのコードを攻撃こうげきしゃ実行じっこう可能かのうにすること頻繁ひんぱんにある[4][5][6]。さらに任意にんいのコードの実行じっこうによりのセキュリティサービス機構きこう破壊はかいすること可能かのうになる[4][5][6]。またこれら3種類しゅるいのバッファオーバーフローはクラッシュの原因げんいんにもなるので[4][5][6]意図いとてきにクラッシュさせる攻撃こうげき可能かのうになる[4][5][6]

CWEでは「CWE-193: Off-by-oneエラー[9]がバッファオーバーフローの原因げんいんになるとべられており[10]整数せいすうオーバーフローもバッファオーバーフローの原因げんいんになることべられている[11]

古典こてんてきバッファオーバーフロー攻撃こうげき

編集へんしゅう

バッファAののバッファBにコピーするとき、BのバッファサイズがAのバッファサイズよりもおおきいことをチェックしない場合ばあいしょうじる脆弱ぜいじゃくせいである[4]。この脆弱ぜいじゃくせいは、プログラマーがこのようなチェックの実装じっそうおこたったことによりしょうじる[4]。これはプログラマーが最低限さいていげんのセキュリティチェックすらしていないことをつよ示唆しさする[4]

脆弱ぜいじゃくせい具体ぐたいれいとしては、たとえばC言語げんごC++において、配列はいれつサイズをチェックすることなく、配列はいれつstrcpyscanf文字もじれつとうをコピーするといったものがある[4]攻撃こうげきしゃ意図いとてきおおきな入力にゅうりょくstrcpyscanfgetsあたえることで、古典こてんてきバッファオーバーフローを不正ふせいしょうじさせることができる[4]

たとえば攻撃こうげきしゃがバッファAをバッファオーバーフローさせることにより、Aのとなりにある変数へんすうxを不正ふせい変更へんこうできた場合ばあい、xがセキュリティじょう重要じゅうようなデータ(たとえば管理かんりしゃ権限けんげんっているかかを判定はんていするビットを保持ほじしている)であれば、セキュリティじょう重要じゅうよう問題もんだいしょうじる。

スタックベースのバッファオーバーフロー攻撃こうげき

編集へんしゅう

スタックベースのバッファオーバーフローは「上書うわがきされるバッファがスタック(すなわち、局所きょくしょ変数へんすうや、まれに関数かんすうのパラメータ)にアロケートされる」[5]こと可能かのう場合ばあいしょうじる脆弱ぜいじゃくせいである。このような脆弱ぜいじゃくせいファジング使用しようして発見はっけんされることがおお[12]

C言語げんご・C++におけるメモリ領域りょういき

編集へんしゅう

スタックベースのバッファオーバーフローについて説明せつめいするためにプロセスのメモリ利用りよう方法ほうほう復習ふくしゅうする。オペレーティングシステム (OS) はかくユーザプロセスに仮想かそうアドレス空間くうかんり、WindowsLinuxなどのOSでは上位じょういのアドレスをカーネルが使つかカーネル空間くうかんとし、のこりをユーザプロセス自身じしんもちいるユーザ空間くうかんとする[注釈ちゅうしゃく 1]。カーネル空間くうかんはユーザプロセスがアクセスすることはできず、通常つうじょうのプログラミングでは意識いしきすることはない。

C言語げんごC++かれたプログラムの場合ばあい、ユーザ空間くうかんをさらに分割ぶんかつする。これらの言語げんごかれたプログラムでは、仮想かそうアドレスの最低さいてい箇所かしょからじゅんにプログラムの実行じっこうコードをコード領域りょういき(テキスト領域りょういきとも)初期しょきされた静的せいてき変数へんすう大域たいいき変数へんすうデータ領域りょういき初期しょきされていない静的せいてき変数へんすう大域たいいき変数へんすうbss領域りょういき[注釈ちゅうしゃく 2][注釈ちゅうしゃく 3]mallocとう動的どうてき確保かくほされたメモリをく(可変かへんサイズの)ヒープ領域りょういき確保かくほする[13]

一方いっぽう、ユーザ空間くうかんにおける仮想かそうアドレスの最高さいこう箇所かしょ関数かんすうコールスタック保存ほぞんする(可変かへんサイズの)スタック領域りょういきとしてもちいられる[13]

最低さいてい 最高さいこう
コード領域りょういき 静的せいてき領域りょういき ヒープ領域りょういき

高位こういかって成長せいちょう→)

スタック領域りょういき

(←低位ていいかって成長せいちょう

データ領域りょういき bss領域りょういき

スタック領域りょういきはプロセスちゅうばれる関数かんすうのコールスタックを格納かくのうする領域りょういきで、コールスタックちゅうかく関数かんすうのデータ(スタックフレームという)をならべて格納かくのうしている[14]。プロセスちゅう関数かんすうfが関数かんすうgをした場合ばあい、コールスタックは以下いかのようになる[14][15]

低位ていいアドレス 高位こういアドレス
gのスタックフレーム fのスタックフレーム
gの処理しょり必要ひつよう一時いちじてき情報じょうほう gの局所きょくしょ変数へんすう gのSFP gのリターンアドレス gの引数ひきすう fの処理しょり必要ひつよう一時いちじてき情報じょうほう

プロセスで現在げんざい実行じっこうちゅう関数かんすうのスタックフレームの位置いちおぼえるためにプロセッサによってもちいられるのがフレームポインタ[注釈ちゅうしゃく 4]で、具体ぐたいてきには(現在げんざい実行じっこうちゅう関数かんすうがgであれば)gのSFPのアドレスをしている。SFP関数かんすうもと関数かんすうのフレームポインタのアドレスをおぼえるための領域りょういきで、fがgをしたさい、スタックフレームの(=fのSFPのアドレス)をgのSFPに格納かくのうする。なお、SFPは「Saved Frame Pointer」のりゃくで、日本語にほんごやくは「退避たいひされたフレームポインタ」である[14]

一方いっぽうgのリターンアドレスもと関数かんすうfのプログラムカウンタ[注釈ちゅうしゃく 5]のアドレスを格納かくのうする[14]

攻撃こうげき基本きほんてきアイデア

編集へんしゅう

いまたとえば、関数かんすうgはユーザから(ASCIIコードの)文字もじれつ入力にゅうりょくり、入力にゅうりょくされた文字もじれつ配列はいれつchar A[10]に格納かくのうするとする。Aのサイズは10であるので、関数かんすうgのプログラマはユーザからった文字もじれつをAに格納かくのうするまえに、その文字もじれつ本当ほんとうに10文字もじ以下いかなのかをチェックする機構きこうをgに実装じっそうしておかねばならない。このようなチェック機構きこう実装じっそうするのをわすれていた場合ばあい悪意あくいのあるユーザ(以下いか、「攻撃こうげきしゃ」とぶ)によりスタックベースのバッファオーバーフロー攻撃こうげきけてしまう危険きけんがある。

具体ぐたいてきには、攻撃こうげきしゃ以下いかのような文字もじれつをgに入力にゅうりょくする:

シェルコード)…(シェルコードの仮想かそうアドレス

ここでシェルコードとは、なんらかの悪意あくいのあるみじかいプログラムで、たとえば攻撃こうげきしゃのためにバックドアをけたり、マルウェアのダウンロードをおこなったりする[15]

この文字もじれつ配列はいれつAの先頭せんとうからじゅんまれていくと、A[i]のアドレスはiがおおきいほどおおきくなるので攻撃こうげきしゃ入力にゅうりょく文字もじれつながさを適切てきせつえらべば、アドレス空間くうかんには以下いかのようにデータがまれ、gのリターンアドレスがシェルコードの仮想かそうアドレスに上書うわがきされる[15]

低位ていいアドレス 高位こういアドレス
gのスタックフレーム fのスタックフレーム
gの処理しょり必要ひつよう一時いちじてき情報じょうほう gの局所きょくしょ変数へんすう gのSFP gのリターンアドレス gの引数ひきすう fの処理しょり必要ひつよう一時いちじてき情報じょうほう
(シェルコード)… (シェルコードの仮想かそうアドレス)

よって関数かんすうgが終了しゅうりょうしたとき、gのリターンアドレス(の箇所かしょ上書うわがきされたシェルコードの仮想かそうアドレス)がまれるので、プログラムカウンタはシェルコードの位置いちにジャンプし、攻撃こうげきしゃねらどおり、シェルコードが実行じっこうされることになる[15]

うえべた攻撃こうげきのアイデアが実行じっこう可能かのうであるためには、攻撃こうげきしゃがリターンアドレスに上書うわがきすべき仮想かそうアドレスを正確せいかくり、それを関数かんすうgに入力にゅうりょくする必要ひつようがあるが、スタックは動的どうてき変化へんかするため、これは容易よういではない[16]。そこで本節ほんぶしではリターンアドレスに上書うわがきすべき仮想かそうアドレスの「おおよその」さえかれば攻撃こうげき可能かのうになるテクニック(NOPスレッド)をべる。

NOPとは「なにおこなわない」こと意味いみするアセンブリ命令めいれい[16]本来ほんらいはタイミングをわせるなどの動機どうきによりなにもせずにCPU時間じかん消費しょうひするためにもちいられる[16]。NOPスレッド(sled、そり)[16]とはこのNOP命令めいれい複数個ふくすうこならべたもので、これを利用りようすることにより攻撃こうげき対象たいしょう関数かんすうをシェルコードの位置いちまで滑走かっそうさせる。

具体ぐたいてきには攻撃こうげきしゃ下記かきのような文字もじれつ攻撃こうげき対象たいしょう関数かんすうgに入力にゅうりょくする:

NOP … NOP (シェルコード)(もどりアドレス)…(もどりアドレス)

最初さいしょの「NOP … NOP」の部分ぶぶんがNOPスレッドである。攻撃こうげきしゃがNOPスレッドのながさやもどりアドレスのかえ回数かいすう適切てきせつえらんでgに入力にゅうりょくすると、スタック領域りょういきたとえば以下いかのようになる(攻撃こうげき関係かんけいする部分ぶぶんだけ抜書ぬきがき):

gのスタックフレーム fのスタックフレーム
gの局所きょくしょ変数へんすう gのSFP gのリターンアドレス
NOP… NOP NOPNOP (シェルコード)…(もどりアドレス)…(もどりアドレス) (もどりアドレス) (もどりアドレス)…

これでgのリターンアドレスは「もどりアドレス」にセットされるので、攻撃こうげきしゃが「もどりアドレス」としてNOPスレッド部分ぶぶんのアドレスを指定していすること事前じぜん成功せいこうしていれば、gの終了しゅうりょうにNOPスレッドへとプログラムカウンタが移動いどうする。するとプログラムはNOPをじゅん実行じっこうしてみぎみぎへと移動いどうし、シェルコードの位置いちにたどりいてシェルコードが実行じっこうされるので、攻撃こうげき成功せいこうとなる[16][17]もどりアドレスがNOPスレッドのどこかにちさえすればよいので、前節ぜんせつべた攻撃こうげきちがい、リターンアドレスにセットする完璧かんぺき制御せいぎょする必要ひつようはなく、NOPスレッドのながぶん誤差ごさ発生はっせいしても攻撃こうげき成功せいこうすることになる。

NOPスレッドは頻繁ひんぱん使用しようされるため、おおくの侵入しんにゅう防止ぼうしシステムベンダーでシェルコードの判定はんてい使用しようされている。このため、エクスプロイトの作成さくせいしゃがわでは、シェルコードの実行じっこう影響えいきょうおよぼさない(NOP以外いがいの)任意にんい命令めいれいをランダムにえらんでスレッドを構成こうせいすることが常套じょうとう手段しゅだんとなっている[18]

もどりアドレスの予想よそう

編集へんしゅう

攻撃こうげき実行じっこうするには、あとは「もどりアドレス」として具体ぐたいてきにどの程度ていど代入だいにゅうすればよいかをればよい。しかし攻撃こうげき標的ひょうてきとなる組織そしき環境かんきょうもどりアドレスの絶対ぜったいアドレスがいくつ程度ていどになるのかを事前じぜんことむずかしい。そこで相対そうたいアドレスを利用りようしてもどりアドレスを適切てきせつえら攻撃こうげきテクニックを紹介しょうかいする。この攻撃こうげきのシナリオでは、攻撃こうげきしゃはシェルコードをふくんだ攻撃こうげきようのプログラムh(をコンパイルしてつくった実行じっこうコード)を攻撃こうげき標的ひょうてきとなる組織そしきおくりつけ、hのサブルーチンとしてgをこと攻撃こうげきおこなう。

この攻撃こうげきようプログラムhでは、変数へんすうxを宣言せんげん宣言せんげんされているものとする。hが標的ひょうてき環境かんきょうでgをしたとき、gのスタックフレームはスタック領域りょういきじょうでhのスタックフレームのすぐとなり配置はいちされることから、攻撃こうげきよう文字もじれつむgの変数へんすう絶対ぜったいアドレスvar_addは

var_add = &x - (ちいさな)

になるはずである[16]。ここで「&x」はxのアドレスをあらわす。すでべたようにNOPスレッドを使つかった攻撃こうげきではもどりアドレスとしてvar_add近辺きんぺんえらべば成功せいこうするので、攻撃こうげきしゃはこの「ちいさな」を決定けっていしさえすればよい。

よって攻撃こうげきしゃ関数かんすうgの実行じっこうコードを事前じぜん入手にゅうしゅし、(シェルスクリプトひとし使つかって)NOPスレッドのながさやもどりアドレスをえながら攻撃こうげき対象たいしょうのプログラムをなん実行じっこうすることで適切てきせつな「ちいさな」をえらび、その「ちいさな」を攻撃こうげきようプログラムhにんでおけばよい[16]

めるコードりょうちいさい場合ばあい対処たいしょ

編集へんしゅう

関数かんすうgに攻撃こうげきよう文字もじれつは「NOPスレッド+シェルコード+もどりアドレスのかえし」というかたちをしており、gのリターンアドレスが「もどりアドレスのかえし」の部分ぶぶんちないかぎ攻撃こうげき成功せいこうしないので、関数かんすうgに攻撃こうげきよう文字もじれつ箇所かしょとgのリターンアドレスとが(仮想かそうアドレス空間くうかんじょうで)あまりにちか場合ばあいは、攻撃こうげき必要ひつようながさのシェルコードをめないという問題もんだい攻撃こうげきしゃしょうじる。

しかし攻撃こうげきしゃ攻撃こうげき標的ひょうてきとなるマシンの環境かんきょう変数へんすう設定せっていできる状況じょうきょうでは、攻撃こうげきしゃはこの問題もんだい回避かいひした攻撃こうげき可能かのうである。標的ひょうてきマシンでプロセスが実行じっこうされるさいには、そのプロセスの仮想かそうアドレス空間くうかん環境かんきょう変数へんすうまれるので、攻撃こうげきしゃ事前じぜん標的ひょうてきマシンの環境かんきょう変数へんすうに「NOPスレッド+シェルコード」をんでおけば、プロセスの仮想かそうアドレスに「NOPスレッド+シェルコード」ができあがることになる。プロセスちゅう関数かんすうgが実行じっこうされたさい攻撃こうげきしゃ攻撃こうげきよう文字もじれつをgに入力にゅうりょくして、リターンアドレスをそのNOPスレッドにえれば攻撃こうげき成功せいこうすることになる[19]

より確実かくじつ攻撃こうげき方法ほうほうとして、攻撃こうげきプログラムhのなか環境かんきょう変数へんすう関数かんすう(getenv()とう)をもちいるものもある[20]

ヒープスプレー

編集へんしゅう

NOPスレッドをながくしすぎると、gのリターンアドレスの位置いちにすらNOPがまれてしまって攻撃こうげき失敗しっぱいするため、NOPスレッドをながくして攻撃こうげき成功せいこうりつげる手法しゅほうには限界げんかいがある。しかし攻撃こうげきしゃがプロセスのヒープ領域りょういきをも自由じゆうあやつれるという条件下じょうけんかでは、攻撃こうげきしゃヒープスプレーというテクニックをもちいることにより、この限界げんかい突破とっぱした攻撃こうげきおこなこと可能かのうになる[21]

ヒープスプレーでは、NOPスレッドとシェルコードを、スレッド領域りょういきではなくヒープ領域りょういきみ、もどりアドレスとしてヒープ領域りょういきちゅうのNOPスレッドを指定していする。ヒープ領域りょういきじょうのNOPスレッドにはスレッド領域りょういきのNOPスレッドとちが前述ぜんじゅつしたながさの上限じょうげん存在そんざいしないため、「ながいNOPスレッド+シェルコード」のわせを大量たいりょうにヒープちゅうむことで攻撃こうげき成功せいこうりつげる[21]

ウェブブラウザではJavaScriptなどのクライアントサイドスクリプトにより任意にんいながさのヒープを作成さくせいできるので、ブラウザを対象たいしょうにしたドライブバイダウンロード攻撃こうげきではヒープスプレーが使つかわれることおお[21]

トランポリング

編集へんしゅう

攻撃こうげきしゃ入力にゅうりょくしたデータ(エクスプロイトなど)のアドレスは未知みちであるが、そのデータのアドレスがレジスタに格納かくのうされていることはかっているという場合ばあいには、トランポリン(trampolining)とばれる手法しゅほう利用りようされる。この手法しゅほうでは、攻撃こうげきしゃ入力にゅうりょくしたデータにジャンプするオペコードのアドレスをリターンアドレスへ上書うわがきする。たとえばアドレスがレジスタRに格納かくのうされている場合ばあい、jump R(あるいはcall Rなど)というオペコードが格納かくのうされているアドレスにジャンプさせることでユーザの入力にゅうりょくしたデータを実行じっこうさせる。この手法しゅほう使用しようするオペコードはDLL実行じっこうファイルのなかのものを利用りようする。ただし、一般いっぱんてきにオペコードのアドレスにヌル文字もじふくまれていてはならず、また処理しょり使用しようするオペコードのアドレスはアプリケーションやオペレーティングシステムのバージョンによってことなる。Metasploitプロジェクトはこのような目的もくてきてきしたオペコードのデータベースのひとつであり、Windowsで使用しようできるオペコードが記載きさいされている[22]

ヒープベースのバッファオーバーフロー

編集へんしゅう

mallocなどでヒープ領域りょういき動的どうてきにメモリを確保かくほする関数かんすうたいするオーバーフロー攻撃こうげきである[6]基本きほんてき攻撃こうげき手法しゅほうとしては、関数かんすうがヒープに確保かくほしたメモリ領域りょういきが2つあるとき、そのうち一方いっぽう領域りょういきたいして確保かくほみのメモリサイズよりおおきなデータを入力にゅうりょくすることでオーバーフローをこし、もう一方いっぽうのメモリ領域りょういきえるというものである[23]。mallocは複雑ふくざつ方法ほうほうでメモリ確保かくほ場所ばしょ決定けっていしているものの、連続れんぞくして2mallocを実行じっこうした場合ばあい、その結果けっかとして確保かくほされる2つのメモリ領域りょういきは(仮想かそうアドレス空間くうかんじょうで)ちかくに配置はいちされている傾向けいこうがあるため、上述じょうじゅつのようなバッファオーバーフロー攻撃こうげき可能かのうになる。

mallocのメモリ管理かんり

編集へんしゅう

より高度こうどなヒープベースバッファオーバーフロー攻撃こうげき手法しゅほう説明せつめいするため準備じゅんびとして、mallocのメモリ管理かんり方法ほうほう説明せつめいする。なおメモリ管理かんり方法ほうほう詳細しょうさいはmallocの実装じっそう依存いぞんするため、実行じっこう環境かんきょうによってこまかなところは下記かき説明せつめいことなる部分ぶぶんがあるので注意ちゅういされたい。

mallocは使用しようなヒープ領域りょういき(の一部いちぶ)をメモリプールとして管理かんりしており、メモリプールは複数ふくすうのchunkとばれる単位たんいからなっている[24]。プログラムちゅうでmallocが実行じっこうされるたびに、管理かんりしているchunkのなかから適切てきせつなサイズのものをプログラムにかえ[24]適切てきせつなサイズのchunkがない場合ばあいは、システムコールによりあらたなchunkを確保かくほしてプログラムにかえ[24]。mallocはchunkを(サイズごとことなる複数ふくすう[25]連結れんけつリストとして管理かんりしており[24]、chunkをプログラムにわたさいにこの連結れんけつリストからchunkを削除さくじょし、プログラムがメモリ領域りょういきをfreeすると、freeされたchunkが連結れんけつリストにくわわる[24]

chunkは連結れんけつリストとして管理かんりされているので、かくchunkには「つぎのchunk」を指定していするポインタ(Windowsでは「flink」[26]、linuxでは「fd」[24])や「まえのchunk」を指定していするポインタ(Windowsでは「blink」[26]、linuxでは「bk」[24])がある。

使用しようchunkと隣接りんせつするメモリ領域りょういき解放かいほうされた場合ばあいは、解放かいほうされたメモリ領域りょういき使用しようchunkとを連結れんけつ (coalesce) することで1つのおおきなchunkをつくって管理かんりする[26]

mallocのメタデータの

編集へんしゅう

より高度こうどなヒープベースバッファオーバーフロー攻撃こうげきとして、mallocがメモリ管理かんり使つかうメタデータをえる手法しゅほうがある。たとえばWindows XP SP1またはそれ以前いぜんのWindowsでは、mallocしたメモリ領域りょういきをオーバーフローさせることで、そのメモリ領域りょういきの(仮想かそうアドレス空間くうかんで)となりにある使用しようchunkのflinkやblinkを任意にんいのアドレスにえるという攻撃こうげき手法しゅほう可能かのうであった[27]。flinkやblinkはcoalesceのタイミングでmallocにより参照さんしょうされるので攻撃こうげき成功せいこうする[27]

バッファオーバーフローの結果けっか

編集へんしゅう

write-what-where状態じょうたい

編集へんしゅう

バッファオーバーフロー攻撃こうげき結果けっかとして、write-what-where状態じょうたい("write-what-where condition"[28]、CWE-123[28]任意にんい場所ばしょ任意にんいむことができる状態じょうたい[29])になる危険きけんがある[28]

write-what-where状態じょうたいになると、セキュリティポリシーのスコープがいにメモリのデータをむことができる[28]。セキュリティポリシーのスコープがいにコードをくことで、攻撃こうげきしゃはほぼ確実かくじつ任意にんいのコードを実行じっこうできるようになる[28]管理かんりしゃ権限けんげん制御せいぎょしているフラグとうえられる場合ばあいも、攻撃こうげきしゃ任意にんいのコードが実行じっこう可能かのうになる[28]

プログラムのフリーズ・クラッシュ

編集へんしゅう

攻撃こうげきしゃ意図いとてきにバッファオーバーフローをこすによりプログラムをクラッシュさせたり[4][5][6]処理しょりえて無限むげんループにむことでプログラムをフリーズさせてたり[4][5][6]することでプログラムの可用性かようせい侵害しんがいできる。

関数かんすうポインタの

編集へんしゅう

古典こてんてきバッファオーバーフロー[30]やヒープオーバーフロー[6]などの結果けっかとして、関数かんすうポインタのえが可能かのうになるケースがある。攻撃こうげきしゃnmコマンドをもちいることでプログラムちゅうもちいられている様々さまざま関数かんすうのアドレスをことができるので[30]、nmの結果けっか参照さんしょうして攻撃こうげき利用りよう可能かのう関数かんすう関数かんすうポインタのえられる。

技術ぎじゅつてき対策たいさく

編集へんしゅう

コンパイラやライブラリによる対策たいさく

編集へんしゅう

バッファオーバーフローを検出けんしゅつするコードをコンパイル実行じっこうコードに挿入そうにゅうする手法しゅほうがある。典型てんけいてき手法しゅほうとしては、ローカル変数へんすうとSFPのあいだに、カナリア(canary)[31][32]もしくはクッキー[33]ばれる領域りょういき挿入そうにゅうする方法ほうほうである。プログラムは実行じっこうちゅうカナリアを監視かんしつづけ、バッファオーバーフローによりカナリアがわったらプログラムを停止ていしする。

安全あんぜんなライブラリへの

編集へんしゅう

標準ひょうじゅんCライブラリとうにはバッファオーバーフロー検知けんち機能きのうほどこされていない関数かんすう収録しゅうろくされているので、これを検知けんち機能きのうった関数かんすうえたライブラリを標準ひょうじゅんCライブラリのわりに使つかこと攻撃こうげき検知けんちできる。たとえばLibsafe[36]標準ひょうじゅんCライブラリのstrcpy(*dest,*src)をより安全あんぜん関数かんすうえており、入力にゅうりょくsrcのサイズがコピーさきのdestのサイズがおおきいかかを検知けんちできる[37]

実行じっこう環境かんきょうでの対策たいさく

編集へんしゅう

Write XOR eXecute

編集へんしゅう

典型てんけいてきなスタックベースのバッファオーバーフロー攻撃こうげきでは、本来ほんらいデータを格納かくのうすべき領域りょういきにシェルコードやNOP命令めいれいのような実行じっこうコードをき、これをプログラムに実行じっこうさせること攻撃こうげき成立せいりつする。そこでこのような攻撃こうげきふせぐため、データを格納かくのうすべき領域りょういきでは実行じっこう不可ふかにする、Write XOR eXecute[37]W X[37]もしくはW^Xりゃくす)という対策たいさく手法しゅほうられている[37]。W XのWindowsにおける実装じっそうDEPえい: data execution prevention、データ実行じっこう防止ぼうし)とばれる[37][38]。またDEPではSEH例外れいがいハンドラへのポインタが上書うわがきされないように明示めいじてき保護ほごおこな[39]一部いちぶのUNIX(OpenBSDmacOSなど)はW Xなどの実行じっこう保護ほご有効ゆうこうになった状態じょうたい出荷しゅっかされている。それ以外いがいのオプショナルなパッケージとしては以下いかのものがげられる。

また、プロプライエタリなアドオンとしては以下いかのものがある。

なお、2018ねん現在げんざいひろ使つかわれているx64アーキテクチャのプロセッサでは、W Xを実現じつげんするためにデータ領域りょういきであること識別しきべつするNXビットという仕組しくみがハードウェアレベルでサポートされている[45](インテルではNXビットのことをXDビットとんでいるが同一どういつのものである[45])。

バッファオーバーフロー攻撃こうげきふくめたメモリ破壊はかい攻撃こうげき全般ぜんぱん緩和かんわする技術ぎじゅつとしてASLR(Address Space Layout Randomization、アドレス空間くうかん配置はいちのランダム)がある。これは仮想かそうメモリ空間くうかんにおけるスタック領域りょういきやコード領域りょういき位置いちまれるDLLの位置いちとうを(プログラム起動きどうもしくはOS自身じしん起動きどうに)ランダムにえる技術ぎじゅつで、これにより攻撃こうげきしゃ攻撃こうげき有効ゆうこう実行じっこうコードの特定とくてい箇所かしょ指定していしてメモリかいざんをおこなうのを困難こんなんにする。

ASLRはバッファオーバーフロー攻撃こうげき発展形はってんけいであるReturn-to-libc攻撃こうげき後述こうじゅつ)を緩和かんわできるが、さらにその発展形はってんけいであるReturn-oriented programmingには対抗たいこうできない。

カーネル空間くうかんのASLRをKASLR(kernel address space layout randomization)といい、linuxカーネル(バージョン3.14以降いこう)[46]、iOS(バージョン6以降いこう)[47]などで実装じっそうされている。またKASLRをバイパスしようとする攻撃こうげき対抗たいこうするため機構きこうとしてKernel page-table isolationがある。

gccとg++でコンパイルとスタック領域りょういきとヒープ領域りょういきたいしてはASLRをもちいるが、コード領域りょういきにASLRをもちいるにはオプション「-pie」を使つかわねばならない[48]。また共有きょうゆうライブラリにASLRをもちいるにはオプション「-fPIC」を指定していする[48]

開発かいはつ対策たいさく

編集へんしゅう

プログラミング言語げんご・プログラミング環境かんきょう選択せんたく

編集へんしゅう

C言語げんごやC++以外いがい言語げんごではバッファオーバーフローが発生はっせいしないよう対策たいさくられているものもおおく、コンパイルにバッファオーバーフローのチェックをおこなったり、実行じっこうにバッファオーバーフローにたいする警告けいこく例外れいがいげたりするものもある(AdaEiffelLISPModula-2SmalltalkOCaml、およびC言語げんごから派生はせいしたCycloneD言語げんごなど)。

Javaプラットフォーム.NET Frameworkではすべての配列はいれつたいして境界きょうかいチェックが必須ひっすとされる。ほぼすべてのインタプリタ言語げんごではバッファオーバーフローへの対策たいさくおこなわれており、エラー発生はっせいにはその状態じょうたい明確めいかくつたえられる。境界きょうかいチェックをおこなうのに十分じゅうぶんかた情報じょうほう保持ほじしているようなプログラミング言語げんごでは、境界きょうかいチェックの有効ゆうこう無効むこうえるためのオプションが提供ていきょうされていることもある[注釈ちゅうしゃく 6]

ソースコード記述きじゅつ対策たいさく

編集へんしゅう

バッファオーバーフロー攻撃こうげきおもにC言語げんごやC++を対象たいしょうとしたものなので、以下いかではプログラミング言語げんごとしてC言語げんごかC++をえらんだ場合ばあいたいしての対策たいさくべる。

人手ひとでによる対策たいさく

編集へんしゅう

バッファオーバーフロー攻撃こうげきふせぐには、領域りょういきちょうとデータちょう意識いしきしたプログラミングをおこなこと重要じゅうようである[51]

  • データをバッファに挿入そうにゅうするさいには、データちょうがバッファちょうえないこと調しらべる検査けんさロジックをプログラムにくわえておく[51]
  • データが文字もじれつ場合ばあい文字もじれつちょうかぞ間違まちがえないよう、文字もじれつ終端しゅうたんにあるナル文字もじかぞえる[51]
  • データちょう依存いぞんしたループをくときに間違まちがってループをまわしすぎる(Off-by-oneエラーこといようにする[51]
  • 事前じぜんにデータちょう上限じょうげんがわからない場合ばあいは、バッファをmallocとう動的どうてき確保かくほし、不要ふようになったら確実かくじつにfreeする[51]

安全あんぜんなライブラリの使用しよう

編集へんしゅう

標準ひょうじゅんCライブラリ使つかわりに、バッファあふれを未然みぜんふせいだりエラーとして検出けんしゅつしてくれたりするセキュアなライブラリを使つかこと重要じゅうようである。このようなライブラリとして以下いかのようなものがある。

  • Managed String(Linux環境かんきょう[51]
  • ISO/IEC 9899:2011 Annex K(Windows環境かんきょう[51]
  • SafeStr(Linux環境かんきょう、Windows環境かんきょう[51]
  • "The Better String Library"[52]
  • Vstr[53]
  • Erwin[54]

またBSD libcなど、Cライブラリの実装じっそうによってはstrlcpystrlcatといった、より安全あんぜん配慮はいりょした文字もじれつよう関数かんすう用意よういされている。

静的せいてきコード解析かいせきにおける対策たいさく

編集へんしゅう

人手ひとでによる静的せいてきコード解析かいせき

編集へんしゅう

静的せいてきコード解析かいせきさい前述ぜんじゅつした領域りょういきちょうとデータちょう意識いしきしたプログラミングがおこなわれているかさい確認かくにんし、strcpy, sprintf とうのデータ領域りょういきちょう意識いしきしないライブラリ関数かんすう使用しようされていないか、使用しようされているならその入力にゅうりょくちょう計算けいさん間違まちがっていないかを確認かくにんする[55]。またヒープオーバーフロー対策たいさくとしてmalloc/freeやnew/deleteの多用たよう注意ちゅういし、関数かんすうポインタのえをふせぐために関数かんすうポインタが多用たよう注意ちゅうい[55]攻撃こうげきパターンを見逃みのがことがないようデータの一部いちぶてている関数かんすう注意ちゅういする[55]

自動じどうされた静的せいてきコード解析かいせき

編集へんしゅう

strcpyとうのバッファオーバーフローがこりやすい関数かんすう使用しようたいして警告けいこくしてくれる関数かんすうめい照合しょうごうがた検査けんさツール[55]や、各種かくしゅソースコード検査けんさツール[55]使用しようしてバッファオーバーフロー対策たいさくおこなう。開発かいはつ環境かんきょうなかにはソースコード検査けんさツールをオプションとしてそなえているものもあるので、それを利用りようすることもできる[55]

またソースコードがはいらない製品せいひんとう利用りようする場合ばあいは、ファジングツールでブラックボックス解析かいせきする。

発展はってんてき攻撃こうげき

編集へんしゅう

Return-to-libc攻撃こうげき

編集へんしゅう

すでべたように、典型てんけいてきなスタックベースのオーバーフロー攻撃こうげきでは、本来ほんらいデータを格納かくのうすべき箇所かしょにシェルコードやNOP命令めいれいのようなコードをき、リターンアドレスをえてこれらのコードにジャンプして、これらのコードを実行じっこうする必要ひつようがあった。しかしW Xが実装じっそうされた実行じっこう環境かんきょうではデータを格納かくのうすべき箇所かしょにおけるコード実行じっこう許可きょかとしているので、こうしたオーバーフロー攻撃こうげき仕掛しかけることはできない。

そこでW Xを回避かいひするため考案こうあんされたのがReturn-to-libc攻撃こうげきである。この攻撃こうげきでは、リターンアドレスのジャンプさきをデータ格納かくのう箇所かしょえるのではなく、標準ひょうじゅんCライブラリ(libc)のような共有きょうゆうライブラリ・DLLにジャンプするようえる。こうしたライブラリはデータ格納かくのう箇所かしょ以外いがいかれているので(W Xが実装じっそうされた環境かんきょうにおいても)実行じっこう許可きょかがある。そこで攻撃こうげきしゃはライブラリない関数かんすう悪用あくようして、攻撃こうげき仕掛しかけることができる。

実行じっこう環境かんきょうがASLRを実装じっそうしていれば、libcとうのライブラリの仮想かそうアドレスはランダムにわるので、攻撃こうげきしゃがジャンプさきをライブラリにちるようリターンアドレスをえるのは困難こんなんになる。

Return-to-Register攻撃こうげき

編集へんしゅう

Return-to-Register攻撃こうげきとは「ret命令めいれい実行じっこうにレジスタがしているアドレスに不正ふせい命令めいれいコードを挿入そうにゅうし、そのうえで”そのレジスタ実行じっこううつ命令めいれいぐん格納かくのうされているアドレス”でリターンアドレスをえる攻撃こうげき[56]のことである。

たとえばレジスタAがバッファの先頭せんとうへのポインタを格納かくのうしているとすると、そのときレジスタAをオペランドにとる任意にんいのjumpまたはcall命令めいれい実行じっこうフローの支配しはいけんるのに使用しようできる[57]

ret2esp攻撃こうげき

編集へんしゅう

ret2esp(Return to esp)攻撃こうげきは、2017ねん現在げんざいのASLRの実装じっそうのデフォルトではコード領域りょういき(.textセクション)をランダマイズしないこと利用りようしてASLRを回避かいひする攻撃こうげき手法しゅほうである[58]。ここでespはx86におけるスタックポインタである。この攻撃こうげきは.textセクションないに「jmp esp」のような命令めいれいがある場合ばあい成立せいりつする[58]攻撃こうげきしゃはバッファオーバーフローを利用りようしてespの(仮想かそうアドレス空間くうかんじょうの)したにシェルコードを配置はいちしたうえで、リターンアドレスを「jmp esp」の箇所かしょえる。するとまずリターンアドレスのえにより「jmp esp」のところにジャンプし、つぎに「jmp esp」が実行じっこうされてespの箇所かしょにジャンプするので、そのした配置はいちしたシェルコードが実行じっこうされることになる[58]

バッファオーバーフローがある程度ていどおおやけ文書ぶんしょされたのは1972ねんはじめで[独自どくじ研究けんきゅう?]Anderson 1972以下いかのように説明せつめいされている。

Anderson 1972, p. 61: The code performing this function does not check the source and destination addresses properly, permitting portions of the monitor to be overlaid by the user. This can be used to inject code into the monitor that will permit the user to seize control of the machine.

この処理しょり実行じっこうするコードはもとさきのアドレスにたいするチェックを適切てきせつおこなっておらず、モニターの一部いちぶたいしユーザによる上書うわがきをゆるすことになっている。これはモニターにコードを挿入そうにゅうするのに利用りようされる可能かのうせいがあり、結果けっかとしてユーザがマシンの制御せいぎょ掌握しょうあくする可能かのうせいがある。

モニターとは、現在げんざいカーネルとばれているのとおなじものである。

バッファオーバーフローを利用りようした悪意あくいのあるエクスプロイトで最初さいしょ文書ぶんしょされたのは、1988ねんかれたMorris wormがインターネットじょう増殖ぞうしょくするのに利用りようしていたエクスプロイトのうちのひとつである。攻撃こうげき対象たいしょうのプログラムはUNIXサービスであるfingerであった[59]。 1995ねん、Thomas Lopaticはそれとは独立どくりつにバッファオーバーフローを発見はっけんし、セキュリティにかんするメーリングリストBugtraq投稿とうこうした[60]。 1996ねんエリアス・レヴィ(ハンドルネームAleph one)はオンラインマガジンPhrack記事きじ"Smashing the Stack for Fun and Profit"を発表はっぴょうした[61]。 これはスタックベースのバッファオーバーフローを使用しようしたエクスプロイトを手順てじゅんって説明せつめいしていく内容ないようである。

これ以降いこうすくなくとも2つの有名ゆうめいなインターネットワームがバッファオーバーフローを利用りようしたエクスプロイトでおおくのシステムに被害ひがいあたえている。2001ねんにはCode RedがマイクロソフトのInternet Information Services (IIS) 5.0のバッファオーバーフローを利用りようしている[62]。 また2003ねんにはSQL SlammerMicrosoft SQL Server 2000動作どうさするマシンに被害ひがいあたえている[63]

2003ねんには、市販しはんXboxのゲームにふくまれるバッファオーバーフローが利用りようされ、無認可むにんかのソフトウェア(たとえばHomebrewのゲームなど)をModチップなどのハードウェアの改造かいぞうなしに動作どうささせるのに利用りようされた[64]PlayStation 2ではおな目的もくてきのためにPS2 Independence Exploit使用しようされる。またWiiではHomebrewが利用りようされるが、これはゼルダの伝説でんせつ トワイライトプリンセス存在そんざいするバッファオーバーフローを利用りようしている。

参考さんこう文献ぶんけん

編集へんしゅう

関連かんれん項目こうもく

編集へんしゅう

脚注きゃくちゅう

編集へんしゅう

注釈ちゅうしゃく

編集へんしゅう
  1. ^ i386の場合ばあい、Windowsであれば仮想かそう空間くうかん上位じょうい2 GB、Linuxであれば仮想かそう空間くうかん上位じょうい1 GBがカーネル空間くうかんになる。なお本節ほんぶしいたメモリ箇所かしょはいずれも後述こうじゅつするセキュリティ技術ぎじゅつアドレス空間くうかん配置はいちのランダム (ASLR) をもちいていない場合ばあいはなしである。
  2. ^ Block Started by Symbolというアセンブラ疑似ぎじ命令めいれい由来ゆらいする。
  3. ^ なお、データ領域りょういきとbss領域りょういきわせて静的せいてき領域りょういきという。
  4. ^ x86ではebpレジスタ (Stack Base Pointer Register)。
  5. ^ 命令めいれいポインタとも。x86ではeipレジスタ (Extended Instruction Pointer)。
  6. ^ たとえばDelphiでは$RangeChecksディレクティブで境界きょうかいチェックの有効ゆうこう無効むこうえられる[49][50]

出典しゅってん

編集へんしゅう
  1. ^ a b 八木はちぼく, 村山むらやま & 秋山あきやま 2015, p. 59.
  2. ^ だい10しょう 著名ちょめい脆弱ぜいじゃくせい対策たいさくバッファオーバーフロー: #1 概要がいよう”. セキュアプログラミング講座こうざ C/C++言語げんごへん きゅう2007ねん公開こうかいばん. 情報処理じょうほうしょり推進すいしん機構きこう. 2018ねん12月14にち閲覧えつらん
  3. ^ [迷信めいしん] scanf ではバッファオーバーランをふせげない”. C/C++迷信めいしんしゅう. 株式会社かぶしきがいしゃきじねこ. 2020ねん1がつ12にち時点じてんオリジナルよりアーカイブ。2010ねん2がつ28にち閲覧えつらん。 “書式しょしき指定してい不適切ふてきせつなために発生はっせいする脆弱ぜいじゃくせいであって、scanf の問題もんだいではありません。”
  4. ^ a b c d e f g h i j k l m n CWE-120: Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')”. Mitre. 2018ねん12月18にち閲覧えつらん
  5. ^ a b c d e f g h i CWE-121: Stack-based Buffer Overflow”. Mitre. 2018ねん12月18にち閲覧えつらん
  6. ^ a b c d e f g h i j CWE-122: Heap-based Buffer Overflow”. Mitre. 2018ねん12月18にち閲覧えつらん
  7. ^ a b CWE-119: Improper Restriction of Operations within the Bounds of a Memory Buffer”. Mitre. 2018ねん12月18にち閲覧えつらん
  8. ^ CWE-787: Out-of-bounds Write”. Mitre. 2018ねん12月18にち閲覧えつらん
  9. ^ CWE-193: Off-by-one Error”. Mitre. 2018ねん12月18にち閲覧えつらん
  10. ^ CWE-131: Incorrect Calculation of Buffer Size”. Mitre. 2018ねん12月18にち閲覧えつらん
  11. ^ CWE-680: Integer Overflow to Buffer Overflow”. Mitre. 2018ねん12月18にち閲覧えつらん
  12. ^ The Exploitant - Security info and tutorials”. 2009ねん11月29にち閲覧えつらん
  13. ^ a b Erickson 2011, pp. 87–88.
  14. ^ a b c d Erickson 2011, p. 84.
  15. ^ a b c d 八木はちぼく, 村山むらやま & 秋山あきやま 2015, pp. 60–61.
  16. ^ a b c d e f g Erickson 2011, pp. 161–164.
  17. ^ 八木はちぼく, 村山むらやま & 秋山あきやま 2015, p. 64.
  18. ^ Akritidis, P.; Markatos, Evangelos P.; Polychronakis, M.; Anagnostakis, Kostas D. (2005). "STRIDE: Polymorphic Sled Detection through Instruction Sequence Analysis." (PDF). Proceedings of the 20th IFIP International Information Security Conference (IFIP/SEC 2005). IFIP International Information Security Conference.
  19. ^ Erickson 2011, pp. 164–168.
  20. ^ Erickson 2011, pp. 168–173.
  21. ^ a b c 八木はちぼく, 村山むらやま & 秋山あきやま 2015, pp. 65–67.
  22. ^ The Metasploit Opcode Database”. 2007ねん5がつ12にち時点じてんオリジナルよりアーカイブ。2007ねん5がつ15にち閲覧えつらん
  23. ^ Erickson 2011, pp. 173–179.
  24. ^ a b c d e f g すみうま 文彦ふみひこ技術ぎじゅつ本部ほんぶ クラウド基盤きばんエキスパート) (2007ねん11月30にち). “malloc(3)のメモリ管理かんり構造こうぞう”. VA Linux Systems Japan. 2018ねん12月26にち閲覧えつらん
  25. ^ Doug Lea. “A Memory Allocator”. 2018ねん12月26にち閲覧えつらん
  26. ^ a b c FFRI 2013, p. 7.
  27. ^ a b FFRI 2013, p. 8.
  28. ^ a b c d e f CWE-123: Write-what-where Condition”. Mitre. 2018ねん12月26にち閲覧えつらん
  29. ^ JVNDB-2015-004721 Silicon Integrated Systems WindowsXP Display Manager における権限けんげん取得しゅとくされる脆弱ぜいじゃくせい”. JVN iPedia. 2018ねん12月26にち閲覧えつらん
  30. ^ a b Erickson 2011, pp. 179–192.
  31. ^ しば国雄くにお (2006ねん9がつ5にち). “だい14かい: バッファオーバーフローとサーバがわのセキュリティ対策たいさくかんがえる”. ThinkIT. オープンソースの適用てきよう可能かのうせいしめ. p. 2. 2019ねん1がつ1にち閲覧えつらん
  32. ^ David Wheeler (2004ねん1がつ27にち). “セキュアなプログラマー バッファー・オーバーフローに対抗たいこうする 今日きょう最大さいだい脆弱ぜいじゃくせい防止ぼうしする”. IBM. 2019ねん1がつ1にち閲覧えつらん
  33. ^ a b c 八木はちぼく, 村山むらやま & 秋山あきやま 2015, pp. 69–70.
  34. ^ StackGuard: Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks by Cowan et al.” (PDF). 2012ねん2がつ9にち閲覧えつらん
  35. ^ /GS (バッファーのセキュリティ チェック)” (2016ねん11月4にち). 2012ねん2がつ9にち閲覧えつらん
  36. ^ Libsafe - Free Software Directory”. 2012ねん2がつ9にち閲覧えつらん
  37. ^ a b c d e 八木はちぼく, 村山むらやま & 秋山あきやま 2015, pp. 71–73.
  38. ^ Windows XP Service Pack 2、Windows XP Tablet PC Edition 2005、および Windows Server 2003 のデータ実行じっこう防止ぼうし (DEP) 機能きのう詳細しょうさい”. 2012ねん2がつ17にち閲覧えつらん
  39. ^ Bypassing Windows Hardware-enforced Data Execution Prevention”. 2007ねん5がつ20日はつか閲覧えつらん
  40. ^ PaX: Homepage of the PaX team”. 2012ねん2がつ17にち閲覧えつらん
  41. ^ KernelTrap.Org”. 2012ねん5がつ29にち時点じてんオリジナルよりアーカイブ。2012ねん2がつ17にち閲覧えつらん
  42. ^ Openwall Linux kernel patch 2.4.34-ow1”. 2012ねん2がつ17にち閲覧えつらん
  43. ^ BufferShield: Prevention of Buffer Overflow Exploitation for Windows”. 2012ねん2がつ17にち閲覧えつらん
  44. ^ NGSec Stack Defender”. 2007ねん5がつ13にち時点じてんオリジナルよりアーカイブ。2012ねん2がつ17にち閲覧えつらん
  45. ^ a b NXビット”. IT用語ようご辞典じてんe-Words. 2019ねん1がつ1にち閲覧えつらん
  46. ^ Linux kernel 3.14, Section 1.7. Kernel address space randomization”. kernelnewbies.org (2014ねん3がつ30にち). 2014ねん4がつ2にち閲覧えつらん
  47. ^ Stefan Esser. “iOS 6 Exploitation 280 Days Later”. 2019ねん1がつ1にち閲覧えつらん
  48. ^ a b Hardening”. Devian. 2019ねん1がつ1にち閲覧えつらん
  49. ^ Neil Moffatt. “Delphi Basics : $RangeChecks command”. 2012ねん2がつ3にち閲覧えつらん
  50. ^ 範囲はんいチェック - RAD Studio
  51. ^ a b c d e f g h だい10しょう 著名ちょめい脆弱ぜいじゃくせい対策たいさく バッファオーバーフロー: #2 ソースコード記述きじゅつ対策たいさく”. セキュアプログラミング講座こうざ(2007ねん公開こうかいばん). 情報処理じょうほうしょり推進すいしん機構きこう. 2018ねん12月27にち閲覧えつらん
  52. ^ The Better String Library”. 2012ねん2がつ8にち閲覧えつらん
  53. ^ The Vstr Homepage”. 2012ねん2がつ8にち閲覧えつらん
  54. ^ The Erwin Homepage”. 2012ねん2がつ8にち閲覧えつらん
  55. ^ a b c d e f だい10しょう 著名ちょめい脆弱ぜいじゃくせい対策たいさく バッファオーバーフロー: #3 ソースコードの静的せいてき検査けんさ”. セキュアプログラミング講座こうざ(2007ねん公開こうかいばん). 情報処理じょうほうしょり推進すいしん機構きこう. 2018ねん12月27にち閲覧えつらん
  56. ^ メモリ破損はそん脆弱ぜいじゃくせいたいする攻撃こうげき調査ちょうさ分類ぶんるい 2014, p. 769.
  57. ^ Shah, Saumil (2006). 1 - Saumil Shah - Writing Metasploit Plugins.pdf "Writing Metasploit Plugins: from vulnerability to exploit" (PDF). Hack In The Box. Kuala Lumpur. {{cite conference}}: |url=不正ふせいです。 (説明せつめい)
  58. ^ a b c CTFでまな脆弱ぜいじゃくせい(スタックバッファオーバーフローへん・その1)”. NTTデータ先端せんたん技術ぎじゅつ株式会社かぶしきがいしゃ. 2019ねん1がつ1にち閲覧えつらん
  59. ^ "A Tour of The Worm" by Donn Seeley, University of Utah”. 2007ねん5がつ20日はつか時点じてんオリジナルよりアーカイブ。2007ねん6がつ3にち閲覧えつらん
  60. ^ Bugtraq security mailing list archive”. 2007ねん9がつ1にち時点じてんオリジナルよりアーカイブ。2007ねん6がつ3にち閲覧えつらん
  61. ^ Smashing the Stack for Fun and Profit”. 2007ねん6がつ3にち閲覧えつらん
  62. ^ eEye Digital Security”. 2007ねん6がつ3にち閲覧えつらん
  63. ^ Microsoft Technet Security Bulletin MS02-039”. 2007ねん6がつ3にち閲覧えつらん
  64. ^ Hacker breaks Xbox protection without mod-chip”. 2007ねん9がつ27にち時点じてんオリジナルよりアーカイブ。2007ねん6がつ3にち閲覧えつらん