現代のウェブアプリケーションにおいて、パフォーマンス向上のためにキャッシュ技術は不可欠です。しかし、設定ミスや実装の不備があると、「ウェブキャッシュポイズニング」や「ウェブキャッシュデセプション」といった深刻な脆弱性につながる可能性があります。これらの脆弱性は、攻撃者によってユーザーの機密情報が漏洩したり、改ざんされたコンテンツが表示されたりする原因となり得ます。
そこで登場するのが、Web Cache Vulnerability Scanner (WCVS) です。これは、Hackmanit GmbH と Maximilian Hildebrand によって開発された、Go言語ベースの強力なコマンドラインツール(CLI)で、ウェブキャッシュ関連の脆弱性を検出するために特化しています。
この記事では、WCVS の基本的な使い方から応用的な活用法まで、詳しく解説していきます。WCVS を使って、あなたのウェブアプリケーションのセキュリティを強化しましょう!💪
WCVS とは何か? 🤔
WCVS は、ウェブキャッシュポイズニング (Web Cache Poisoning) とウェブキャッシュデセプション (Web Cache Deception) という、ウェブキャッシュ機構を悪用する2種類の攻撃に関連する脆弱性を検出するためのスキャナーです。
- ウェブキャッシュポイズニング: 攻撃者がキャッシュサーバーに不正なコンテンツをキャッシュさせ、他のユーザーにその汚染されたコンテンツを提供させる攻撃です。キーに含まれないヘッダーやパラメータを悪用することが多いです。
- ウェブキャッシュデセプション: キャッシュサーバーとオリジンサーバーの間のリクエスト解釈の齟齬を利用し、本来キャッシュされるべきでない機密情報(ユーザープロファイルなど)をキャッシュさせ、攻撃者がそれを窃取する攻撃です。URLのパス構造の誤解釈などが原因となることがあります。
WCVS はこれらの攻撃で利用される様々なテクニックに対応しており、高速かつ柔軟なスキャンが可能です。また、特定のキャッシュサーバーの挙動に適応して効率的なテストを行ったり、検出結果を JSON 形式でレポート出力したりする機能も備えています。CI/CD パイプラインへの統合も容易です。
WCVS の主な機能 ✨
WCVS は多機能なツールであり、主な特徴は以下の通りです。
機能 | 説明 |
---|---|
多様なテスト手法 | 9種類以上のウェブキャッシュポイズニング手法(Unkeyed Header/Parameter Poisoning, Parameter Cloaking, Fat GET, HTTP Response Splitting, HTTP Request Smuggling, HHO, HMC, HMO など)と、複数のウェブキャッシュデセプション手法(パスパラメータ、パストラバーサル、特殊文字付加など)に対応しています。 |
キャッシュ挙動分析 | テスト前にキャッシュサーバーの挙動を分析し、スキャンを最適化します。キャッシュが存在しない場合は、デフォルトでテストをスキップします。 |
クローラー機能 🕷️ | 指定された URL からリンクをたどり、追加のスキャン対象 URL を自動的に発見します。クロール対象のフィルタリングや最大数制限などのカスタマイズが可能です。(デフォルトでは無効) |
カスタマイズ性 🔧 | ヘッダー、パラメータ、Cookie などの値を指定したり、カスタム User-Agent を使用したりできます。また、スキャンするテストの種類を選択したり、特定のテストをスキップしたりすることも可能です。 |
プロキシ連携 🔗 | HTTP/HTTPS トラフィックを Burp Suite などのプロキシ経由でルーティングできます。プロキシサーバーの URL や証明書パスを指定可能です。 |
レート制限 ⏱️ | 秒間あたりのリクエスト数を制限することで、ターゲットサーバーのレートリミットを回避します。 |
レポート出力 📄 | スキャン結果を JSON 形式の詳細なレポートとして出力します。スキャン設定、統計情報、脆弱性が発見された場合はそのリクエストとレスポンスなどが含まれます。 |
ワードリスト 📚 | ヘッダー名とパラメータ名のワードリストが必要です。デフォルトのワードリストが付属していますが、カスタムワードリストを使用することも可能です。 |
インストール方法 🛠️
WCVS はいくつかの方法でインストールできます。
方法1: 事前ビルド済みバイナリ
最も簡単な方法です。公式リリースページから、お使いの OS に合ったバイナリをダウンロードします。アーカイブにはデフォルトのワードリスト (`headers.txt`, `parameters.txt`) も含まれています。
# Linux / macOS の例 (ダウンロード後)
unzip wcvs_linux_amd64.zip
cd wcvs_linux_amd64
./wcvs --help
方法2: Kali Linux / BlackArch リポジトリ
Kali Linux や BlackArch Linux を使用している場合は、パッケージマネージャーから簡単にインストールできます。
# Kali Linux
sudo apt update && sudo apt install web-cache-vulnerability-scanner
# BlackArch Linux
sudo pacman -S wcvs
方法3: Go を使用してインストール
Go (バージョン 1.21 以降) がインストールされていれば、`go install` コマンドでインストールできます。
go install -v github.com/Hackmanit/Web-Cache-Vulnerability-Scanner@latest
この方法の場合、デフォルトのワードリストは別途ダウンロードする必要があります。
方法4: Docker を使用
Docker イメージをビルドして使用することも可能です。
# 1. リポジトリをクローン
git clone https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner.git
cd Web-Cache-Vulnerability-Scanner
# 2. Docker イメージをビルド (ワードリストもコピーされます)
docker build -t wcvs-image .
# 3. Docker コンテナを実行
docker run -it --rm wcvs-image --help
Docker を使用すると、環境依存の問題を避けやすくなります。
基本的な使い方 🚀
WCVS の最も基本的な使い方は、`-u` または `–url` フラグでターゲット URL を指定することです。デフォルトのワードリスト (`headers.txt`, `parameters.txt`) が WCVS の実行ファイルと同じディレクトリにあるか、`-hw` (`–headerwordlist`) および `-pw` (`–parameterwordlist`) フラグでパスが指定されている必要があります。
# 実行ファイルと同じディレクトリにワードリストがある場合
./wcvs -u https://example.com
# ワードリストのパスを明示的に指定する場合
./wcvs -u https://sub.example.com/path -hw /path/to/headers.txt -pw /path/to/parameters.txt
スキャンが開始されると、WCVS はまずターゲットのキャッシュ挙動を分析し、その後、設定されたテスト手法に基づいて脆弱性をスキャンします。進捗状況や検出された問題はコンソールに出力されます。
ヘルプの表示
利用可能なすべてのフラグとその説明は、`-h` または `–help` フラグで確認できます。
./wcvs -h
応用的な使い方とオプション ⚙️
WCVS は多くのカスタマイズオプションを提供しています。ここでは主要なものをいくつか紹介します。
1. クローラー機能の利用
ウェブサイト内のリンクをたどり、スキャン対象を広げたい場合は、`-c` または `–crawl` フラグを使用します。
# クローラーを有効にする
./wcvs -u https://example.com -c
# クロールする最大URL数を100に制限
./wcvs -u https://example.com -c --maxcrawledurls 100
# 特定の文字列を含むURLのみクロールする (例: 'product')
./wcvs -u https://example.com -c --mustcontain 'product'
# 特定のURLをクロール対象から除外する (ファイルで指定)
./wcvs -u https://example.com -c --skipfile /path/to/skip_urls.txt
2. プロキシ経由でのスキャン
Burp Suite などのプロキシを通してリクエストを送信したい場合は、プロキシの URL と必要に応じて証明書を指定します。
# デフォルトのプロキシ (http://127.0.0.1:8080) を使用
./wcvs -u https://example.com -purl
# プロキシURLと証明書パスを指定 (Burpの証明書はDER形式なのでPEMに変換が必要)
# openssl x509 -inform DER -outform PEM -text -in cacert.der -out certificate.pem
./wcvs -u https://example.com -purl http://127.0.0.1:8080 -ppath /path/to/certificate.pem
3. リクエストのカスタマイズ
特定のヘッダー、パラメータ、Cookie を追加したり、User-Agent を変更したりできます。
# カスタムヘッダーを追加 (ファイル指定も可能)
./wcvs -u https://example.com -sh "X-Custom-Header: Value1" "Authorization: Bearer TOKEN"
# カスタムパラメータを追加 (ファイル指定も可能)
./wcvs -u https://example.com -sp "param1=value1" "param2=value2"
# カスタムCookieを追加 (ファイル指定も可能)
./wcvs -u https://example.com -sc "session=ABCDEFG" "user_pref=dark"
# User-AgentをChromeに変更
./wcvs -u https://example.com -uac
4. スキャン対象テストの選択
特定のテストのみを実行したり、特定のテストを除外したりできます。
# キャッシュデセプションとヘッダーポイズニングのみ実行
./wcvs -u https://example.com -ot 'deception,headers'
# HTTPリクエストスマグリングを除外して実行
./wcvs -u https://example.com -st 'smuggling'
利用可能なテスト名は `–help` で確認できます。
5. レポートの出力
スキャン結果を JSON ファイルに出力するには、`-o` または `–output` フラグを使用します。
./wcvs -u https://example.com -o scan_report.json
このレポートには、スキャン設定、時間、検出された脆弱性の詳細(リクエスト/レスポンス含む)などが記録され、後の分析や自動化処理に役立ちます。
6. スキャン速度の調整
リクエストレートやスレッド数を調整できます。
# 1秒あたり5リクエストに制限
./wcvs -u https://example.com -rr 5.0
# 使用するスレッド数を10に制限 (デフォルトは20)
./wcvs -u https://example.com -t 10
# タイムアウトを30秒に延長 (デフォルトは15秒)
./wcvs -u https://example.com -to 30
結果の解釈と対応 📊
WCVS はスキャン中に発見した潜在的な脆弱性や問題をコンソールに出力し、JSON レポートにも記録します。結果を正しく解釈し、適切な対応を取ることが重要です。
コンソール出力の例:
スキャン中、以下のようなメッセージが表示されることがあります。
[+] Potential vulnerability found! (Technique: Unkeyed Header Poisoning)
: 脆弱性の可能性が高いことを示します。[!] Potential finding detected (Possible Cache Poisoning): Header 'X-Forwarded-Host' seems to influence the response.
: 応答に影響を与えるキーでないヘッダーやパラメータが見つかった場合など、さらなる調査が必要な可能性を示します。[-] Error during scan: Timeout exceeded for URL ...
: スキャン中にエラーが発生したことを示します。
JSON レポート:
JSON レポートには、より詳細な情報が含まれます。特に `Vulnerabilities` や `Findings` のセクションに注目してください。脆弱性が検出された場合、以下のような情報が記録されます。
Technique
: 使用された攻撃手法(例: “Unkeyed Header Poisoning”, “Parameter Cloaking”)。URL
: 脆弱性が発見された URL。PoisonedRequest
: キャッシュを汚染するために送信されたリクエストの詳細。PoisonedResponse
: 汚染されたキャッシュから返されたレスポンスの詳細。OriginalRequest
/OriginalResponse
: 比較のための元のリクエスト/レスポンス。
これらの情報をもとに、手動で再現テストを行い、脆弱性の深刻度を評価し、修正策を検討する必要があります。
一般的な対策
ウェブキャッシュ関連の脆弱性に対する一般的な対策には以下のようなものがあります。
- ✅ キャッシュキーの厳格化: レスポンスの内容に影響を与える可能性のあるすべてのリクエスト要素(ヘッダー、パラメータ、Cookie など)をキャッシュキーに含めるようにキャッシュサーバーを設定します。
- ✅ Vary ヘッダーの適切な利用: レスポンスが特定のヘッダー(例: `Accept-Language`, `Cookie`)によって変化する場合、`Vary` ヘッダーでそれを明示します。
- ✅ 不要なヘッダー/パラメータの無視: アプリケーション側で、レスポンス生成に不要なヘッダーやパラメータを無視または正規化します。
- ✅ 入力値の検証とサニタイズ: ユーザーからの入力(ヘッダー、パラメータ、URL パスなど)を適切に検証し、不正な値や文字を無害化(サニタイズ)します。
- ✅ 動的コンテンツのキャッシュ制御: 機密情報を含むページやユーザーごとに内容が変わるページでは、`Cache-Control: no-store, private` などのヘッダーを使用してキャッシュさせないようにします。CDN の設定でこれらのヘッダーが上書きされないように注意が必要です。
- ✅ CDN のセキュリティ機能活用: Cloudflare の “Cache Deception Armor” のように、CDN が提供するキャッシュ保護機能を有効にします。
- ✅ WAF の導入: Web Application Firewall を導入し、既知の攻撃パターンをブロックします。
Web Cache Poisoning | Web Cache Deception
まとめとベストプラクティス ✅
Web Cache Vulnerability Scanner (WCVS) は、ウェブキャッシュに関連する脆弱性を発見するための強力で使いやすいツールです。定期的に WCVS を使用してスキャンを実行し、設定の不備や新たな脆弱性を早期に発見することが、ウェブアプリケーションのセキュリティを維持する上で非常に重要です。
ベストプラクティス:
- 定期的なスキャン: アプリケーションの変更時や定期的なセキュリティ監査の一環として WCVS スキャンを実施します。
- CI/CD への統合: 可能であれば、WCVS を CI/CD パイプラインに組み込み、デプロイ前に自動的に脆弱性チェックを行います。
- カスタムワードリストの活用: アプリケーション固有のヘッダーやパラメータがある場合は、カスタムワードリストを作成してスキャンの精度を高めます。
- 結果の検証: WCVS が報告した潜在的な脆弱性は、必ず手動で検証し、誤検知でないことを確認します。
- プロキシとの連携: Burp Suite などのプロキシと連携させることで、WCVS が送信するリクエストやレスポンスを詳細に分析し、脆弱性の理解を深めることができます。
- 設定の理解: 自身が利用しているキャッシュサーバーや CDN の設定を十分に理解し、意図しないキャッシュが行われていないか確認します。
WCVS を効果的に活用し、ウェブキャッシュのメリットを享受しつつ、潜むリスクからアプリケーションを守りましょう!🛡️
Hackmanit/Web-Cache-Vulnerability-Scanner