バッファオーバーフローとは

最近…と言うよりも昔からよく聞く言葉として「バッファオーバーフロー」というのがあります。セキュリティホールの一つですね。外部から、与えられた変数領域以上のデータを書き込むことによって領域をあふれさせ、与えられた変数領域以外の場所を書き換える攻撃です。
この場合、与えられた変数領域以外の場所には何が入っているか分かりませんから、そのときどきに応じていろいろな問題が起こります。一番多いのは、本来プログラムが入っている場所が書き換えられることによって実行不能になり、不正終了するという問題でしょう。ただ、それはまだ問題としては軽い方なのです。
プログラムは実行時にビットの並びが定まるはずなので、変数領域の次にどのようなプログラムコードがあるかを把握しておけば、そのプログラムのコードを攻撃者の好きなように書き換えることが可能です。そこでよく行われるのは、攻撃者の書いたコードへの誘導らしいです。呼び出しだけなら、それほど大量に書き換えなくてもできちゃうでしょうし。そうすると、あらゆるコードを実行できてしまうという問題が起こるわけです。ハードディスクをフォーマットするのも、ハードディスクに保存されているすべてのメールアドレスに対してウイルスを送りつけるのも思いのままということですね。
そもそも、こんなことができてしまう根本的な原因として、C言語C++言語の仕様があります。例えばJavaの場合、言語レベルで変数領域の保護を行っており、それ以上のデータを扱うプログラムを書けばそもそもコンパイルができません。実行時にあふれた場合も、実行時例外として検出されます。つまり、Javaでは原理上バッファオーバーフローは起こらないのです。僕の知識が足りないだけで、実際は可能なのかもしれませんが…。ともかく、これはC言語の「メモリ管理を行わない」という特性によるのです。だからC言語なんて使うのはやめてしまえ、というのは暴論でしょうか。
ちなみに、なぜメモリ管理を行わないかと言えば、それは速いからです。それも、かなりの差が出ると聞きます。ただ、メモリリークを起こしまくるとどんどんメモリが減っていきますし、大規模なプログラムでまったくメモリリークを起こさないなんて不可能なのではないかと思います。人間はミスをする生き物だという前提に立って、メモリ管理を言語レベルで行っている言語を使っていくべきなのではないかなあ、と思ったりしています。