「バッファオーバーラン」の版間の差分

提供: セキュリティ
移動: 案内検索
(ページの作成:「バッファオーバーラン (buffer overrun)、バッファオーバーフロー(buffer overflow)とは、コンピュータのプログラムにおいて設計...」)
(相違点なし)

2014年2月16日 (日) 01:46時点における版

バッファオーバーラン (buffer overrun)、バッファオーバーフロー(buffer overflow)とは、コンピュータのプログラムにおいて設計者の意図しないメモリ領域の破壊が起きるバグやバグによって引き起こされた現象です。バッファオーバーランの問題を抱えたプログラムは、コンピュータセキュリティのセキュリティホールになりうるため、修正する必要があります。

読み方

バッファオーバーラン
ばっふぁおーばーらん
buffer overrun
ばっふぁおーばーらん
バッファオーバーフロー
ばっふぁおーばーふろー
buffer overflow
ばっふぁおーばーふろー

概要

バッファオーバーランは、入力データのサイズを考慮しないプログラムで、バッファ領域を超えたメモリが上書きされ、誤動作を引き起こします。 上書きする対称によって、以下のように呼ばれることもあります。

  • スタックバッファオーバーフロー
  • ヒープオーバーフロー

バッファオーバーランによって、引き起こされる現象の例を挙げます。

  • フラグの書き換え
  • リターンアドレスの書き換え

C言語における例

この例は、有名な事例です。gets()関数は、推奨されない関数です。 このコードは、実際に利用するべきではありません。

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

gets()関数は、標準入力から受け取ったデータを第一引数で指定されたバッファアドレスに対して、データを書き込みます。このとき、gets()関数は、バッファサイズを考慮しません。bufが256のサイズです。NULLターミネートを考慮するとgets()は、入力を255文字までしか受け取るべきではありません。しかしながら、gets()は、256文字を超える入力を受け取ってしまいます。256文字を超える入力は、bufのサイズを超えているため、bufを超えたスタック領域を上書きしていきます。bufを越えて上書きしていくとスタックに積まれているリターンアドレスを上書きされます。リターンアドレスを上書きされることによって、おそらく、このプログラムは、期待した動作をしなくなるでしょう。

この例では、対策として、gets()の代わりに、バッファサイズを指定できるfgets()を利用すべきです。

関連項目