説明
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の読み込み、ネットワークアクセスを無効にしたパーサーを使用します。