ファジングツールをセキュリティツールキットに加えるべき理由
Kuria Macharia
2022年10月28日
0 分で読めますファジングは、アプリケーションに無効なランダム入力を自動的に与えてバグを検出する、ソフトウェアセキュリティテスト手法です。ファジングの目的は、アプリケーションに負荷をかけて、予期しない動作やクラッシュ、リソースリークを引き起こすことです。これにより開発者は、アプリケーションの動作や脆弱性をより包括的に把握できます。この種のテストには、ファザーと呼ばれるファジングツールを使用します。ファザーとは、対象ソフトウェアにランダムな入力を送るアプリケーションです。
ファジングという言葉は、1980年代にバートン・ミラー教授がUNIXシステムの障害原因を調査していたときに生まれました。障害の原因をより深く理解するため、教授は学生たちに、自動生成したデータをUNIXシステムに大量に送らせました。
ファジングツールでセキュリティを強化する方法
ファジングツールがセキュリティをどのように強化するのかを理解するため、ファジングのメリットやユースケースを見ていき、実環境のテストでどのように機能するかを例を通して確認しましょう。
ファジングのメリット
ファジングには、次のような幅広いメリットがあります。
アプリケーションのセキュリティを早期にファジングテストすることで、特定されていない脆弱性を悪用するゼロデイ攻撃を防ぎやすくなります。ファジングは多角的なアプローチでバグを特定するため、通常の方法では見つけにくく、攻撃者に悪用される可能性のある問題を発見できます。たとえば、データ暗号化の欠如、アルゴリズムの不備、入力検証の不足などです。
実行を開始すれば人手が不要なため、時間と費用の面でオーバーヘッドが小さく済みます。
ファザーを使うと、手動テストでは見つけられないエッジケースを特定できます。
問題を特定するだけでなく、攻撃者が脆弱性をどのように悪用できるかについて、詳細なレポートも作成します。
ファジングのユースケース
アプリケーションの個々のコンポーネントを個別にファジングテストできます。以下にユースケースを紹介します。
Webアプリケーションのファジング
Webアプリケーションのファジングでは、SQLインジェクション(https://learn.snyk.io/lessons/sql-injection/javascript/)やクロスサイトリクエストフォージェリ(CSRF)(https://learn.snyk.io/lessons/csrf-attack/javascript/)などの一般的な攻撃に対してWebアプリケーションを脆弱にするバグを検出できます。Webアプリケーションをファジングする際、テストではエンドポイントにランダムなデータを送信し、アプリ内のバグを明らかにします。検出されたバグを修正すれば、アプリケーションのセキュリティ態勢を強化できます。たとえば、サーバー側のセキュリティを高めるため、フロントエンドで入力検証を追加すべきページを特定できます。
APIファジング
APIファジングでは、データベースアクセスに関する脆弱性を検出できます。パスワードの露出やパラメーター検証の欠如などがその例です。APIファジングを使うと、APIとバックエンドサーバーとの連携をより適切に制御できます。たとえば、決済APIがクレジットカード番号や認証署名を正しく検証するかどうかをテストできます。
URLファジング
URLファジングを使うと、Webサーバー上の隠しファイルやディレクトリを発見できます。本来隠しておくべきなのに、一般公開されているファイルやディレクトリを検出できます。これにより、Webサーバー上のファイルやディレクトリを不正アクセスから保護できます。また、データベースの認証情報やクエリ形式など、攻撃者がCSRF攻撃で偽造リクエストを作成するために利用できる機密情報の露出防止にも役立ちます。
プロトコルファジング
プロトコルファジングでは、偽造パケットをアプリケーションに送信し、実装上のバグを探します。たとえば、ファザーがメッセージの長さを把握していれば、その値を増やしてアプリケーションがリクエストをどう処理するか確認できます。
ファイル形式のファジング
ファイル形式のファジングは、シンプルで直接的な手法です。正規のファイルサンプルを改変し、その改変版を対象アプリケーションで開いてクラッシュを引き起こします。システムをクラッシュさせるバグを検出し、アプリケーションが開けるファイル形式をより適切に制御できる箇所を明らかにすることで、アプリケーションのセキュリティと安定性を高めます。JPEG、PNG、PDFなど、指定形式のスキャン済み文書をアップロードして開く必要があるアプリケーションのクラッシュ防止にも利用できます。
ファジングテストツールの制約
ファジングテストツールは比較的効果的ですが、いくつかの欠点もあります。
ファジングテストツールだけでは、アプリケーションの包括的なセキュリティを保証できません。
アプリケーションのクラッシュを引き起こさない脅威の検出には、あまり効果的ではありません。
テストを完了するまでにかなりの時間がかかります。
複雑な障害や脅威を特定できません。
ファジングとSnykの脆弱性スキャナーの比較
ファジングはアプリケーションのセキュリティ態勢を強化するうえで重要ですが、単独では十分な効果を得られません。アプリケーションのエンドポイントに関連するバグしか見つけられないためです。
アプリケーションをファジングテストするには、ファザーを設定し、ファジング処理が完了するまで十分な時間を確保する必要があります。これにより開発プロセスが遅れ、新しいアプリケーションの市場投入までの時間が長くなります。
しかし、継続的な開発と継続的デリバリー(CI/CD)が求められる現在、それだけでは不十分です。コードの作成段階から、アプリケーションの脆弱性を継続的に監視する必要があります。Snykは脆弱性を継続的にスキャンし、コード、Gitのプルリクエスト、コンテナを検査します。CI/CDパイプラインに追加すれば、アプリケーションのライフサイクル全体を通じて脆弱性を継続的にスキャンできます。
Snykの脆弱性スキャナーのもう1つの特長は、実行可能な修正方法を提示することです。指摘された問題の一部は、数回クリックするだけで修正できます。
ファジングの例
ファジングをどのように、いつ、なぜ使うのかを理解するため、次の例を見てみましょう。
HealthyTastyMeals.comでオンラインの食事宅配サービスを開始したとします。開発中はすべての機能を何度もテストし、友人や同僚にもアプリを使ってもらい、使いやすさを確認しました。
しかし、実施したテストはすべて、想定された形式に従ってリクエストを送り、値を入力することに重点を置いていました。では、予期しない事態にはどう備えればよいでしょうか。
予期しない入力が大量に送られたときのWebサイトの挙動を把握するには、ファジングテストが必要です。このWebサイトではREST APIを使用しているため、ファジングツールのRESTlerを利用できます。RESTlerはREST API向けのオープンソースファジングツールです。
エンドポイントが少なく、実行も簡単なため、RESTlerを「Fuzz」モードで実行します。テストではWebアプリケーションの各エンドポイントを対象にバグを探します。エンドポイントにさまざまなパラメーターの組み合わせやリクエンスを送信します。
バグが見つかるたびに、RESTlerはコンソールにバグの種類の概要を出力します。
テストで検出できる脆弱性には、次のようなものがあります。
安全でないパラメーターの組み合わせ
REST APIには、リクエストURI、リクエストメソッド、クエリパラメーターなど、さまざまなパラメーターがあります。これらのパラメーターには複数の組み合わせがあり、プログラムの誤った状態を避けるためにテストが必要です。ファジングを使えば、安全でないパラメーターの組み合わせを特定できます。すべてのクエリパラメーターに検証を追加し、必要なパラメーターだけに制限することで修正できます。
検証機構がないクエリパラメーター
クライアント側とサーバー側で強力な入力検証を実施すると、アプリケーションのセキュリティ態勢を強化できます。RESTlerのようなファジングツールを使えば、アプリケーションにこの問題がないかを特定できます。クライアント側とサーバー側の両方に強力な入力検証を追加することで、このセキュリティ上の懸念を解消できます。クライアント側の検証は、無効なデータによるサーバーへの過剰な負荷を防ぎます。サーバー側の検証により、サーバーが有効なリクエストのみを処理するようにできます。この問題を解決すれば、サービス拒否(DoS)攻撃のリスクを軽減できます。
保護されていないパスワード
RESTlerは、ハッシュ化されていないパスワードパラメーターも検出します。bcryptやPBKDF2などのハッシュアルゴリズムを使うことで修正できます。この脆弱性を解消すれば、攻撃者によるシステム乗っ取りを困難にできます。攻撃者がシステムに侵入しても、パスワードにはアクセスできないためです。
おすすめのファジングツール5選
市場には多くのオープンソースファジングツールがあります。アプリケーションのセキュリティ強化に手軽に使える、無料で効果的なツールを5つ紹介します。
1. OSS-Fuzz
OSS-FuzzはGoogleが開発したオープンソースのファジングツールです。最新のファジング手法と、拡張性の高い分散実行を組み合わせています。Googleはオープンソースソフトウェアのセキュリティと安定性を高めるために開発しました。OSS-Fuzzは対象プログラムを継続的にファジングします。
2. ClusterFuzz
ClusterFuzzは、セキュリティ脆弱性や安定性の問題を検出する、拡張性の高いオープンソースのインフラストラクチャです。GoogleはChromeブラウザーのバグ検出に利用しています。OSS-Fuzzとは異なり、ClusterFuzzはオープンソースに限らず、あらゆるアプリケーションで動作します。拡張性が高く、規模を問わずクラスター上で実行できます。
3. go-fuzz
go-fuzzは、Goのパッケージをテストするオープンソースのファザーです。悪意ある攻撃者に狙われやすい、複雑な入力を扱うパッケージに重点を置いています。Goプログラムの入力処理を強化したい場合に役立つツールです。上記2つのファザーとは異なり、go-fuzzはGoパッケージ専用です。
4. Peach Fuzzer
Peach FuzzerはPeachTechが開発し、後にGitLabが買収したツールです。柔軟に設定できるため、カスタマイズしたテストを実施したい場合に効果的です。go-fuzzとは異なり、あらゆる言語で動作するように設定できます。ただし、PeachTechによるサポートや更新は終了しています。
5. ffuf
ffufはGoで書かれた、無料で高速なWebファザーです。未知のPOSTリクエストやGETリクエストを使ってアプリケーションを徹底的にテストできる強力なツールです。インターフェースがないため、開発者はコマンドラインから操作します。
セキュリティツールキット
ファジングは、アプリケーションに無効なランダム入力を与えてバグを検出するソフトウェアテスト手法です。予期しない入力に対するアプリケーションやAPIの挙動を把握するのに役立ちます。特定のテストシナリオ向けに開発されたオープンソースのファジングツールが数多くあります。ファザーは時間と費用の面でオーバーヘッドが小さく、問題の特定だけでなく、攻撃者が脆弱性をどう悪用できるかについて詳細なレポートも作成します。
適切に実施したファジングテストは、簡単には検出できない脆弱性を明らかにし、アプリケーションのセキュリティ態勢を強化します。データ暗号化の欠如、アルゴリズムの不備、入力検証の不足などのバグを見つけるのに役立ちます。手動テストでは発見できない問題も特定できます。
ファザーを活用すれば、攻撃者が特定されていない脆弱性を悪用するゼロデイ攻撃を防ぎやすくなります。ファジングの結果は、CSRFやインジェクション攻撃、サービス拒否(DoS)攻撃などのセキュリティ攻撃のリスク軽減に役立ちます。
Capture the Flagを始めよう
オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。


