Shikata Ga Nai

Private? There is no such things.

XXE(XML外部実体インジェクション)脆弱性が発生する理由

Hello there, ('ω')ノ

🧠 なぜXXE脆弱性が発生するのか?

多くのWebアプリケーションは、データの送受信において XMLフォーマット を使用します。このとき、サーバー側でXMLを処理するために、一般的な標準ライブラリやフレームワークのAPIを使うのが一般的です。

🛑 問題の本質

これらの標準XMLパーサーは、XML仕様に定義されたすべての機能(外部エンティティやDTDなど)をデフォルトでサポートしています。たとえアプリケーション側で使っていないつもりでも、無効化していなければ脆弱になります。


📦 XXEが生まれる典型的な流れ

ステップ 内容
1️⃣ アプリがXMLデータを受け取るエンドポイントを持つ(例:ファイルアップロード、SOAP、SAML)
2️⃣ XMLデータがパーサーに渡される(開発者はただ「解析」させたいだけ)
3️⃣ パーサーが外部エンティティやDTDを自動的に解釈
4️⃣ 攻撃者が細工したエンティティにより、意図しないファイルアクセスや通信が発生
5️⃣ 結果がレスポンスやログなどに含まれて情報が漏洩する

📘 XML仕様の危険な機能とは?

機能 説明
<!DOCTYPE> DTDの宣言が可能。これにより外部エンティティ(<!ENTITY>)が使えるようになる
<!ENTITY> XML中に埋め込むことができる「変数」のような機能。外部ファイルやURL参照が可能
SYSTEM識別子 SYSTEM "file:///..." などを使ってファイルやリソースを参照できる

🛡️ 開発者が知らない間に“罠”が仕込まれる

  • 開発者は単にXMLを「解析」したいだけなのに、
  • ライブラリが「仕様通りにすべての機能を処理」してしまう。
  • 未使用機能まで有効になっている=攻撃面が拡大

✍️ 例:Javaでの危険なコード

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); // ← XXEを防がないまま使っている
Document doc = db.parse(inputStream);

このようなコードは、デフォルトで外部エンティティを読み込んでしまうため、脆弱です。


✅ まとめ

  • XXEは、XMLパーサーの“過剰な柔軟性”デフォルト設定の危うさから発生します。
  • 安全にXMLを使うには、使わない機能を明示的に無効化することが重要です。

💡「使っていない=安全」ではない。XXE対策では「使っていないなら確実に無効化する」姿勢が求められます。

Best regards, (^^ゞ