【えっくすえっくすいー】

XXE(XML外部エンティティ攻撃) とは?

最終更新:
💡 XMLの外部参照を悪用して、サーバーに読ませる

信頼できないXMLの外部実体参照を処理させ、サーバー上のファイル読み取りや内部への通信などを引き起こす攻撃。外部参照を許すパーサーの設定や実装が問題になる。

📌 このページのポイント
XXE:外部参照をサーバーに処理させる 外部参照を許す設定の場合 不正なXML 送信者 XML パーサー ファイル 内部URL 送信 応答に内容が含まれる場合は漏えい 不要なDTD・外部参照を制限
赤の矢印は悪用された送信・外部参照と、内容が応答に含まれる場合の漏えい経路。参照できる範囲は権限や実装によるため、使用する処理経路ごとの制限を確認する。
ひよこ ひよこ
XXEってなに?XMLって関係あるの?
ペンギン先生 ペンギン先生
XMLの外部実体参照を悪用する攻撃だよ。信頼できないXMLをサーバーへ送り、そのXMLを読むパーサーに、文書の外のファイルやURLを参照させようとするんだ。外部参照が許可されているかどうかが重要だよ。
ひよこ ひよこ
外部実体ってどういう仕組みなの?
ペンギン先生 ペンギン先生
XMLでは、DTDという文書の定義の中で、外にあるデータの場所を示して名前を付け、その名前を文書内から参照できる。パーサーが外部参照を処理すると、外の内容を取り込む場合があるよ。名前を宣言しただけで、どの環境でもファイルが読めるわけではないんだ。
ひよこ ひよこ
サーバーのファイルなら何でも盗めるの?
ペンギン先生 ペンギン先生
読める範囲は、処理するプログラムの権限やパーサーの対応機能などによるよ。読み取った内容が応答に含まれる場合などには漏えいにつながる。一方、対応するURLを参照させれば、攻撃者が直接届かない内部の場所へサーバーから通信するSSRFになるおそれもあるんだ。
ひよこ ひよこ
XMLを使っているだけで危険なの?
ペンギン先生 ペンギン先生
XMLそのものを使うだけでXXEが起きるわけではないよ。パーサーの種類・バージョン・設定や、入力を誰が指定できるかによる。外部参照を許さない標準の設定の実装もあるけれど、使っている処理経路で何が有効かを確かめよう。
ひよこ ひよこ
どうやって直せばいいの?
ペンギン先生 ペンギン先生
不要ならDTDを禁止し、必要な場合も外部実体や外部DTDの読み込みを制限するのが基本だよ。XMLの構造の検証などの別の外部参照も確認する。Javaでも、一つのフラグを変えれば全部の処理が守られるとは限らない。実際に使うAPIの公式設定を適用し、設定が効かないまま処理を続けないことが大切なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「XXE」って出てきたら「XMLの外部参照を悪用し、サーバーにファイルやURLを読ませる攻撃」と思えばだいたいOK!
📖 おまけ:英語の意味
「XML External Entity」 = XML外部実体
💬 XMLのExternal Entity(外部実体)に由来する呼び名。XMLはExtensible Markup Languageの略称だよ

参考資料

← 用語集にもどる