
セキュリティ設定の不備 - XXEの詳細
「XML外部エンティティ」(XXE)脆弱性クラスは、XMLパーサーに関連するセキュリティ設定の誤りを指します。
XML規格には、ファイルやURLなどの「エンティティ」を参照する手段が含まれています。デフォルトでは、パーサーは外部エンティティを完全に解決します。これは、XML文書が攻撃者に対してファイルやその他の機密情報を漏洩させる可能性があることを意味します。
簡単な例
外部エンティティを使用するXMLドキュメントの例を見てみましょう:
xml
< ? version xml = « 1.0 » ? >
< ! Élément extérieur DOCTYPE [
< ! ENTITY ExternalEntity SYSTEM « file : ///etc/passwd » >] >
<outerElement>&Entité externe ;</outerElement>
まず最初に、新しい「doctype」を宣言します。これは、文書内に存在し、解析器によって処理される可能性のある構造/要素の種類を定義します。
ここでは「ExternalEntity」と呼ばれるシステムタイプのエンティティを指定します。このエンティティは'/etc/passwd'ファイルを指します。
「doctype」の定義に従い、実際のXMLデータが記述されます。まず「OuterElement」を定義し、次に「ExternalEntity」エンティティへの参照(「&」で示される)を追加します。
この段階では、インタプリタはエンティティの定義を検索し、定義されたURLを解決し、「&ExternalEntity;」を置換します。
分析プロセスの終了時、次のような文書が得られます:
xml
< ? version xml = « 1.0 » ? >
<outerElement>
root : x : 0:0 : root : /root : /usr/bin/zsh
démon : x : 1:1 : démon : /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 ;' で無効化)
- ナビゲーター XPath