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

提供: セキュリティ
移動: 案内検索
(関連項目)
 
行17: 行17:
 
* フラグの書き換え
 
* フラグの書き換え
 
* リターンアドレスの書き換え
 
* リターンアドレスの書き換え
 
 
== C言語における例 ==
 
== C言語における例 ==
 
この例は、有名な事例です。gets()関数は、推奨されない関数です。
 
この例は、有名な事例です。gets()関数は、推奨されない関数です。
行37: 行36:
 
== 関連項目 ==
 
== 関連項目 ==
 
* [[メモリ破壊]]
 
* [[メモリ破壊]]
 +
=== CPUのセキュリティ機能 ===
 +
* [[Intel MPX]]
 
=== セキュアプログラミング ===
 
=== セキュアプログラミング ===
 
{{secureprogramming}}
 
{{secureprogramming}}
行47: 行48:
 
=== デバッグ ===
 
=== デバッグ ===
 
{{debugger}}
 
{{debugger}}
<!-- vim: filetype=mediawiki -->
+
<!-- vim: filetype=mediawiki
 +
-->

2015年4月18日 (土) 23:57時点における最新版

バッファオーバーラン (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()を利用すべきです。

関連項目

CPUのセキュリティ機能

セキュアプログラミング

シェルコード

C言語基礎

C言語によるハッキング

デバッグ