概要
**XXE(XML External Entity:XML外部実体参照)**はXMLパーサの機能を悪用してサーバ内部のファイルを読み取ったり、SSRF を引き起こす攻撃です。**SSRF(Server-Side Request Forgery:サーバサイドリクエスト偽造)**はサーバを踏み台として内部ネットワークやクラウドメタデータサービスへ不正アクセスする攻撃です。いずれも OWASP Top 10 の常連であり、SC試験でも近年出題が増えています。
XXE(XML外部実体参照)
仕組み
XMLには外部ファイルやURLを参照する「外部実体」機能があります。この機能を悪用します。
<!-- 攻撃者が送付するXML -->
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<request>
<data>&xxe;</data>
</request>
サーバが外部実体を展開すると /etc/passwd の内容が <data> に埋め込まれて返されます。
XXEで可能な攻撃
| 攻撃種別 | 内容 |
|---|---|
| ファイル読み取り | /etc/passwd・設定ファイル・AWS認証情報など |
| SSRF | SYSTEM "http://169.254.169.254/" で内部サービスに到達 |
| DoS(Billion Laughs) | 再帰的実体参照でメモリを枯渇させる |
| ポートスキャン | 内部ネットワークのポート開放状況を確認 |
XXEの対策
| 対策 | 説明 |
|---|---|
| 外部実体を無効化 | XMLパーサの設定で外部実体参照を禁止(最重要) |
| JSON を使用 | XML の代わりに JSON を使うことで根本回避 |
| ホワイトリスト検証 | 許可するXMLスキーマを事前定義 |
| WAFによる遮断 | XXEパターンのリクエストを検出・ブロック |
SSRF(サーバサイドリクエスト偽造)
仕組み
アプリケーションが外部URLを取得する機能を悪用し、攻撃者がサーバに内部向けリクエストを発行させます。
攻撃者 → アプリサーバ(https://example.com/fetch?url=...)
↓
内部ネットワーク・クラウドメタデータサービスへのアクセス
クラウド環境でのSSRF(最重要)
クラウドのインスタンスメタデータサービス(IMDS)は内部IPからのみアクセス可能です。SSRFでこれにアクセスされると、IAM ロールの認証情報が漏洩します。
| クラウド | メタデータエンドポイント | 取得できるもの |
|---|---|---|
| AWS | http://169.254.169.254/latest/meta-data/ | IAMロール一時認証情報 |
| GCP | http://metadata.google.internal/ | サービスアカウントトークン |
| Azure | http://169.254.169.254/metadata/ | マネージドID認証情報 |
**Capital One事件(2019年)**はSSRFによりAWS IAM認証情報が漏洩し、1億件超の個人情報が流出した代表的事例です。
SSRFの対策
| 対策 | 説明 |
|---|---|
| URL検証のホワイトリスト化 | アクセス許可するドメイン・IPを限定 |
| IMDSv2の使用(AWS) | セッション指向のメタデータAPIでSSRF対策 |
| プライベートIPへのアクセス禁止 | RFC1918アドレスへのリクエストをブロック |
| DNSリバインディング対策 | DNS解決後のIPも検証する |
| ネットワーク分離 | アプリサーバから内部ネットワークへの通信を制限 |
ブラインドSSRFとOOB検査
レスポンスが直接返ってこない「ブラインドSSRF」では、攻撃者が制御するサーバへのリクエストを確認する帯域外(OOB:Out-of-Band)技法で脆弱性を検証します。
SC試験での頻出ポイント
- XXEを防ぐ最重要対策:XMLパーサで外部実体参照を無効化すること
- SSRFがクラウドで特に危険な理由:インスタンスメタデータサービス経由でIAM認証情報が取得できる
- XXEとSSRFの関係:XXEの
SYSTEMURLをhttp://に向けることでSSRFを引き起こせる - IMDSv2(AWS)の目的:SSRFによるメタデータ漏洩を防ぐセッション指向API
- OWASPでの位置付け:SSRF は OWASP Top 10 2021 の A10(新規追加)
よくある誤問・ひっかけパターン
誤り① 「XXEはSQLインジェクションの一種」→ 誤。SQLインジェクションはDBに対する攻撃ですが、XXEはXMLパーサの機能悪用です。
誤り② 「SSRFはファイアウォールで防げる」→ 不完全。外部ファイアウォールはSSRFを防げません。アプリ内でのURL検証とネットワーク分離が必要です。
誤り③ 「JSONを使えばXXEは発生しない」→ 正しい(JSONはXML外部実体参照機能を持たない)。これは根本的な対策として有効です。
関連用語
- SQLインジェクション — インジェクション攻撃の代表例
- XSS(クロスサイトスクリプティング) — Webアプリの別の重要脆弱性
- APIセキュリティ — REST APIのSSRF対策
重要キーワード
| 用語 | 説明 |
|---|---|
| XXE | XMLの外部実体参照機能を悪用してファイル読み取りやSSRFを行う攻撃 |
| SSRF | サーバを踏み台として内部ネットワークに不正アクセスする攻撃 |
| インスタンスメタデータサービス | クラウドVMが自身の設定・認証情報を取得するための内部HTTP API |
| IMDSv2 | AWS のSSRF対策メタデータAPI。セッショントークンが必要 |
| OOB(帯域外) | 攻撃結果を直接確認できない場合に外部サーバへの通信で脆弱性を検証する手法 |
| Billion Laughs | 再帰的XML実体参照によるXXEベースのDoS攻撃 |