buffer overflow


さて、配列を局所変数の場所に作ると、フレームの中にできあがると言いました。 では、もし、buffer[100000] とか、 buffer[-100] とかを読んだり書いたりするとどういう事が起るんでしょう?

実は、自分のフレーム上のデータや、他のフレーム上のデータが読み書きされます。 フレーム上には、局所変数情報以外に、返り値アドレス、退避レジスタ情報(PC なども)が含まれるから、 こういったデータが書き変わると訳の分からないことになります。 こういうのは、起こりがちな話で、配列などのアクセスの際にしっかりと境界チェックをしていないと、 知らず知らずのうちにこれらのデータを破壊してしまうことがあります。

これを悪用すると、そのプログラムが好きなコードを実行する可能性を作ることになります。 特に、管理者権限で動いているサーバプログラムで、好きなことが出来るとなると洒落にもなりません。 で、よくセキュリティホールとして騒がれるのです。

最近のトレンドとしては、Java のように安全を指向した言語が出来てきており、 ポインタの演算(pointer + 100 とか)を許さないとか、 配列へのアクセスは必ず boundary check を行うといった配慮がされています。


2002.10.14/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp