少し話題を変えましょう。現在、私が開発で利用している言語はC++です。私がC好きということもあり、C++はなじみやすい言語でした。しばらくWindowsのプログラミングから遠ざかっていたので、さぞかしバグもなくなっていることだろうと期待していたのですが、その期待は大きく裏切られました。
私が開発している間にも、いくつかのAPIにメモリーリークの問題があることが分かりました。つまり、プログラマ自身ではどうしようもない脆弱性が、開発環境そのものにあるのです。
確かに、昔に比べれば文字列の扱いが格段に楽、かつ安全になりました。昔は、文字列の扱いがちゃんとできないと一人前のCのプログラマではありませんでした。いまでは、長さも気にせず代入したり、連結したりできます。
しかしながら、多くのAPIでいまだに呼び出し側のメモリ管理に依存しています。従って、プログラマの技量やうっかりミスで、バッファオーバーフローなどを作り込んでしまう可能性は十分に潜んでいます。
初歩的なミスとして、変数の初期化忘れや、取得した文字列の最後尾にNULL値があるという思い込みのコードなどは、いつ作りこまれていても不思議ではありません。こういうバグは通常の試験では問題がなくても、別の環境や特別な状況で発覚するのです。
ハードディスクのディレクトリ構造は、場所によってはいくつにも深くなっていますが、これらをたどってファイルを検索するようなプログラムは、C++であれば再帰呼び出しがよく使っていますし、ネット上でもサンプルプログラムが紹介されています。
しかし、再帰呼び出しは同じ関数を繰り返し呼び出す手法なので、スタックを消費します。これを繰り返すことによって、いずれはスタックオーバーフローにつながる危険性があります。
私も困ったときにはネットでサンプルプログラムを検索しますが、ネット上で見つかるサンプルプログラムにも多くの問題が散見されます。エラー処理がきちんと書かれていないのは当然としても、セキュリティ的に見て脆弱性に直結するようなものも少なくありません。
昔に比べれば、ネットでなんでも調べられるようになって便利になりました。プログラムでも、多くの問題はネットで調べれば解決してしまいます。しかし、それをうのみにしないでちゃんと理解して、関数の引数や戻り値、エラー情報などをきちんと調べ直してから自分のプログラムに利用しないと、脆弱性をそのまま継承してしまうかもしれません。
また、最近ではいろいろな機能がコンポーネントとして安価に入手できるようになっています。例えば、データベースへのアクセスやPDFファイルの扱い、さまざまなGUIなどをイチから書かなくても、コンポーネントをダウンロードすれば使えるようになっています。
しかし、これらのコンポーネントにもバグがあり、その中にはセキュリティ上問題となり得る脆弱性も含まれている場合があります。
これらのコンポーネントはプログラムと一体化しているので、もし、それに脆弱性が見つかったとしても、改修の必要性はそれを利用している開発会社のみぞ知る、という状態になっています。一般ユーザーからは脆弱性のあるコンポーネントを利用しているかどうかは分かりません。
このように、いまの開発環境においてもまだまだ多くの脆弱性が作りこまれる条件は十分あり、互換性の維持など考えると少なくとも何年かは同じ状況が続くものと思われます。個人のPCをターゲットとするとどうしても古いOSへの対応は捨てきれません。
Windows 98なんてもうないだろう、などと思っていたら、お客様の中でも実際に業務で使用されている方がいたりします。セキュリティの更新がされないといっても、個人が買っているパソコンですから、利用を強制的に中止させるわけにもいきません。普段の利用に差し支えがないのであればなおさらです。
さらに、Windows 2000に至っては、今後数年間は使い続けられることでしょう。PCのスペックもある程度のものを使っているユーザーも多いので、買い替えないユーザーは少なくないでしょう。
ということは、Windows 2000にアプリケーションを対応させていかないと、多くのユーザーに受け入れられないということです。いくつかの有名なアプリケーションでは、Windows XP SP3以上、ときっぱり割り切っているようですが、ユーザーにとってはそれがバージョンアップをしない理由になったりして、脆弱性が改善されない原因にもなっていくでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.