lxml XMLParserの危険なオプション

信頼できないXMLを処理する際は、外部エンティティや不要なパーサー機能を無効にしてください。

説明

lxml.etree.XMLParserで外部エンティティの解決、DTDの読み込み、ネットワークアクセス、過大なツリーを許可すると、信頼できないXMLの処理時にXXE、SSRF、ローカルファイルの漏えい、メモリ枯渇につながるおそれがあります。

想定される影響

  • XMLの外部エンティティを通じて、ローカルファイルや内部ネットワークのリソースが漏えいする可能性があります。
  • DTDやネットワークリソースの読み込みがSSRFにつながる可能性があります。
  • huge_tree=Trueを使用すると、大きなXML入力でメモリが枯渇する可能性があります。

対処方法

  • resolve_entities=False、load_dtd=False、no_network=Trueを明示してください。
  • 必要がなければhuge_tree=Trueを使用しないでください。
  • 信頼できないXMLは、保護を強化したパーサー設定で処理してください。
  • 可能であれば、XMLの代わりにJSONなどの単純なデータ形式を検討してください。

例

変更前

python
from flask import request
from lxml import etree

def bad_parse():
    xml_body = request.get_data()
    parser = etree.XMLParser(resolve_entities=True, load_dtd=True)
    return etree.fromstring(xml_body, parser=parser)

変更後

python
from flask import request
from lxml import etree

def safe_parse():
    xml_body = request.get_data()
    parser = etree.XMLParser(resolve_entities=False, load_dtd=False, no_network=True)
    return etree.fromstring(xml_body, parser=parser)

説明:

  • 変更前: 外部エンティティとDTDの読み込みを許可したパーサーで、ユーザーのXMLを処理します。
  • 変更後: 外部エンティティ、DTDの読み込み、ネットワークアクセスを無効にしたパーサーを使用します。

参考資料