ソフトウェアに対する脆弱性の混入を防止するには、開発ライフサイクルの全体に渡って脆弱性検出のための仕組みを適切に取り入れることが不可欠です。検出のための手法にはさまざまなものがありますが、中でもツールをうまく活用することで開発ライフサイクルに取り込みやすいものとして「ファジング」と呼ばれる手法が挙げられます。
本特集では、IPAセキュリティセンターの協力の下で、ファジングの特徴や効果、導入に向けた留意点、導入事例などについて、4回に渡り解説します。
ファジングとは
「ファジング」というのはソフトウェアの不具合や脆弱性を発見するための手法のひとつで、「ファズ・テスト」とも呼ばれます。ファジングの基本的な手順は、対象のソフトウェアに対して問題が起こりそうなデータを大量に入力し、それに対する挙動を確認するというものです。通常のソフトウェアは、想定された入力データに対しては正しい処理を実施するように設計・実装されています。しかし、それだけではソフトウェアの不具合や脆弱性を防ぐことはできません。開発の段階で想定していなかった入力データを受け取ったときに、意図しない例外的な挙動につながる可能性があるからです。
優れたソフトウェアは、異常なデータが入力された場合でも想定外の動作をすることなく、通常の状態に復帰する堅牢性を備えています。ファジングによるテストの目的は、あえてそのような異常な入力データをソフトウェアに送り込んで挙動を調べ、不具合や脆弱性につながる入力がないかを確認することにあります。
ファジングにおいて入力する"想定外のデータ"のことを「ファズ」と呼びます。ファジングのポイントは、とにかく大量のファズを送り込み、問題の原因になりそうな入力をしらみつぶしにテストするということです。そのため、ファジングを手動で実施することはほとんどなく、ファジングツールを用いて自動化または半自動化して行うのが一般的になっています。
ファズの生成は、問題が起こりやすいパターンを分析して行う場合もあれば、完全にランダムに生成する場合もあります。"想定外"の事態を引き起こすことが目的なので、"あり得ない"と考えられるケースまで網羅することが重要です。それによって、担当者の先入観にとらわれることなくテストを実施することができる点がファジングの大きなメリットです。
ファズの形式と生成方法
ファズとして使われるデータ形式は、対象のソフトウェアが受け付ける入力形式によってさまざまです。たとえばコマンドライン入力やコマンドライン引数、ファイル、ネットワークパケット、Webサイトの入力フォームなどがあります。ファジングの対象となる主なソフトウェアの種類と、代表的なファズの形式を表1に挙げます。
表1 おもなファジングの種類とファズの形式
ファジングの対象 | おもなファズの形式 |
オフィスソフトや画像ソフト | ファイル |
CUIプログラム | コマンドライン引数、環境変数 |
Webブラウザ | HTTPレスポンス |
Webサーバ | HTTPリクエスト
|
Webアプリケーション | フォームへの入力値 |
ネットワーク通信ソフト | ネットワークプロトコル(TCP/IPなど) |
ファジングにおいてもっとも重要なのが、ファズをどのように作り出すかという点です。代表的な手法としては、次のようなものが挙げられます。
- 問題の生じる可能性が高いとされるデータ(制御コードを含む文字列や、境界値周辺の値など)をあらかじめ用意する
- 正常なデータを元に、一部を変化させて生成する
- 指定の範囲内で連続的に値を変化させて生成する
- ランダムに生成する
複数の手法によって生成されたファズを組み合わせて利用することもあります。多くのファジングツールでは半ば自動的にファズを生成する機能を持つため、それらのツールを利用することで専門的な知識がない状態でもファジングを始めることができます。
ファジングを巡る業界の動向
ファジングの根底にある"意図的に異常な入力を与えてソフトウェアをテストする"という考え方そのものは決して新しいものではなく、多くのプログラマが何らかの形で触れたことがあると思いますが、この概念がテスト手法として体系的に扱われるようになったのは90年代の後半頃からだと言われています。初期に開発されたファジングツールとしては、オウル大学の研究チームによる「PROTOS」(1999年)や、Dave Aitel氏によるオープンソースの「SPIKE」(2002年)や「sharefuzz」(同)などがあります。
ファジングの対象は、初期にはコマンドライン引数にはじまり、PROTOSやSPIKEではネットワークパケット、sharefuzzでは環境変数と、徐々にその適用範囲を広げていきます。そして2004年頃からはファイルに対するファジングの研究開発も盛んになり、それに続いてWebブラウザやWebアプリケーションを対象としたファジングツールの研究開発も行われるようになりました。また、攻撃の対象となりやすい大手ソフトウェア製品の開発元が、開発ライフサイクルの中で本格的にファジングを採用し始めたのもこの頃からです。
特に積極的な取り組みを実施していた企業のひとつがMicrosoftです。Microsoftでは、MS Officeをはじめとする同社製品のテストに本格的にファジングを取り入れ、大きな成果を挙げたそうです。また、Adobe Systems社やCisco Systems社などでも、製品の開発ライフサイクルでファジングを活用しているという事例が報告されています(これらの企業によるファジング活用事例については、本特集の第4回で詳しく紹介する予定です)。
このように大手企業でファジングの本格的な導入が進められる一方で、日本においてはその活用がまだ十分ではなく、採用しているのも一部の企業に限られるという実態が、IPAによるヒアリング調査で分かってきたそうです。そこでIPAでは、2011年8月より『ソフトウェア製品における脆弱性の減少を目指す「脆弱性検出の普及活動」』のひとつとしてファジングの啓発を開始(プレスリリース)、2012年3月にはファジングの活用方法などをまとめた「ファジング活用の手引き」および「ファジング実践資料」を公開しています。
IPAでこれらの活動を担当している技術本部 セキュリティセンター 情報セキュリティ技術ラボラトリーの勝海直人氏は、ファジングの導入について次のように指摘しています。
「ソフトウェアの脆弱性を減らすには、開発ライフサイクルの中できちんと脆弱性検出ができる仕組みを構築しなければいけません。ファジングはその手法のひとつであり、ツールによる自動化が可能なためツールをうまく使うことで比較的手軽にファジングを活用することが可能です。その一方で、ファジングを効果的に活用するためには、何がチェックできて何がチェックできないかなど、その特性をしっかりと把握することが大切です」
本特集では、次回以降でファジングの特徴や効果、導入する上での留意点、開発ライフサイクルにおける位置づけなどについて解説していきます。