バッファオーバーフローとは?種類や対策などをわかりやすく解説

バッファオーバーフローとは、コンピュータのプログラムにおいて、バッファに割り当てられたメモリ領域を超えてデータを書き込むことで、データがバッファ境界からあふれ出てしまう現象である。




バッファオーバーフローの種類

バッファオーバーフロー攻撃は、主に以下の2つの方法で実行される。

スタックオーバーフロー

スタックオーバーフローとは、プログラムのスタック領域に、想定よりも多くのデータが書き込まれてしまうことで、プログラムのスタックポインタがずれて、本来は別のデータが格納されている領域にデータが書き込まれてしまう攻撃手法である。

スタック領域は、プログラムの実行中に、関数呼び出しや関数戻りなどの際に、一時的にデータを格納する領域である。スタックポインタは、スタック領域の先頭を指すポインタである。

スタックオーバーフロー攻撃を行うには、攻撃者が、プログラムに入力するパラメータに、スタック領域のサイズを超える長いデータを入力する必要がある。

例えば、プログラムの関数呼び出しに、引数として、10バイト分のデータを想定しているとすると、攻撃者は、10バイトを超える長いデータを引数として入力することで、スタックオーバーフロー攻撃を実行することができる。

スタックオーバーフロー攻撃に成功すると、攻撃者は、スタック領域に書き込まれたデータを利用して、プログラムの制御を奪うことができる。

ヒープオーバーフロー

ヒープオーバーフローとは、プログラムのヒープ領域に、想定よりも多くのデータが書き込まれてしまうことで、プログラムのヒープポインタがずれて、本来は別のデータが格納されている領域にデータが書き込まれてしまう攻撃手法である。

ヒープ領域は、プログラムの実行中に、動的メモリ確保や動的メモリ解放などの際に、一時的にデータを格納する領域である。ヒープポインタは、ヒープ領域の先頭を指すポインタである。

ヒープオーバーフロー攻撃を行うには、攻撃者が、プログラムに入力するパラメータに、ヒープ領域のサイズを超える長いデータを入力する必要がある。

例えば、プログラムが、動的メモリ確保で10バイト分の領域を確保しているとすると、攻撃者は、10バイトを超える長いデータを入力することで、ヒープオーバーフロー攻撃を実行することができる。

ヒープオーバーフロー攻撃に成功すると、攻撃者は、ヒープ領域に書き込まれたデータを利用して、プログラムの制御を奪うことができる。

バッファオーバーフローによる被害

プログラムの異常終了

バッファオーバーフロー攻撃に成功すると、プログラムのスタックポインタやヒープポインタがずれてしまい、プログラムが異常終了する可能性がある。

プログラムが異常終了すると、システムの停止やデータの損失などの被害につながる可能性がある。

プログラムの制御奪取

バッファオーバーフロー攻撃に成功すると、攻撃者は、スタック領域やヒープ領域に書き込まれたデータを利用することで、プログラムの制御を奪うことができる。

プログラムの制御を奪うと、攻撃者は、任意のコードやデータの実行、システムの改ざん、情報の盗難などを行うことができる。

DoS攻撃の踏み台

バッファオーバーフロー攻撃に成功すると、攻撃者は、DoS攻撃の踏み台として使用することができる。

DoS攻撃とは、ネットワークの利用を妨害する攻撃手法である。攻撃者は、バッファオーバーフロー攻撃を利用して、大量のデータを送信することで、ネットワークの利用を妨害することができる。

バッファオーバーフローの事例

1988年のMorris worm

1988年に、Morris wormと呼ばれるワームがインターネット上で拡散した。このワームは、バッファオーバーフロー攻撃を利用して、感染したコンピュータを乗っ取った。Morris wormは、インターネットの利用に大きな影響を与え、世界中のコンピュータに被害をもたらした。

2000年のCode Red worm

2000年に、Code Red wormと呼ばれるワームがインターネット上で拡散した。このワームも、バッファオーバーフロー攻撃を利用して、感染したコンピュータを乗っ取った。Code Red wormは、Morris wormよりも多くのコンピュータに感染し、インターネットの利用にさらに大きな影響を与えた。

2016年のHeartbleed bug

2016年に、OpenSSLという暗号化ソフトウェアの脆弱性であるHeartbleed bugが発見された。この脆弱性は、バッファオーバーフロー攻撃によって悪用される可能性があるものであった。Heartbleed bugは、世界中の多くのウェブサイトに影響を与え、個人情報の漏洩などの被害につながった。

4. 2020年のLog4j vulnerability

2020年に、Log4jというログ出力ライブラリの脆弱性であるLog4j vulnerabilityが発見された。この脆弱性は、バッファオーバーフロー攻撃によって悪用される可能性があるものであった。Log4j vulnerabilityは、世界中の多くのウェブサイトやアプリケーションに影響を与え、情報の漏洩やシステムの停止などの被害につながった。

バッファオーバーフローの発生するプログラム言語

バッファオーバーフローは、プログラム言語の性質によって発生する可能性が異なる。メモリ管理をプログラマが直接行う言語ほど、バッファオーバーフローの発生リスクが高い。具体的には、以下の言語がバッファオーバーフローの発生しやすい言語として知られている。

  • C言語
  • C++言語 *アセンブラ言語

これらの言語は、メモリ管理をプログラマが行う必要がある。そのため、メモリ領域の確保や解放、バッファの長さのチェックなどを適切に行わないと、バッファオーバーフローが発生する可能性がある。

例えば、C言語の標準入出力関数であるgets()関数は、バッファの長さのチェックを行わない。そのため、gets()関数を使用して入力データを取得するプログラムでは、バッファオーバーフローの発生リスクが高くなる。

また、C言語やC++言語の標準ライブラリには、バッファオーバーフローが発生する可能性のある関数が含まれている。例えば、strcpy()関数やstrncpy()関数は、バッファの長さを超えてデータをコピーする可能性がある。

一方、メモリ管理を自動的に行う言語では、バッファオーバーフローの発生リスクは低い。具体的には、以下の言語がバッファオーバーフローの発生が少ない言語として知られている。

  • Java言語
  • Python言語
  • JavaScript言語

これらの言語は、メモリ管理を自動的に行うランタイムシステムが提供されている。そのため、プログラマがメモリ管理を誤って行う可能性が低く、バッファオーバーフローの発生リスクが低くなる。

ただし、メモリ管理を自動的に行う言語でも、バッファオーバーフローが完全に発生しないわけではない。例えば、Java言語のStringBufferクラスやStringBuilderクラスは、バッファの長さを超えてデータを追加することで、バッファオーバーフローを発生させることができる。

このように、バッファオーバーフローは、プログラム言語の性質によって発生する可能性が異なる。バッファオーバーフローの脆弱性を防ぐためには、プログラム言語の性質を理解し、適切な対策を講じることが重要である。

バッファオーバーフローの対策

バッファオーバーフロー攻撃の対策には、以下の方法がある。

入力データの長さをチェックする

入力データの長さをチェックすることで、想定よりも長いデータが入力されるのを防ぐことができる。

入力データの長さをチェックするには、以下の方法がある。

入力データの長さを固定する

入力データの長さを固定することで、想定よりも長いデータが入力されるのを防ぐことができる。

例えば、プログラムが、10バイト分のデータを想定しているとすると、入力データの長さを10バイトに固定することで、10バイトを超える長いデータが入力されるのを防ぐことができる。

入力データの長さを検証する

入力データの長さを検証することで、想定よりも長いデータが入力されるのを防ぐことができる。

例えば、プログラムが、10バイト分のデータを想定しているとすると、入力データの長さが10バイトを超える場合は、エラーメッセージを表示したり、入力を拒否したりすることで、10バイトを超える長いデータが入力されるのを防ぐことができる。

バッファ領域のサイズを適切に設定する

バッファ領域のサイズを適切に設定することで、想定よりも多くのデータが書き込まれることを防ぐことができる。

例えば、プログラムが、10バイト分のデータを想定しているとすると、バッファ領域のサイズを10バイト以上に設定することで、想定よりも多くのデータが書き込まれることを防ぐことができる。

セキュリティ対策ツールを導入する

セキュリティ対策ツールを導入することで、バッファオーバーフロー攻撃を検知・遮断することができる。

セキュリティ対策ツールには、以下のようなものがある。

  • WAF(Web Application Firewall)
  • IPS(Intrusion Prevention System)
  • IDS(Intrusion Detection System)

WAFは、ウェブアプリケーションを対象としたセキュリティ対策ツールである。WAFを導入することで、バッファオーバーフロー攻撃をはじめとする、ウェブアプリケーションに対するさまざまな攻撃を検知・遮断することができる。

IPSは、ネットワークを対象としたセキュリティ対策ツールである。IPSを導入することで、ネットワークを介したバッファオーバーフロー攻撃を検知・遮断することができる。

IDSは、ネットワークを対象としたセキュリティ対策ツールである。IDSを導入することで、ネットワークを介したバッファオーバーフロー攻撃を検知することができる。

まとめ

バッファオーバーフロー攻撃は、プログラムの脆弱性を悪用して行われる攻撃手法であるため、プログラムの開発段階から、セキュリティ対策を十分に行う必要がある。また、既存のプログラムについても、定期的に脆弱性診断などを行い、対策を実施する必要がある。

タイトルとURLをコピーしました