ファジングとは?
何を探しているのかよくわからない状態で、一体どのように脆弱性を見つけることができるのでしょうか?ゼロデイ脆弱性の検出に、ファジング(ファジングテスト)がどのように役立つかを学びましょう。
ファジングやアプリケーションのファジングは、ソフトウェアアプリケーションのソースコード内に潜むセキュリティ上の脆弱性やバグをチームが発見できるようにするソフトウェアのテスト手法です。従来のソフトウェアテスト手法(SASTやDAST、IAST )とは異なり、ファジングでは、基本的にはランダムな入力でコードに対して「ping」を行いクラッシュさせることで、そうしなければ明らかにならない欠陥を特定します。このようなコードの欠陥(あるいはビジネスロジックの問題)から、セキュリティ上の脅威に対して高いリスクがある場所がわかります。
欠陥や脆弱性が見つかったら、ファザー(クラッシュの潜在的な原因を特定するツール)を使って、ソースコード内の特定の脆弱性に的を絞ることができます。ファザーは、SQL挿入やクロスサイトスクリプティングなど、ハッカーがセキュリティを無効にして情報を盗んだりシステムをダウンさせたりする攻撃で悪用される可能性のある脆弱性を特定するのに最も効果的です。スパイウェアやトロイの木馬などのシステムクラッシュとは無関係な脆弱性の発見には、あまり効果的ではありません。
ファジングを推奨する人々が、完全に自動化されていて、はっきりとしない弱点を見つけられる点を評価する一方で、反対する人々は設定が難しく、信頼性の低い結果をもたらしやすい点が不満だと述べています。
ファジングは別の点でも際立っています。このコンセプトが発見された経緯には、実はエピソードがあります。1988年に、ウィスコンシン大学マディソン校のBarton Miller教授が、ダイヤルアップシステムを使用してリモートでコードにアクセスしようとしていたところ、雷雨による干渉が原因でプログラムがクラッシュし続けました。外部の「ノイズ」はコードでは許容できないという考えは、Miller教授と彼の生徒の研究のきっかけとなりました。彼らは、予期しないランダムな入力がpingされた場合に、UnixやMac、Windowsのプログラムが定期的にクラッシュすることを発見しました。Miller教授は、『Fuzzing for Software Security Testing and Quality Assurance』の著者の1人です。
ファジングには、主にカバレッジファジングとビヘイビアファジングの2つのタイプがあります。
カバレッジファジングは、アプリの実行中にソースコードに注目し、バグを見つけるためにランダムな入力を与えます。絶えず新しいテストが生成され、アプリをクラッシュさせることを目標とします。クラッシュした場合、問題の可能性があることを意味します。テスターはカバレッジファジングプロセスから得たデータを使用して、クラッシュを再現できます。これはリスクのあるコードを特定するのに便利です。
ビヘイビアファジングの仕組みは異なります。アプリケーションがどのように動作すべきかを示すために仕様を参考にし、ランダムな入力を使用して実際にはどのように動作するかを判断します。想定される動作と実際の動作が異なる場合、通常はバグやその他の潜在的なセキュリティリスクが見つかります。
DevSecOpsにおいて、ファジングを行うことはなぜ重要なのでしょうか?ファジングにはランダムな性質があるため、他のテストでは見落とされてしまうバグを見つけられる可能性が最も高い手法だと専門家は述べています。また、非常に手間のかからないテスト手法だと感がられています。「設定すれば、あとは放っておける」という意見もあります。テストハーネスを一度作成すれば、ファジングは完全に自動化され、いつまでも実行されます。マシンの台数を増やすことで簡単にスケーリングでき、回帰テストにも適しています。またファジングは、誤検出を行うことなく、コードカバレッジ(ファザーによって実行されたコードの量)を最大化できるため、開発プロセスがスピードアップします。コードカバレッジが高いほど、より徹底的なテストを実行できたことを意味します。
さらにファジングは、手動によるテストを担当するチームと一緒に行うのが理想的です。これは、ファジングの入力セットと手動テストの入力セットをそれぞれをもとに調整できるためです。
ファジングの実装を行おうとする場合、設定とデータ分析という主な2つの課題に直面します。ファズテストの設定は必ずしも簡単ではありません。設定するには複雑な“ハーネス”のテストが必要となりますが、ファジングが実際には既存のツールチェーン内に配置されていない場合、さらに“ハーネス”のテストが作成しにくくなる可能性があります。その上、ファジングを行うと、誤検出の可能性も含め、多くのデータが生成されることがあります。そのため、テストの担当チームが大量の情報に対処できるように準備しておくことが不可欠です。
また、あまり簡単には証明できないものの、QAコミュニティではファジングの「あいまい」な性質に対する否定的な考え方が依然として存在します。