Webアプリケーション攻撃

XXE(XML外部エンティティ攻撃) えっくすえっくすいー

XML外部エンティティインジェクションSSRFパストラバーサルOWASP
XXEについて教えて

簡単に言うとこんな感じ!

XMLっていうデータ形式の「外部ファイルを読み込む機能」を悪用して、サーバーの中の秘密ファイルを盗み見る攻撃だよ!「ちょっとこのファイルも一緒に読んでね」って命令を忍び込ませる感じなんだ。


XXEとは

XXE(XML External Entity / XML外部エンティティ攻撃) とは、XMLデータを処理するアプリケーションの脆弱性を突いた攻撃手法です。XMLには「エンティティ」と呼ばれる変数のような仕組みがあり、外部ファイルやURLを参照できる「外部エンティティ」機能が悪用されます。

攻撃者は細工したXMLデータをサーバーに送りつけ、本来アクセスできないはずのサーバー内ファイル(パスワードファイルや設定ファイルなど)の内容を読み取ったり、内部ネットワークへの不正アクセス(SSRF)を引き起こしたりします。

OWASP Top 10(Webアプリの重大脆弱性ランキング)にも長年ランクインしており、2017年版では単独カテゴリとして4位に記載されるほど危険度が高い攻撃です。XMLを扱うAPIやファイルアップロード機能を持つシステムは特に注意が必要です。


XXEの仕組みと攻撃パターン

XMLの「エンティティ」は、文書内で繰り返し使う文字列を定義する仕組みです。問題は、外部エンティティ(External Entity) と呼ばれる機能で、ファイルパスやURLを指定して外部リソースを読み込めてしまう点にあります。

攻撃の仕組みを図で見てみよう

【通常のXML通信】
 攻撃者                  Webサーバー
   │                        │
   │  正常なXMLデータ送信    │
   │ ─────────────────────> │
   │                        │ → データを処理して返す
   │ <───────────────────── │
   │       正常な応答        │

【XXE攻撃】
 攻撃者                  Webサーバー          内部ファイル
   │                        │                /etc/passwd
   │  悪意あるXML送信        │                    │
   │  (外部エンティティ定義)  │                    │
   │ ─────────────────────> │                    │
   │                        │ ───読み込み───> │
   │                        │ <──ファイル内容── │
   │ <───────────────────── │
   │   ファイルの中身が返る! │

攻撃XMLの例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<userInput>
  <name>&xxe;</name>
</userInput>

上記のXMLでは &xxe; の部分がサーバー上の /etc/passwd(Linuxのユーザー情報ファイル)の内容に置き換えられて処理されてしまいます。

主な攻撃パターン

攻撃パターン概要危険度
ファイル読み取りサーバー内の設定ファイル・パスワードを盗む★★★★★
SSRF(内部ネットワーク探索)http:// スキームで内部システムへアクセス★★★★★
サービス妨害(Billion Laughs)エンティティを入れ子にしてメモリを枯渇させる★★★★☆
ブラインドXXE直接応答に出ないが外部サーバーへデータを送信★★★★☆
XXE to RCE特定環境でリモートコード実行につなげる★★★★★

語呂合わせで覚えよう

「X(エックス)なファイルを X(エックス)ックリ盗む E(イー)ッ!」XML Xternal Entity = 外部ファイルをこっそり盗む攻撃


歴史と背景

  • 1998年 — XML 1.0仕様がW3Cで策定。外部エンティティ機能はこの時点から仕様に含まれていた
  • 2002年頃 — XML-RPCやSOAP WebサービスのAPIが普及し、XML処理が広くWebに使われ始める
  • 2009年頃 — XMLパーサーの外部エンティティ処理によるセキュリティリスクが本格的に研究・報告され始める
  • 2012年 — OWASP Top 10にXXEの危険性が注目されるようになる
  • 2017年OWASP Top 10 2017でXXEが独立した4位の項目として掲載。業界全体での認知が高まる
  • 2018〜2019年 — Facebook、Apple、PayPalなどの大手サービスでもXXEの脆弱性が発見され、バグバウンティで多額の報奨金が支払われる
  • 2021年 — OWASP Top 10 2021では「セキュリティの設定ミス」カテゴリに統合されるも、依然として重大な脅威として扱われる
  • 現在REST APIでJSONが主流になったことで減少傾向にあるが、XML処理を行うレガシーシステムや帳票・EDI連携では依然リスクが高い

XXEが起きやすい場所と対策

狙われやすいシステム

XXEが発生しやすい場所 XMLを受け取るAPI SOAPベースのWebサービス XML-RPC API REST APIのXMLモード (古いシステムに多い) ファイルアップロード機能 SVGファイルのアップロード Officeファイル(docx等) XSD/XSLTファイル (画像として偽装も可能) 企業間連携システム EDI(電子データ交換) ERP・会計システム連携 XML形式の帳票受信 (B2B連携で見落としがち) 対策まとめ ✅ 対策1: 外部エンティティ処理を無効化する XMLパーサーの設定で「FEATURE_EXTERNAL_GENERAL_ENTITIES」を false に ✅ 対策2: 入力データのバリデーション DOCTYPE宣言を含むXMLを受け付けないようにフィルタリングする ✅ 対策3: JSON等の代替フォーマットへ移行 可能であればXMLをやめてJSONに変えることで根本的にリスクを排除

XXE vs 類似攻撃の比較

攻撃名狙うもの入口特徴
XXEXMLパーサーの外部エンティティ機能XMLデータを受け取るAPI・フォームファイル読み取り・SSRF
SQLインジェクションデータベースへの問い合わせテキスト入力フォームDBの不正操作
XSSブラウザ上のスクリプト実行テキスト入力フォームユーザーへの攻撃
SSRF内部ネットワークへのアクセスURLを処理する機能全般XXEの二次被害にも

発注者・管理者が確認すべきポイント

【システム発注・選定時のチェックリスト】

□ XMLを受け取る機能(APIやファイル取込)はあるか?
   → あれば開発会社にXXE対策を明示的に要件として盛り込む

□ SVGファイルや帳票のアップロード機能はあるか?
   → XXE対策を施したパーサーを使用しているか確認

□ 使用しているXMLパーサーのバージョンは最新か?
   → 古いパーサーはデフォルトで外部エンティティが有効な場合あり

□ WASPやセキュリティ診断(脆弱性診断)は実施しているか?
   → XXEは自動スキャンツールで検出可能な脆弱性

関連する規格・RFC

規格・番号内容
OWASP Top 10 2017 – A4XXEを独立カテゴリとして掲載。対策ガイドライン収録
OWASP Top 10 2021 – A05セキュリティの設定ミスに統合されたが引き続き言及
CWE-611XML External Entity Reference(共通脆弱性タイプ一覧での識別番号)
CVE(各パーサー固有)Java(Xerces)、Python(lxml)、PHPのSimpleXMLなど各パーサーのCVEが多数存在
W3C XML 1.0仕様外部エンティティ機能の元となった仕様。Section 4.2.2で定義

関連用語