バッファオーバーフローとは、コンピュータのプログラムにおいて、バッファに割り当てられたメモリ領域を超えてデータを書き込むことで、データがバッファ境界からあふれ出てしまう現象である。
バッファオーバーフローの種類
バッファオーバーフロー攻撃は、主に以下の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を導入することで、ネットワークを介したバッファオーバーフロー攻撃を検知することができる。
まとめ
バッファオーバーフロー攻撃は、プログラムの脆弱性を悪用して行われる攻撃手法であるため、プログラムの開発段階から、セキュリティ対策を十分に行う必要がある。また、既存のプログラムについても、定期的に脆弱性診断などを行い、対策を実施する必要がある。