ガイドライン

セキュリティの設定ミス - XXE 詳細

XML eXternal Entities」(XXE)脆弱性クラスは、XMLパーサーに関わるセキュリティの誤設定である。 

XML標準には、ファイルやURLなどの「エンティティ」を参照する方法が含まれている。パーサーは外部エンティティを完全に解決することがデフォルトであることが多いため、XML文書が潜在的な攻撃者にファイルやその他の機密情報を開示する可能性があることを意味する。

簡単な例

外部エンティティを利用するXML文書の例を少し見てみよう:

xml
<?xml version="1.0" ?>
<!DOCTYPE outerElement [
   <!ENTITY externalEntity SYSTEM  "file:///etc/passwd" > ]>
<outerElement>&externalEntity;</outerElement>

まず、新しい「doctype」を宣言する。この「doctype」は、文書内に存在し、パーサーが扱うことのできる構造/要素の型を定義する。 

その中で、「externalEntity」というSYSTEMタイプのエンティティを指定する。このエンティティは、ファイル「/etc/passwd」を指す。 

doctype'の定義に続いて、実際のXMLデータを作成する。outerElement'を定義し、'externalEntity'エンティティへの参照('&'で示す)を追加する。 

この時点で、インタプリタはエンティティ定義を検索し、定義されたURLを解決して'&externalEntity;'の代わりに置く。

パース処理の最後には、次のような文書ができあがる:

xml
<?xml version="1.0" ?>
<outerElement>
    root:x:0:0:root:/root:/usr/bin/zsh
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    ....
</outerElement>

緩和

XXEから完全に保護する必要性と具体的な方法は、言語、フレームワーク、そしてそのバージョンに大きく依存する。 

それぞれの組み合わせは、HTTPパスではなく、ファイルの解決を防ぐパーサーのいくつかの側面を無効にすることを可能にすることが多い。あるいは、それ自体がサービス拒否の脆弱性につながる可能性のあるエンティティの拡張を許すかもしれません。 

.NET

.NET 4.5.1以下を使用している場合、以下のクラスはデフォルトで脆弱である:

  • XmlDocument (「xmlDocument.XmlResolver = null;」で無効化)
  • XmlTextReader (「xmlTextReader.ProhibitDtd = true;」で無効化)
  • XPathNavigator