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, (^^ゞ