ssrf について
サーバーサイドリクエストフォージェリのリスクを検出するコードレビュー用スキルです。アウトバウンド通信を調べるセキュリティ担当者向けに、スキャナーと手動追跡を組み合わせ、URL入力、検証、リダイレクト、DNS解決、クラウドメタデータへのアクセスを確認します。
主な機能
- 01関連ファイルに分析範囲を限定
- 02URL入力とスキーム検証を確認
- 03内部IPとメタデータへのアクセスを追跡
- 04リダイレクトとDNSリバインディングを確認
- 05semgrep、bandit、gosecと連携
- 06修正案と参照情報付きで報告
活用シーン
- 01Webhookとコールバック処理の監査
- 02URLプレビューやインポートコードのレビュー
- 03クラウドメタデータ露出の確認
- 04ユーザー指定URLからリクエストまでの追跡
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ florianbuetow/ claude-code --skill ssrfインストール後、Claude Code で/ssrfを入力して読み込まれたか確認します。
同梱ファイルreferences/detection-patterns.md
詳細
サーバーサイドリクエストフォージェリ(A10:2021)
ユーザー入力に基づく URL の取得、URL 検証の欠如、内部ネットワークへのアクセス、リダイレクトの追跡、DNS リバインディング、クラウドメタデータエンドポイントへのアクセスなど、サーバーサイドリクエストフォージェリの脆弱性がないかソースコードを分析します。メタデータエンドポイントから認証情報やインスタンス設定が漏えいするクラウド環境では、SSRF は特に重大です。
サポートされるフラグ
フラグの仕様については、../../shared/schemas/flags.md を参照してください。このスキルはすべての共通フラグをサポートします。このスキルの主なフラグは次のとおりです。
--scopeは分析対象のファイルを指定します(デフォルト:changed)--depth standardはコードを読み、URL 取得の呼び出しにユーザー制御の入力が使われているかを確認します--depth deepはリクエストパラメーターから URL 取得の呼び出しまで、URL 入力のすべての変換を追跡します--severityは出力をフィルタリングします(クラウドメタデータへの SSRF はcritical、一般的な SSRF はhigh)
フレームワークのコンテキスト
カテゴリの詳しい説明、一般的な脆弱性、予防ガイダンスについては、../../shared/frameworks/owasp-top10-2021.md の A10:2021 - サーバーサイドリクエストフォージェリ(SSRF) セクションを参照してください。
対象となる主な CWE:
- CWE-918:サーバーサイドリクエストフォージェリ(SSRF)
- CWE-441:意図しないプロキシまたは仲介者
- CWE-601:信頼できないサイトへの URL リダイレクト(SSRF チェーンを可能にするオープンリダイレクト)
検出パターン
コードパターンの全カタログ、検索ヒューリスティック、言語別の例、誤検知に関するガイダンスについては、references/detection-patterns.md を参照してください。
ワークフロー
1. スコープの決定
フラグを解析し、../../shared/schemas/flags.md に従ってファイル一覧を解決します。
外部への HTTP リクエスト処理を含む可能性が高いファイルに絞り込みます。
- HTTP クライアントの使用(
**/http/**、**/client/**、**/fetch/**、**/request/**) - Webhook およびコールバックのハンドラー(
**/webhooks/**、**/callbacks/**) - プロキシおよびゲートウェイのコード(
**/proxy/**、**/gateway/**) - 統合モジュール(
**/integrations/**、**/connectors/**、**/services/**) - ファイルのインポートおよびアップロードのハンドラー(
**/upload/**、**/import/**) - URL プレビューまたはアンファーリングのコード(
**/preview/**、**/unfurl/**、**/embed/**) - PDF 生成およびスクリーンショットサービス(
**/pdf/**、**/screenshot/**、**/render/**)
2. 利用可能なスキャナーの確認
../../shared/schemas/scanners.md に従ってスキャナーを検出します。
semgrep-- SSRF パターンを検出する主なスキャナー(URL フローの汚染解析)bandit-- Python 固有のリクエストパターンgosec-- Go の HTTP クライアントパターン
利用可能なスキャナーと不足しているスキャナーを記録します。
3. スキャナーの実行(利用可能な場合)
semgrep が利用可能な場合、SSRF を対象とするルールを指定して実行します。
semgrep scan --config auto --json --quiet <target>
SSRF、URL 取得、リクエストフォージェリのパターンに一致するルールに結果を絞り込みます。 出力を検出結果スキーマに正規化します。
4. Claude Code による分析
スキャナーを利用できるかどうかにかかわらず、手動でコードを分析してください。
- ユーザー入力由来の URL:HTTP クライアントの呼び出し(fetch、requests、http.get など)を見つけ、URL または URL の一部がユーザー入力(クエリパラメーター、リクエスト本文、ヘッダー、パスパラメーター)に由来するかどうかを追跡します。
- URL スキームの検証:URL スキームが
http://とhttps://のみに制限され、file://、gopher://、dict://、ftp://、その他の危険なスキームがブロックされていることを確認します。 - 内部 IP のブロック:リクエストを送信する前に、URL が内部/プライベート IP 範囲(127.0.0.0/8、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、169.254.0.0/16、0.0.0.0、::1、fd00::/8)に対して検証されていることを確認します。
- クラウドメタデータの保護:クラウドメタデータエンドポイント(169.254.169.254、metadata.google.internal、169.254.170.2)がブロックされていることと、AWS で IMDSv2 が強制されていることを確認します。
- リダイレクトの処理:リダイレクトを無効にするか、各ホップで検証し、リダイレクトを利用した SSRF の回避を防いでいることを確認します。
- DNS リバインディング:DNS の名前解決と接続がアトミックに行われるか、検証時にはホスト名が安全な IP に解決されても、実際のリクエスト時にはプライベート IP に解決される可能性のある TOCTOU の隙間がないか確認します。
--depth deep の場合は、さらに以下を追跡します。
- リクエストパラメーターから HTTP クライアントの呼び出しまでの完全なデータフロー
- 文字列連結、テンプレートレンダリング、URL ビルダー API を通じた URL の構築
- PDF 生成ツール、スクリーンショットサービス、SVG/XML プロセッサー、Webhook URL を介した間接的な SSRF
5. 検出結果の報告
SSRF プレフィックス(例:SSRF-001、SSRF-002)を使用し、../../shared/schemas/findings.md に従って出力を整形します。
各検出結果には以下を含めます。
- 重大度と確信度
- コードスニペットを含む正確なファイル位置
- SSRF のシナリオ(クラウドメタデータ、内部スキャン、データ流出)に即した影響の説明
- 可能な場合は、差分を含む具体的な修正方法
- CWE および OWASP の参照情報
検出対象
以下は、サーバーサイドリクエストフォージェリに特有の、シグナルの強いパターンです。それぞれが references/detection-patterns.md の検出パターンに対応しています。
-
ユーザー入力由来の URL が HTTP クライアントに渡される — ユーザーが制御できる入力に由来する URL が、検証されずに HTTP リクエスト関数(fetch、requests.get、http.Get、HttpClient)に渡されている。
-
URL スキームのホワイトリストがない — URL の検証でスキームが http/https に制限されておらず、file://、gopher://、その他の危険なプロトコルが許可されている。
-
内部 IP 範囲がブロックされていない — ユーザー指定の URL に対する外向きリクエストで、解決された IP がプライベート/予約済み範囲に該当するかを確認していないため、内部ネットワークのスキャンやサービスへのアクセスが可能になっている。
-
クラウドメタデータエンドポイントにアクセスできる — 169.254.169.254(AWS/Azure/GCP メタデータ)、metadata.google.internal、または 169.254.170.2(ECS タスクメタデータ)を特にブロックしておらず、クラウド環境からの認証情報窃取が可能になっている。
-
ユーザー指定 URL のリダイレクトを追跡する — ユーザー指定 URL を取得する際、HTTP クライアントがリダイレクトを追跡するよう設定されているため、許可されたドメインから内部の宛先へリダイレクトさせることで、攻撃者が URL 検証を回避できる。
-
DNS リバインディングの脆弱性 — URL の検証時に IP を確認するためにホスト名を名前解決する一方、実際の HTTP リクエストでも再度名前解決するため、TTL の短い DNS レコードが2回目の名前解決で異なる(内部)IP を返す可能性がある。
-
ドキュメント処理ツールを介した間接的な SSRF — PDF 生成ツール(wkhtmltopdf、Puppeteer)、SVG レンダラー、XML パーサー(XXE)、または Webhook 登録エンドポイントが、SSRF 対策なしに URL を取得する。
スキャナーの統合
| スキャナー | 対象範囲 | コマンド |
|---|---|---|
| semgrep | ユーザー入力からの URL、リクエスト呼び出しを通じた taint tracking | semgrep scan --config auto --json --quiet <target> |
| bandit | ユーザー入力を使った Python の requests/urllib | bandit -r <target> -f json -q |
| gosec | ユーザー入力を使った Go の net/http | gosec -fmt json ./... |
フォールバック(スキャナーがない場合):references/detection-patterns.md
のパターンを使用して Grep で検索し、HTTP クライアントの呼び出し、ユーザー入力からの URL 構築、バリデーションの欠如を特定します。
検出結果は confidence: medium として報告してください。
関連する semgrep ルールカテゴリ:
python.requests.security.ssrf.*python.urllib.security.audit.ssrf.*javascript.fetch.security.ssrf.*java.net.security.audit.ssrf.*go.net.security.audit.ssrf.*
出力形式
../../shared/schemas/findings.md の検出結果スキーマを使用してください。
- ID プレフィックス:
SSRF(例:SSRF-001) - metadata.tool:
ssrf - metadata.framework:
owasp - metadata.category:
A10 - references.owasp:
A10:2021 - references.stride:
I(情報開示)またはE(権限昇格)
このカテゴリの深刻度の目安:
- critical:クラウドメタデータエンドポイント(169.254.169.254)への SSRF、URL バリデーションのない未認証エンドポイント
- high:IP 範囲のブロックがない内部ネットワークへの SSRF、ユーザー指定 URL でリダイレクトが有効
- medium:部分的な URL バリデーション(スキームは確認するが IP は検証しない)、DNS リバインディングが可能
- low:外部ユーザーに公開されていない内部専用サービスの SSRF リスク、一部が制御可能な入力からの URL 構築