XXE の対策
Web API に次のリクエストを送信したところ,応答のエラーメッセージに「商品 root:x:0:0:root:/root:/bin/bash(以下略)は存在しません」と表示された。この脆弱性への対策として,最も適切なものはどれか。
POST /api/order HTTP/1.1
Content-Type: application/xml
<?xml version="1.0"?>
<!DOCTYPE order [<!ENTITY x SYSTEM "file:///etc/passwd">]>
<order><item>&x;</item></order>- アXML パーサの設定で DTD の処理を無効にするか,外部実体の解決と外部 DTD の読込みを無効にする。
- イ実体参照の展開回数や展開後のサイズに上限を設け,上限を超えた XML 文書の解析を中止する。
- ウエラーメッセージに入力値を含めないようにして,応答から外部実体の内容を読み取れないようにする。
- エXML 文書から取り出した値を Web ページに出力する際に,HTML の特殊文字をエスケープする。
正解と解説を見る
正解 ア
この問題の基礎知識
- XML の DTD では実体(エンティティ)を定義でき,SYSTEM で URI を指定した外部実体は,そのファイルなどの内容を読み込んで,文書中の実体参照(&x; など)の位置に展開される。
- XXE(XML 外部実体攻撃)は,外部実体の展開を悪用してサーバ上のファイルを読み出させたり,サーバから内部の宛先にリクエストを送らせたりする攻撃であり,XML の解析時にサーバ上で起こる。
- Billion Laughs は,実体を入れ子に定義して大量に展開させ,メモリなどの資源を枯渇させるサービス妨害攻撃であり,XXE とは狙いも対策も異なる。
- 出力時の HTML エスケープは,ブラウザでの解釈によるクロスサイトスクリプティングを防ぐものであり,サーバでの XML の解析時に起こる問題には効かない。
アXML パーサの設定で DTD の処理を無効にするか,外部実体の解決と外部 DTD の読込みを無効にする。正解
DTD で定義した外部実体 x が展開され,/etc/passwd の内容がエラーメッセージに出力されている(XXE)。OWASP は,可能な限り DTD を無効にし,DTD が必要な場合は外部実体の解決と外部 DTD の読込みを無効にするよう推奨している。
イ実体参照の展開回数や展開後のサイズに上限を設け,上限を超えた XML 文書の解析を中止する。
展開の上限は,実体を入れ子に展開させて資源を枯渇させる Billion Laughs などのサービス妨害への対策である。この外部実体はファイルを 1 回読み込むだけなので,上限を設けてもファイルの読込みは防げない。
ウエラーメッセージに入力値を含めないようにして,応答から外部実体の内容を読み取れないようにする。
応答に表示されなくても外部実体は展開されており,外部 DTD やパラメタ実体を使ってファイルの内容を取り出す手口や,http の URI を指定した外部実体でサーバから内部の宛先にリクエストを送らせる手口が残る。
エXML 文書から取り出した値を Web ページに出力する際に,HTML の特殊文字をエスケープする。
出力時のエスケープはクロスサイトスクリプティングへの対策である。外部実体の展開は XML の解析時にサーバ上で行われ,ファイルの内容は既に読み込まれているので,出力時の処理では防げない。
検証用の出典出典照合済み
OWASP XML External Entity Prevention Cheat Sheet / OWASP XML Security Cheat Sheet / CWE-611 Improper Restriction of XML External Entity Reference照合の根拠(4 件)
- ア(正解): DTD の無効化,必要なら外部実体の解決と外部 DTD の読込みの無効化
Disable document type definitions (DTDs) whenever possible. Reject DOCTYPE declarations if the parser supports it. If your application needs DTDs, disable external entity resolution and external DTD loading, and limit entity expansion.
OWASP XML External Entity Prevention Cheat Sheet · General Guidance(新しいタブで開きます) - ウ(誤り): 外部実体の解決は応答への表示と無関係に SSRF などを起こし得る
This can expose local files, cause server-side request forgery (SSRF), or exhaust resources.
OWASP XML External Entity Prevention Cheat Sheet · Introduction(新しいタブで開きます) - ウ(誤り): 外部 DTD とパラメタ実体でファイルの内容を攻撃者のサーバに送らせる手口があり,エラーメッセージを抑えても防げない
The second DTD causes the system to send the contents of the file back to the attacker's server as a parameter of the URL.
OWASP XML Security Cheat Sheet · File Retrieval with Parameter Entities(新しいタブで開きます) - イ(誤り): 展開回数・サイズの上限は Billion Laughs のような資源枯渇への対策である
When an XML parser tries to resolve the external entities included within the following code, it will cause the application to start consuming all of the available memory until the process crashes.
OWASP XML Security Cheat Sheet · Billion Laughs(新しいタブで開きます)
リクエストの DTD で外部実体 x に file:///etc/passwd を指定し,item 要素で &x; を参照しているため,エラーメッセージに /etc/passwd の内容が出ている(XXE)。エは出力時の XSS 対策で,解析時に起きる読込みを防げないことは論理的に明らか。