最終更新
リンドくん
田邉先生、「SSRF攻撃」って言葉を聞いたんですけど、これって何なんですか?SSRFって略語も難しそうで...
たなべ
SSRF攻撃はServer-Side Request Forgeryの略で、日本語では「サーバサイドリクエストフォージェリ」というんだ。
簡単に言うと、Webサーバを踏み台にして、本来アクセスできない場所にリクエストを送らせる攻撃なんだよ。
Webアプリケーションのセキュリティを学ぶ上で、SSRF攻撃は見逃せない重要な脅威の一つです。
最近では、AWSやAzureなどのクラウド環境での被害事例も増加しており、OWASP Top 10にも「Server-Side Request Forgery (SSRF)」として独立した項目で掲載されるようになりました。
この記事では、セキュリティ学習を始めたばかりの方でも理解できるよう、SSRF攻撃の仕組みから具体的な防御方法まで、実践的なコード例を交えながら詳しく解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
リンドくん
でも先生、普通のサーバってセキュリティ対策されてるんですよね?なんでそんな攻撃が成功しちゃうんですか?
たなべ
そこがSSRF攻撃の巧妙なところなんだ。
外部からは直接アクセスできない内部リソースでも、サーバ自身がリクエストする場合は「信頼された接続」として扱われることが多いんだよ。
SSRF攻撃は、Webアプリケーションの機能を悪用して、サーバから意図しないリクエストを発生させる攻撃手法です。
通常、Webサーバには以下のような特徴があります。
攻撃者はこの特性を利用して、本来アクセスできないはずの内部リソースにアクセスしようとします。
典型的なSSRF攻撃のシナリオを見てみましょう。
シナリオ 画像URLを指定できる機能の悪用
多くのWebアプリケーションには、「URLを指定して画像を表示する」機能があります。例えば、プロフィール画像をURL指定でアップロードできる機能などです。
このコードでは、ユーザーが指定したURLに対して何の検証もせずにリクエストを送っています。
攻撃者は以下のようなURLを指定できてしまいます。
この例では内部の管理画面とメタデータエンドポイントにアクセスしようとしています。
SSRF攻撃が成功すると、以下のような被害が発生する可能性があります。
特にクラウド環境では、メタデータエンドポイントから認証情報が取得できるため、深刻な被害につながることがあります。
リンドくん
攻撃者はどうやって内部のURLを知るんですか?
たなべ
よく使われるURLパターンや標準的な構成を予測して試すことが多いんだ。
例えばlocalhostや127.0.0.1、クラウドのメタデータエンドポイントなんかは定番だね。
SSRF攻撃には、いくつかの典型的なパターンがあります。
AWSの場合、以下のようなエンドポイントが狙われます。
これらのエンドポイントから、一時的なアクセスキーやIAMロールの認証情報が取得できてしまいます。
攻撃者はHTTP/HTTPS以外のプロトコルを使用することもあります。
攻撃者は、基本的なフィルタリングを回避するために、さまざまなテクニックを使用します。
これらの手法により、単純なブラックリスト方式のフィルタリングは簡単に突破されてしまいます。
Node.jsで書かれた脆弱なコードと、それを利用した攻撃の流れを見てみましょう。
攻撃者はこのエンドポイントを以下のように悪用できます。
このように、ユーザー入力を適切に検証せずに外部リクエストを行う機能は、SSRF攻撃の入り口になってしまうのです。
リンドくん
じゃあ、どうやって防げばいいんですか?URLをチェックすればいいんですよね?
たなべ
そうだね、でも単純なチェックだけじゃ不十分なんだ。多層防御の考え方で、複数の対策を組み合わせることが重要なんだよ。具体的に見ていこうか。
最も基本的で効果的な対策は、許可するドメインやIPアドレスをホワイトリストで管理することです。
内部ネットワークやローカルホストへのアクセスを明示的に禁止します。
アプリケーションレベルの対策に加えて、ネットワーク構成での防御も重要です。
HTTPリダイレクトを悪用した攻撃を防ぐため、リダイレクトを制限します。
クラウド環境では、メタデータエンドポイントへのアクセスを制限する追加の対策が必要です。
Webアプリケーションの実行ユーザーには、必要最小限の権限のみを付与します。
これらの対策を組み合わせることで、多層防御を実現し、SSRF攻撃のリスクを大幅に低減できます。
リンドくん
なるほど!SSRF攻撃って、単純に見えて実は奥が深いんですね。
たなべ
その通り!セキュリティは常に攻撃者の視点で考えることが大切なんだ。
ユーザー入力を信頼せず、複数の防御層を設けることで、安全なアプリケーションを作れるようになるよ。
今回は、SSRF攻撃の仕組みから具体的な防御テクニックまで、初心者の方でも実践できる内容を中心に解説してきました。
最後に、重要なポイントを整理しておきましょう。
セキュリティは一朝一夕で身につくものではありませんが、基本を理解し、実践を積み重ねることで確実にスキルアップできます。
この記事で学んだ内容を、ぜひご自身のプロジェクトに適用してみてください。
セキュリティは、すべての開発者が意識すべき重要なスキルです。
SSRF攻撃の防御を通じて、セキュアな設計とコーディングの基礎を身につけ、信頼されるエンジニアへと成長していきましょう!