何が起きるか
XXEは、攻撃者が送ったXMLをサーバーで解析するとき、文書内の外部実体の指定に従って、サーバーのファイルや内部URLまで読み込んでしまう問題です。外部実体は、XML内で名前を付けた値の内容を文書の外から取得する仕組みです。
説明用に、XML内でfileという名前の外部実体へサーバーの設定ファイルの場所を指定し、通常の項目へ&file;という参照を置く場合を考えます。解析器が外部実体を許すと、そのファイルをサーバーのOSユーザーの権限で開き、読んだ内容で参照を置き換えます。アプリが解析後の項目をHTTPレスポンスやエラーへ含めれば、攻撃者は返ってきた本文から設定情報を取得できます。ファイルを読める権限と内容が外へ返る経路が必要です。 定義は本文より前のDTDへ置き、本文の<value>&file;</value>のような項目から参照します。下の説明例では、example.txtにdemoと書いてあれば、解析後のvalueはdemoになります。
説明用の擬似コード(実際の製品コードではありません)
<!-- 説明用。example.txtの内容はdemoと仮定 -->
<!DOCTYPE report [
<!ENTITY file SYSTEM "file:///srv/example.txt">
]>
<report><value>&file;</value></report>正常ならどう動くか
XMLの項目を受け取るAPIなら、解析器は受信した文書内の文字や要素を読み、アプリへ項目の値を渡します。項目を読むだけの用途では、利用者のXMLが指定する外部ファイルやURLを取得する必要はありません。
DTDは実体などを定義できる部分です。用途に不要なら、DTDの処理、外部実体の解決、外部スキーマの取得を解析器で無効にし、XMLの作成者が指定した外部データを読み込まない状態で解析します。スキーマはXMLの構造を検証する定義で、ネットワークから自動取得させる必要があるかも別に判断します。
不備と攻撃が成立する流れ
攻撃者は、サーバー内のファイルや内部URLを参照する定義をXMLへ入れ、APIや文書アップロード機能へ送ります。サーバーの解析器が外部実体の解決を許していると、解析の途中で指定先を開き、その内容をXML内の値へ取り込みます。XMLの作成者が、サーバーの読み取り先を選べることが不備です。
アプリが取り込まれた値をAPIのHTTPレスポンスやエラーメッセージへ含めると、その内容が攻撃者の端末へ届きます。本文へ直接返さない場合でも、解析中に外部へ情報を送る経路や、内部APIの状態を変える通信が成立するか確認します。 たとえば解析器が外部DTDの定義から、読んだファイルの値を含むURLを作って取得できる構成なら、その値はHTTPリクエストのパスやクエリとして外部サーバーへ送られます。攻撃者がその受信を確認できれば、通常のAPI応答に含まれなくても内容を入手できます。全ての解析器で同じ展開が許されるわけではありません。内部APIの状態変更についても、URLへのアクセスだけで変更を保存するAPIがあることが条件です。
起こり得る被害と条件
ファイル取得の例では、解析器がアプリの設定ファイルを読み、その内容をエラーやHTTPレスポンスへ混ぜます。攻撃者は返された本文から設定内の接続情報などを入手します。解析器の実行ユーザーがファイルを読めることと、結果が外へ出る経路が必要です。
SSRFの例では、外部実体のURLを内部管理APIへ向け、サーバーからHTTPリクエストを送らせます。内部APIの利用者一覧が応答へ取り込まれ、その内容が攻撃者へ返れば、氏名などが漏えいするおそれがあります。設定変更の例では、指定URLへのアクセスだけで監査ログを無効にする内部APIがある構成なら、その変更が保存されるおそれがあります。解析器の許可するプロトコルと通信内容、内部の認証条件に依存します。
関連するXML展開の問題では、実体の展開で非常に大きなデータを作り、CPUやメモリを消費させる場合があります。解析プロセスが他の処理を受け付けなくなることが被害です。この資源枯渇は外部ファイルの取得とは別の機能・制限も確認する必要があります。 文書内に短い値aを定義し、bをa十個の参照、cをb十個の参照とすると、cの展開結果はa百個分になります。前の定義を何重にも参照する入力を展開すると、入力文書が小さくても生成するデータ量が急増します。
防ぎ方と、防げる理由
実際に使うXML解析器の設定で、用途に不要なDTD・外部実体・外部スキーマ取得を無効にします。解析中に任意のファイルやURLを開く処理を止めるため、外部参照を書いたXMLが届いてもその参照先を読みません。必要な参照だけは、サーバーが管理する固定のローカル定義へ対応付け、利用者が自由なパスやURLを選べないようにします。
外部通信を止めても、文書内の実体を繰り返し展開して巨大なデータを作る構成は別途確認します。展開量・メモリ・処理時間を制限すると、一つのXMLの解析がプロセスを占有し続ける被害を制限できます。解析器を呼ぶラッパーが設定を変更する場合もあるため、初期化から実際の解析までを確認します。
よくある誤解
.xmlファイルだけを調べればよいわけではありません。SVG、SOAP、文書ファイル内のXML、変換ライブラリにも解析器が含まれます。拡張子や外側の形式だけでは外部参照の有無を判断できません。
実装の確認点
XMLを処理するライブラリと初期化設定を列挙し、外部参照やURL取得をする設定を確認します。安全な既定値がラッパーで変わっていないか、参照が拒否されることを専用のテスト環境で調べます。
出典・確認範囲
- [1] Web Security Academy: XML外部実体参照(XXE)PortSwigger / 確認日 2026-11-01
- [2] Finding and exploiting blind XXE vulnerabilitiesPortSwigger / 確認日 2026-11-01