ICDロゴ

バッファ・オーバーフロー攻撃 (buffer overflow attack)

【バッファ・オーバーフロー・コウゲキ】

別名
バッファ・オーバーラン攻撃 (buffer overrun attack) 【バッファ・オーバーラン・コウゲキ】

最終更新日: 2005/03/23

 バッファ・オーバーフローを使用した、クラッキングの一手法。代表的なセキュリティホールの一つ。システムがあらかじめ想定しているサイズ以上の大量のデータをバッファに送り込んでバッファ・オーバーフローを起こさせることにより、システムを破壊したり、特別なプログラムを実行させたりする攻撃のこと。

 例えば1行ずつデータを読み込んで何らかの処理をし、それを出力するテキスト処理プログラムがあるとする。このようなプログラムでは、データを1行ずつ読み込んで溜めておくために行バッファと呼ばれるバッファを用意している。行バッファのサイズは、一般的なテキストデータから想定して、例えば1000文字分程度用意しておく。しかしこのようなプログラムに対して、常識では考えられないような長いテキストデータ(例:1行が1万文字もあるような行データ)を与えると、内部のバッファサイズを超えてしまうことになる。

 バッファ・オーバーフローのことを考慮していないプログラムでは、渡されたデータをそのまますべてバッファに書き込もうとするので、行バッファのサイズを超えてもデータが書き込まれてしまう。すると、行バッファの直後にあるデータ領域が上書き(破壊)され、プログラムが意図しない動作を起こしたり、最悪の場合は暴走してしまったりする。

 また、バッファがスタック・メモリ上に確保されている場合は(たいていのプログラミング言語では、関数やサブルーチン内でのみ有効な変数やデータは、スタック上に確保されるようになっている)、そのバッファの何バイトか後ろにサブルーチンからの戻りアドレスが置かれているが(たいていのCPUでは、関数やサブルーチンを呼び出す前に、まず戻りアドレスをスタック上に格納してから呼び出しを行う)、その部分のデータが書き換わるように狙って、わざと大きなデータを送り込み、バッファ・オーバーフローで戻りアドレス部分のデータを書き換えてしまうこともできる。これにより戻りアドレスを自由に制御できるので、その戻り先にプログラムコードを置いておけば(プログラム・コードはバッファ・データとともに送り込み、戻りアドレスがそのコードを指すように設定しておく)、任意のコードを実行させることができる。このようにして、外部から特定のパターンのデータをバッファに送り込むことによって、そのプログラムの制御を奪うことができるが、もしそのプログラムがOSの特権モードで動作しているような重要なプログラムならば(例えばメールの送受信を行うプログラムなど)、システム全体の制御を奪われてしまうことになる。

 バッファ・オーバーフロー攻撃を防ぐには、データをバッファに読み込むときに、バッファサイズを超えて書き込めないように対策すればよい(このほかにも、書き込まれたデータに不正なものが混ざっていないかどうかをきちんと調べるなどの対策も必要である)。例えば、C言語で一般的に使われるgets( )関数は使わず(この関数ではバッファの長さを指定することができない)、fgets( )を使うようにする(こちらはバッファのサイズを指定することができ、それを超えるような書き込みはできない)、などである。

Copyright (C) 2000-2007 Digital Advantage Corp.

アイティメディアの提供サービス

キャリアアップ