■バッファ・オーバーフロー攻撃/バッファ・オーバーラン攻撃
システムがあらかじめ想定しているサイズ以上の大量のデータをバッファに送り込むことで、バッファをあふれさせる(バッファ・オーバーフロー)ことにより、システムを破壊したり、特別なプログラムを実行させたりする攻撃のこと。
例えば1行ずつデータを読み込んで何らかの処理をして、それを出力するような処理プログラムがあるとする。このようなプログラムでは、データを1行ずつ読み込んで溜めておくために行バッファと呼ばれるバッファを用意している。行バッファのサイズは、一般的なテキスト・データから想定して、ここでは1000文字分程度用意しておくと仮定する。しかしこのようなプログラムに対して、常識では考えられないような1万文字といった長いテキスト・データを与えると、内部のバッファ・サイズを超えてしまうことになる。
通常、こうした想定外の長いテキスト・データに対しては、事前にチェックし、エラー処理を行うのが一般的だ。しかし、バッファ・オーバーフローのことを考慮していないプログラムでは、渡されたデータをそのまますべてバッファに書き込もうとする(こうした事前にチェックを実行しないバッファのことを「未チェック・バッファ」と呼ぶ)。未チェック・バッファでは、行バッファ・サイズを超えてもデータが書き込まれてしまうことになる。すると、行バッファの直後にあるデータ領域が上書き(破壊)され、プログラムが意図しない動作を引き起こしたり、最悪の場合は暴走してしまったりすることになる。
またバッファがスタック・メモリ上に確保されている場合、バッファの何バイトか後ろに置かれたサブルーチンからの戻りアドレスを書き換えるように狙い、戻りアドレス部分のデータを書き換えてしまうことも可能だ。これにより戻りアドレスが自由に制御できるようになるため、その戻り先にプログラム・コードを置くことで、任意のコードが実行できるようになる。バッファ・オーバーフロー(バッファ・オーバーラン)攻撃では、このようにして外部から特定のパターンのデータをバッファに送り込むことによって、そのプログラムの制御を奪うことができるため、もしそのプログラムがOSの特権モードで動作しているような重要なプログラムならば、システム全体の制御を奪われてしまうことにもなる。最悪、システムの破壊が可能となるため、「未チェック・バッファによる脆弱性」が報告された場合は、早急な修正プログラムの適用が求められる。 |