SSRF(サーバーサイドリクエストフォージェリ)
外部URLフェッチ機能を悪用した内部ネットワークアクセス攻撃のメカニズムと多層的防御策
SSRF(Server-Side Request Forgery)は、攻撃者がサーバーに任意のURLへHTTPリクエストを送信させることで、外部から直接アクセスできない内部ネットワークやクラウドメタデータへアクセスさせる攻撃である。Webhookやサムネイル生成・URLプレビュー・PDF生成など、外部URLを入力として受け取る機能はSSRFの潜在的な入り口となる。2021年のOWASP Top 10でSSRFが新たに独立カテゴリとして追加されたのは、クラウド環境での普及と深刻度の高まりを反映している。
クラウド環境でのSSRFは特に危険であり、AWS・GCP・Azureのクラウドインスタンスメタデータサービスエンドポイント(http://169.254.169.254/等)へのアクセスに成功した場合、IAMクレデンシャルが取得され、そのインスタンスに付与された権限でクラウドリソース全体が操作される可能性がある。AWSはIMDSv2(Instance Metadata Service version 2)でトークンベースの認証を導入し、単純なGETリクエストによるメタデータ取得を防止している。
DNSリバインディング(DNS Rebinding)は、SSRF対策として許可リストにドメイン名を使っている場合に、攻撃者が制御するDNSサーバーを使ってドメインの解決先をIPアドレス検証後に内部IPに切り替える回避技術である。SSRFへの多層的な防御として、アプリケーションレベルの許可リスト・DNSレベルでの内部IPブロック・ネットワークレベルのアウトバウンド制限を組み合わせることが推奨される。
コードレビューで着目するポイント
- ユーザー入力のURLに対してHTTPリクエストを発行する箇所に許可リストが設定されているか
- リクエスト前にDNS解決後のIPアドレスを検証し、プライベートIPレンジ(10.0.0.0/8・172.16.0.0/12・192.168.0.0/16・169.254.0.0/16等)へのアクセスを拒否しているか
- クラウド環境でIMDSv2が有効になっており、IMDSv1が無効化されているか
- アウトバウンドネットワークポリシーで不要な内部サービスへのアクセスがブロックされているか
- リダイレクトを追跡するHTTPクライアント設定で、リダイレクト先のURLも許可リストで検証されているか
- Webhookエンドポイントなどの機能でSSRFの可能性が設計段階で検討されているか
典型的なアンチパターン
URLの形式チェックのみ: https://で始まるURLであることだけを確認し、https://192.168.1.1/internal-apiのようなプライベートIPへのアクセスを許可してしまう実装。URLのスキームチェックだけでは不十分であり、DNS解決後のIPアドレスレベルでのフィルタリングが必要。
ブラックリストによるIPフィルタリング: 127.0.0.1とlocalhostをブラックリストに追加するが、::1(IPv6のloopback)・0.0.0.0・127.0.0.2(loopbackレンジ)などの回避パターンを網羅しきれない実装。ホワイトリストで許可する外部ドメイン・IPレンジを明示的に定義し、それ以外を拒否することが安全。
HTTPリダイレクト追跡の無制限許可: SSRF対策で入力URLを検証したが、HTTPクライアントがLocationヘッダーで内部IPアドレスへリダイレクトを自動追跡する設定のまま。リダイレクト追跡を無効化するか、各リダイレクト先のURLを再検証するロジックが必要。
参考リソース
- OWASP SSRF Prevention Cheat Sheet — SSRF対策の包括的な実装ガイド
- OWASP Top 10: A10 SSRF — SSRFの定義・攻撃例・防御策の概要
- AWS IMDSv2の有効化ガイド — AWSのインスタンスメタデータサービスv2設定ドキュメント
- ssrf.py / SSRFmap — SSRF脆弱性の発見・エクスプロイトツール(ペネトレーションテスト用)
- PortSwigger Web Security Academy: SSRF — 実際にSSRFを試せるインタラクティブな学習ラボ
- 1. 📄アーキテクチャスタイル
- 2. 📄ドメインモデリング
- 3. 📄モジュール分割と依存管理
- 4. 📄データモデリング
- 5. 📄API設計
- 6. 📄整合性とトランザクション
- 7. 📄非同期処理(Queue/Event)
- 8. 📄キャッシング
- 9. 📄ユーザーリサーチ
- 10. 📄情報アーキテクチャ
- 11. 📄インタラクションデザイン
- 12. 📄UX原則とヒューリスティクス
- 13. 📄アクセシビリティ(UX観点)
- 14. 📄UXメトリクス
- 15. 📄スケーラビリティ
- 16. 📄可用性とレジリエンス
- 17. 📄オブザーバビリティ
- 18. 📄環境・インフラ設計
- 19. 📄データマイグレーション
- 20. 📄セキュリティ設計原則
- 21. 📄データ保護とマルチテナント
- 22. 📄LLMセキュリティ
- 23. 📄ビジュアルデザイン原則
- 24. 📄デザインシステム
- 25. 📄コンポーネント設計
- 26. 📄スタイリング
- 27. 📄状態管理
- 28. 📄フロントエンドパフォーマンス
- 29. 📄アクセシビリティ(実装観点)
- 30. 📄アニメーションとインタラクション
- 31. 📄設計原則
- 32. 📄デザインパターン(GoF)
- 33. 📄エンタープライズパターン
- 34. 📄クリーンコード
- 35. 📄リファクタリング
- 36. 📄型設計とコントラクト
- 37. 📄関数型プログラミング概念
- 38. 📄エラーハンドリング
- 39. 📄テスト戦略と哲学
- 40. 📄テスト種別(機能テスト)
- 41. 📄テスト種別(UI・ビジュアル)
- 42. 📄テスト種別(契約・境界)
- 43. 📄テスト種別(非機能テスト)
- 44. 📄テストダブル
- 45. 📄テスト設計技法
- 46. 📄並行処理・マルチスレッド
- 47. 📄パフォーマンス最適化
- 48. 📄ドキュメント管理
- 49. 📄バージョン管理と開発プロセス
- 50. 📄脅威モデリング
- 51. 📄通信保護(TLS)
- 52. 📄暗号化・機密情報管理
- 53. 📄認証・セッション管理
- 54. 📄認可・アクセス制御
- 55. 📄入力バリデーション
- 56. 📄インジェクション攻撃
- 57. 📄出力エンコーディング
- 58. 📄エラーハンドリング(セキュリティ観点)
- 59. 📄SSRF(サーバーサイドリクエストフォージェリ)
- 60. 📄依存関係管理
- 61. 📄設計・実装 参考書籍
- 62. 📄セキュリティ参考資料
- 63. 📄正規化(データベース正規化)