📄
概念 📚 software-design-concepts

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.1localhostをブラックリストに追加するが、::1(IPv6のloopback)・0.0.0.0127.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. 1. 📄アーキテクチャスタイル
  2. 2. 📄ドメインモデリング
  3. 3. 📄モジュール分割と依存管理
  4. 4. 📄データモデリング
  5. 5. 📄API設計
  6. 6. 📄整合性とトランザクション
  7. 7. 📄非同期処理(Queue/Event)
  8. 8. 📄キャッシング
  9. 9. 📄ユーザーリサーチ
  10. 10. 📄情報アーキテクチャ
  11. 11. 📄インタラクションデザイン
  12. 12. 📄UX原則とヒューリスティクス
  13. 13. 📄アクセシビリティ(UX観点)
  14. 14. 📄UXメトリクス
  15. 15. 📄スケーラビリティ
  16. 16. 📄可用性とレジリエンス
  17. 17. 📄オブザーバビリティ
  18. 18. 📄環境・インフラ設計
  19. 19. 📄データマイグレーション
  20. 20. 📄セキュリティ設計原則
  21. 21. 📄データ保護とマルチテナント
  22. 22. 📄LLMセキュリティ
  23. 23. 📄ビジュアルデザイン原則
  24. 24. 📄デザインシステム
  25. 25. 📄コンポーネント設計
  26. 26. 📄スタイリング
  27. 27. 📄状態管理
  28. 28. 📄フロントエンドパフォーマンス
  29. 29. 📄アクセシビリティ(実装観点)
  30. 30. 📄アニメーションとインタラクション
  31. 31. 📄設計原則
  32. 32. 📄デザインパターン(GoF)
  33. 33. 📄エンタープライズパターン
  34. 34. 📄クリーンコード
  35. 35. 📄リファクタリング
  36. 36. 📄型設計とコントラクト
  37. 37. 📄関数型プログラミング概念
  38. 38. 📄エラーハンドリング
  39. 39. 📄テスト戦略と哲学
  40. 40. 📄テスト種別(機能テスト)
  41. 41. 📄テスト種別(UI・ビジュアル)
  42. 42. 📄テスト種別(契約・境界)
  43. 43. 📄テスト種別(非機能テスト)
  44. 44. 📄テストダブル
  45. 45. 📄テスト設計技法
  46. 46. 📄並行処理・マルチスレッド
  47. 47. 📄パフォーマンス最適化
  48. 48. 📄ドキュメント管理
  49. 49. 📄バージョン管理と開発プロセス
  50. 50. 📄脅威モデリング
  51. 51. 📄通信保護(TLS)
  52. 52. 📄暗号化・機密情報管理
  53. 53. 📄認証・セッション管理
  54. 54. 📄認可・アクセス制御
  55. 55. 📄入力バリデーション
  56. 56. 📄インジェクション攻撃
  57. 57. 📄出力エンコーディング
  58. 58. 📄エラーハンドリング(セキュリティ観点)
  59. 59. 📄SSRF(サーバーサイドリクエストフォージェリ)
  60. 60. 📄依存関係管理
  61. 61. 📄設計・実装 参考書籍
  62. 62. 📄セキュリティ参考資料
  63. 63. 📄正規化(データベース正規化)