図1:ソース・コードがあってもバグを見つけるのは意外と大変
図1:ソース・コードがあってもバグを見つけるのは意外と大変
[画像のクリックで拡大表示]
図2:エラーを起こしそうなデータを入力して外から挙動を調べる(イラスト:なかがわ みさこ)
図2:エラーを起こしそうなデータを入力して外から挙動を調べる(イラスト:なかがわ みさこ)
[画像のクリックで拡大表示]

 フアジングとはソフトウエアのバグを発見するテクニックの一つ。ファズ・テストとも呼ばれる。セキュリティ・ホールにつながるOSやアプリケーションのバグを発見するための手法として,最近急速に注目度が高まっている。

 ソフトウエアのバグを見つける方法は,大きく二つのタイプに分類できる。一つはソフトウエアを内部から調べる方法,もう一つは反対に外部から調べる方法だ。

 内部から調べる方法は,ソフトウエアの「ソース・コード」を調べてバグを探す。ソース・コードは完成したプログラムのいわば「設計図」に当たり,オープン・ソースのソフトウエアの場合,誰でも自由に入手できる。

 ソース・コードには,開発者が意図しないものも含め,プログラムのあらゆる処理や動作が書かれている。このため,もしソース・コードを完璧にチェックできるなら,理論上はどんなバグだろうが確実に見つけてつぶせるはず。

 しかし,人間のチェック能力には限界があり,ソース・コードをいくら入念に調べようとしても,どうしても見落としが生じてしまう。プログラムが巨大で複雑になるほど検証すべきソース・コードの量も増え,見落としの可能性はどんどん高まる(図1)。

 もう一方のソフトウエアのバグを外から見つける方法として,最近とくに注目を集めているのがファジングだ。ファジングを簡潔に表現すると,「調査対象ソフトをブラックボックスとみなしたうえで,エラー成分を含むさまざまなデータを大量かつ自動的に入力し,その応答によってバグを探す手法」と定義できる。

 一般に,Windowsや市販アプリケーションの多くは,ソース・コードが公開されていない「クローズド・ソース」のソフトウエアだ。こうしたクローズド・ソースのソフトウエアの場合,ソース・コードを使って内部から調べるテクニックは当然使えない。

 必然的に,対象を外から色々操作してみることがバグ探しの基本になる。このとき重要なのは,「いかに効率良くエラーを起こさせるか」という点だ。そこでファジングでは,ソフトウエアが扱えるデータの形式や利用するプロトコルなどを考慮して,「できるだけバグの発見につながりそうなエラー成分を含むデータ」を大量に作り,これを自動的に試すことで効率良くバグを探索する。投入したデータに対する応答などを詳しく調べて解析することで,バグを効率良く見つけられるというわけだ(図2)。

 ソフトウエアに入力するデータを完全にランダムに作ると,そのほとんどは問題なく処理されてしまうため,いくら時間をかけてもなかなかバグの発見につながらない。例えばWebサーバー機能を持ったソフトを検査するなら,最低限HTTPというプロトコルのしくみを理解したうえで,エラーを起こしそうなたくさんのファジー(fuzzy:あいまいの意)なデータを生成できることが必要になる。ファジングが注目を集めているのは,こうした処理をこなせる優れたツールがどんどん開発されてきていることも一つの要因だ。

 ファジング技術の進化によって,最近ではソース・コードを調べるよりもファジングで調べた方が効率良くバグを見つけられるケースも珍しくないという。当然,クラッカもファジングの手法を使って穴を見つけようと狙っている。「ソース・コードを非公開にすれば中身がわからず安全だ」というのは過去の話で,今はもう「隠しても無駄」である。