SSRFでクラウド内部に侵入|メタデータエンドポイントの罠
サーバーに「代わりにURLを取得させる」機能は、ブログのリンクプレビーやSNSのOGP表示など、さまざまなサービスで使われています。しかしこの機能、URLの検証が生いと、外部には公開されていないはずの内部ネットワークやクラウドの管理用エンドポイントに、サーバー自身を「踏み台」として到達させてしまう危険があります。第2話では、この「SSRF(サーバーサイドリクエストフォージェリ)」という脆弱性クラスを使って、クラウドの内部メタデータサービスから認証情報を盗み出します。
📋 目次
🌐 SSRFとは何か|サーバーに「代理リクエスト」を送らせる
あなたの代わりに、サーバーがリクエストを送ってくれる
SSRF(Server-Side Request Forgery、サーバーサイドリクエストフォージェリ)は、攻撃者が指定したURLに対して、サーバー自身がリクエストを送ってしまう脆弱性です。たとえばチャットツールでURLを貼ると自動的にタイトルや画像が表示される「リンクプレビー」機能、画像を外部URLから取り込む「画像インポート」機能、PDF生成のために外部ページを読み込も機能など、「サーバーに代わりにURLへアクセスしてもらう」機能は驚くほど多くのサービスに存在します。
通常はこの機能で取得した内容を、ユーザーがそのまま受け取れるだけです。ところがサーバーが取得先のURLを十分に検証していないと、ユーザーは「外部のWebページ」だけでなく、「サーバー自身からしか到達できない内部ネットワークのアドレス」を指定できてしまいます。サーバーは内部ネットワークの一部として扱われているため、外部のファイアウォールでは防げない、内側からのアクセスが成立してしまうのです。
この話の前提知識
上級編第1話で扱った「信頼境界」という考え方をそのまま使います。今回の信頼境界は「サーバーが、ユーザーから渡されたURLをどこまで信じてアクセスしてよいか」です。
- 上級編 第1話「上級編へのレベルアップ|実務で使われる脆弱性とは」(信頼境界の考え方)
2019年に大手金融機関で発生し𰗱億人規模の顧客情報漏洩事件は、WAF(Web Application Firewall)の設定ミスを悪用したSSRFが起点でした。攻撃者はSSRFを使ってクラウドの内部メタデータサービスに到達し、そこから強い権限を持つ認証情報を盗み出し、最終的に大量のデータが保存されたストレージへのアクセス権を獲得しました。本話で体験する攻撃の流れは、この事件の構造を学習用に再現したものです。
☁️ クラウドのメタデータサービス|なぜ狙われるのか
サーバー自身に「パスワードを聴かずに」権限を渡す仕組み
クラウド環境(AWS𰾺zure・GCPなど)では、サーバー(インスタンス)が安全に認証情報を取得できるよう、特別な「メタデータサービス」という仕組みが用意されています。AWSではこれを「インスタンスメタデータサービス(IMDS)」と呼び、169.254.169.254という特別なアドレスにアクセスすると、そのサーバーに割り当てられた一時的なIAM認証情報を、パスワードなしで取得できます。
169.254.169.254は「リンクローカルアドレス」と呼ばれる特殊な範囲のIPで、インターネットからは到達できず、そのサーバー自身からしかアクセスできません。本来は「サーバー自身しかアクセスできない」という前提に守られた、安全な仕組みです。ところがSSRFを使うと、攻撃者は「サーバー自身になりすまして」このアドレスにアクセスさせることができてしまいます。
| 項目 | IMDSv1(旧版) | IMDSv2(新版) |
|---|---|---|
| アクセス方法 | GETリクエストだけで認証情報を取得可能 | 事前にPUTリクエストでセッショントークンを取得する必要がある |
| SSRFへの強さ | 弱い(GETだけで完結するSSRFで突破されやすい) | 強い(多くのSSRFはGETしか送れないため、PUTが必要な分だけ防御になる) |
| ホップ数制限 | なし | デフォルトでTTL=1(プロキグし越しのリクエストを拒否しやすい) |
| 現在の推奨 | 非推奨 | AWSが強く推奨 |
一時的な認証情報こそ危険
メタデータサービスが返す認証情報は、長期間有効な固定パスワードではなく、数時間で失効する一時的なものです。「すぐ失効するから安全」と思われがちですが、攻撃者はその数時間の間に必要な操作(データのダウンロード、設定の変更など)を実行できてしまうため、有効期限の短さは決定的な防御にはなりません。
🧩 ブロックリストの落とし泴|なぜ簡単に回避されるのか
「禁止リスト」は名前と数字の数だけ穴がある
SSRF対策としてよくあるのが、「169.254.169.254や127.0.0.1、localhostといった文字列が含まれていたらブロックする」というブロックリスト(denylist)方式です。一見もっともらしい対策ですが、IPアドレスには複数の「別の書き方」が存在するため、文字列の完全一致や単純な部分一致だけでは簡単に回避されてしまいます。
| 表現方法 | 例 |
|---|---|
| 10進数表記 | 169.254.169.254 → 2852039166�it整数) |
| 8進数表記 | 各オクテットを0始まりの8進数で記述 |
| 16進数表記 | 0xA9FEA9FEのように一文字列で表記 |
| IPv6マップ表記 | ::ffff:169.254.169.254 |
| リダイレクト経由 | 許可されたドメインから内部IPへの302リダイレクトを挑んだもの |
本話のチャレンジでは、このうち最も基本的な「10進数表記」を使ったバイパスを体験します。サーバーのブロックリストは169.254.169.254という文字列だけをチョックしているため、同じ宛先を指す2852039166という数字をブラウザやHTTPクライアントに渡すと、ブロックリストをすり抜けて本来の宛先に到達してしまいます。
「ブロックリストより許可リストを」
この問題の根本的な対策は、ブロックリストを増やし続けることではなく、「許可されたドメイン・許可されたIPアドレス範囲以外は、形式を問わず一律拒否する」という許可リスト(allowlist)方式に切り替えることです。実務のセキュリティ診断でも、ブロックリスト方式のSSRF対策を見つけた場合は「リストの不備」ではなく「方式そのものの脆弱性」として報告するのが一般的です。
🔓 実践チャレンジ:内部メタデータサービスから認証情報を盗み出せ
URLを2回変えるだけで、認証情報に到達する
架空のクラウドサービス「やさいクラウド」には、チャットのリンクプレビー機能を模した「URL先読みラボ」があります。URLを入力すると、サーバー(のふりをしたこのページ)が代わりにアクセスして、結果を表示します。ただし「内部アドレスとして有名な文字列」はブロックされます。
URLを入力して「取得」を押してください。
例:http://169.254.169.254/latest/meta-data/iam/security-credentials/ をそのまま試すとどうなるか確認してみましょう。
ステージ1をクリアすると、ステー𰮂が解放されます。両方クリアした時点でスコアが確定します。
📊 ステージ進捗: 0/2|挑戰回数: 0回
上のラボで、ブロックリストを回避してメタデータサービスののrole一覧を取得し、ROLE-〇〇〇〇〇形式で入力してください(例:ROLE-EXAMPLE)。
サーバーは169.254.169.254という文字列そのものを禁止リストでブロックしています。同じIPアドレスを表す別の書き方�進数表記など)を試してみましょう。
169.254.169.254を10進数の32bit整数に変換すると2852039166になります。http://2852039166/latest/meta-data/iam/security-credentials/を試してみてください。
上のラボで、発見したrole名をURLの末尾に追加してもう一度取得し、返ってきたJSONのSecretAccessKeyの値をそのまま下に入力してください。
実際のIMDSでも、role一覧のパスの末尾にrole名を追加すると、そのroleの認証情報そのものがJSONで返ってきます。
URLの形式はhttp://2852039166/latest/meta-data/iam/security-credentials/発見したrole名です。
🛡️ 防御側の視点|SSRFをどう防ぐか
一つの対策ではなく、層を重ねる
SSRFは「サーバーにリクエストを代行させる機能」自体をなくすことが難しいため、複数の対策を重ねる多層防御が基本です。
- 許可リスト方式:到達可能な宛先を明示的に絞る
- メタデータサービス側の対策:IMDSv2の強制(AWSではアカウント単位で設定可能)
- ネットワーク分離:サーバーから内部管理用ネットワークへの経路自体を制限する
- リダイレクトの検証:最初のURLだけでなく、リダイレクト先も毎回検証する
入力検証は「最初𰛡回」では終わらない
SSRF対策の難しさは、URLの検証を1回行えば終わりではない点にあります。DNS名は後から内部IPに変更できますし(DNSリバインディング)、リダイレクトは検証後に発生します。サーバー側で「最終的にどこへ接続したか」をネットワークレイヤーで都度確認する設計が、最も確実な対策とされています。
📝 まとめ+FAQ+次回予告
クラウドの堡を打ち抜いた
第2話では、SSRFという新しい脆弱性クラスを使って、ブロックリストの回避からクラウドメタデータサービスからの認証情報窃取まで一気に体験しました。次回はSSTI(テンプレートインジェクション)という、コード実行にもつながる脆弱性クラスを扱います。
・SSRFはサーバーに代わりにURLへのアクセスを送らせてしまう脆弱性
・クラウドのメタデータサービス(169.254.169.254)はIAM認証情報を返す重要な権限源
・文字列一致だけのブロックリストは10進数表記などの別表記で簡単に回避される
・防御は許可リスト方式+IMDSv2+ネットワーク分離の多層防御が基本
Q. 実際のWebサービスで、リンクプレビー機能だけで本当にSSRFが成立するのですか?
はい。SlackやDiscordのようなチャットツールの「URLを貼ると自動でカードが表示される」機能(リンクアンファール)は、過去に実際にSSRFの報告対象となった機能の典型例です。バグバウンティプログラムでもSSRFは上位の報酬対象として頻出します。
Q. クラウドを使っていない自前サーバーでもSSRFの被害はありますか?
あります。内部管理用ダッシュボードや社内API(認証不要で信頼されていることが多い)にサーバーから到達し、情報を取得したり設定を変更したりできる可能性があります。クラウド固有の問題ではなく、「サーバーからしか到達できない重要な仕組み」が存在する限り、どんな環境でもSSRFのリスクは残ります。
Q. IMDSv2を使っていればSSRFは完全に防げますか?
大幅に難しくなりますが、完全には防ぐわけではありません。攻撃者がPUTリクエストを任意のヘッダーとともに送れるSSRF(一部のHTTPリバース型など)を見つけられれば、IMDSv2でも突破される例が実際に報告されています。許可リスト方式との併用が推奨される理由です。
Q. スコアやURL検索の履歴はどこかに送信されますか?
送信されません。全英文字列(入力したURL)も含めて、すべてブラウザのlocalStorage(あなたの端末内)だけに保存され、外部のサーバーには一切送信されません。
SSTIでテンプレートエンジンを乗っ取る|{{7*7}}から始まるRCE
テンプレートエンジンの入力評価の仕組みと、コード実行に発展する経路を体験します。
📚 参考情報
- 𰃌TF上級編」第1話(信頼境界の考え方)
- OWASP Top 10(A10:2021 Server-Side Request Forgery)


コメント