XML外部実体攻撃【XXE攻撃】XML External Entity attack
概要

XMLには「実体」(entity)と呼ばれる、特定の文字列を別の内容に置換する仕組みがある。文書冒頭のDOCTYPE定義内でENTITY要素を記述することで実体を定義でき、その場で文字列を指定する内部実体のほかに、指定したURIの内容を読み込んで置換する外部実体がある。
攻撃者は細工したXMLをアプリケーションへ送信し、外部実体としてサーバ内のファイルなどを指定する。パーサがこれを処理すると、アプリケーションの権限でファイルの中身が実体として展開され、応答やエラーメッセージなどを通じて攻撃者へ漏洩する恐れがある。パスワードファイルや設定ファイルが標的になりやすい。
外部実体にHTTPなどのURLを指定すれば、サーバ自身から攻撃者が指定した宛先や内部ネットワークの機器へ通信させることも可能である。これは内部ネットワークへのアクセスを誘発するSSRF(サーバサイドリクエストフォージェリ)につながる場合がある。さらに、外部実体や実体の再帰的な展開を大量に発生させ、CPUやメモリなどの資源を消費させてサービスを停止に追い込むDoS攻撃も可能である。
このような攻撃が成立するのは、XMLパーサの初期設定で外部実体の読み込みが許可されている場合が多いためである。近年のプログラミング言語やライブラリでは既定で外部実体の処理を無効化する仕様への移行が進んでいるが、古い開発環境をそのまま運用していたり、明示的に読み込みを許可する設定を残していたりするシステムでは依然として脅威となる。MITREによる脆弱性の分類では「CWE-611」として管理され、OWASPでは「セキュリティ設定不備」という分類に含まれる。危険度の高い脆弱性の一つに位置づけられている。
対策としては、信頼できないXMLを処理する際にDTD(文書型定義)そのものを無効化することが基本であり、それが難しい場合でも外部実体や外部DTDの読み込みを無効にする設定が推奨される。具体的な設定方法は使用するXMLパーサやプログラミング言語によって異なるため、利用するライブラリの安全な設定を個別に確認する必要がある。XMLを扱う必要性が薄い場合には、JSONなど他のデータ形式へ移行することも根本的な対策の一つとされる。