ホームC言語用語集 ≫ バッファオーバーフロー (buffer over-flow)

C言語用語集 - バッファオーバーフロー (buffer over-flow)

バッファオーバーフロー (buffer over-flow) とは

 大量のデータをバッファにコピーすると,データがそのバッファのサイズを越えてあふれてしまうことがあります.これがバッファオーバーフロー (buffer over-flow) です.
 これを利用して,システムをダウンさせたり,不正なプログラムを実行させる攻撃をバッファオーバーフロー攻撃 (buffer overflow attack) といいます.ここでは,代表的なバッファオーバーフロー攻撃である Return-to-libc 攻撃 (以下バッファオーバーフロー攻撃) について解説します.

予備知識 (スタックフレーム)

バッファオーバーフロー攻撃の仕組みを理解するためにはスタックフレーム (stack frame) についての知識が必要になります.これにつきましては,スタックフレームをご覧下さい.

バッファオーバーフロー攻撃の基本的な仕組み

 例として以下のような関数 func を考えます.

void func(char *s1) {
    char s2[16];
    strcpy(s2,s1);
}

 func は char 型のポインタ変数 s1 を引数として受け取り,char 型の配列 s2 に s1 が指す文字列をコピーします.ここで,s1 の指す文字列のサイズが s2 のサイズを超えていた場合,3 行目の strcpy(s2,s1) でバッファオーバーフローが発生します.バッファオーバーフローが発生するとあふれたデータによってスタックが破壊 (書き換え) されてしまいます. (図 1)

バッファオーバーフロー

図1 バッファオーバーフロー

ここで最も問題となるのは,リターンアドレスが書き換わってしまうことです.悪意のある第三者が発生させたバッファオーバーフローによって,リターンアドレスを悪意のあるコードの先頭アドレスに書き換えられた場合,悪意のあるコードが実行されてしまいます.

バッファオーバーフロー攻撃

図2 バッファオーバーフロー攻撃

バッファオーバーフローの対策

 C言語や C++ は仕様上,バッファオーバーフローが起こりやすいため,コーディングの際には十分に気をつける必要があります.
具体的には,バッファオーバフローの発生の原因となりうる関数の使用はなるべく避け,入力される文字列の長さは常にチェックすることが大切です.

Cプログラマの必読書

たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

C実践プログラミング 第3版

C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.