バッファオーバーフローとは?
セキュリティのニュースなどでよく、「バッファオーバーフロー」とか「バッファオーバーラン」って聞いたことないですか?
この2つは同じ意味なんですが、簡単に言うと、バッファと呼ばれるものがあふれてしまう(オーバフローする)ことで、予期しない動作が起こってしまうということです。
まず、バッファの説明からします。
わかりやすくプリンタを例にして説明すると、コンピュータから印刷の命令を送ると、データがプリンタに届きます。
その際、データがプリンタに届く速度は、プリンタ側がそのデータを全て印刷し終わるより全然早いです。
そこでプリンタは自分がゆっくりと印刷できるように、一旦そのデータを記憶しておくためのスペースを確保しておきます。
このデータを保存しておく「一時的な記憶領域」がバッファです。
次にバッファオーバーフローの説明です。
コンピュータAのあるプログラムが利用できる全体のバッファが100だとします。
そのプログラムが、コンピュータBとの通信の際に確保したバッファの量が10だとします。
この際、コンピュータBが100のデータを送ってきたとします。
でもプログラムのバッファは10しかないので、一度に100を受け取らず、10ずつ受け取るというのが正しい動作です。
でも、そのプログラムにバグがあった場合、100のデータを全て受け取ってしまって、残りの90のデータも、別領域のバッファに書き込んでしまう現象が発生してしまうんです。
この際、そのはみ出した部分のデータによりますが、プログラムがちゃんと動かなくなったり、コンピュータが停止してしまったりする場合があります。
また、悪質な他のプログラムが実行されたりして、最悪の場合コンピュータがのっとられてしまうといった問題が発生してしまいます。
なぜこういうことが起きるかというと、そのプログラムを作るときに「バッファを越えた部分は書き込まない」というルールが徹底されていないからです。
これはプログラム作成時のミスですね。
でも、プログラムを作るときに、全てのケースでそのルールをちゃんと徹底するのはとても難しいんです。
マイクロソフトのセキュリティホール(脆弱性)の大半はこのバッファオーバーフローなんですが、いつまでたっても、その問題がなくならないということから考えても、その難しさがわかると思います。
だから、プログラムを利用する側は、そういった問題はどうしても発生するものだと思って、もし問題が発見されたらすみやかに、修正されたプログラムを利用するべきです。
もし修正版やパッチが出ないような状況が続くようならば、そのプログラム(ソフト)を利用するのはやめるようにしましょう。