flawopen.com/XML बाहरी entities (XXE)/Python XML parser सुरक्षा
क्या Python का xml.etree.ElementTree XXE से सुरक्षित है?
क्लासिक फ़ाइल-पढ़ने और नेटवर्क XXE के लिए Python के Expat-आधारित built-in parsers डिफ़ॉल्ट रूप से स्थानीय फ़ाइलें नहीं पढ़ते और नेटवर्क कनेक्शन नहीं खोलते। फिर भी हर XML उपयोग सुरक्षित नहीं है: Expat 2.7.2 से पुराने संस्करण entity विस्तार और लंबे token से DoS के जोखिम में हैं। lxml के defaults भी संस्करण के साथ बदलते हैं। Parser संस्करण तय कर विकल्प स्पष्ट करें या अविश्वसनीय XML के लिए defusedxml लें।
जोखिमपूर्ण — parser संस्करण और विकल्प exposure बदलते हैं
- XXE (CWE-611):
- Parser हमलावर-नियंत्रित XML की बाहरी entity खोलता है, जिससे स्थानीय फ़ाइल पढ़ना या सर्वर से अनुरोध संभव हो सकता है।
- Entity विस्तार DoS:
- nested या दोहराए गए संदर्भ विस्तार के समय अत्यधिक CPU या memory लेते हैं।
- Expat:
- Python के built-in XML modules का C parser; सक्रिय संस्करण
pyexpat.EXPAT_VERSIONसे जाँचें। - DTD:
- Document type declaration entities परिभाषित कर सकती है और parser सेटिंग के अनुसार बाहरी संसाधन माँग सकती है।
अविश्वसनीय XML parser तक पहुँचता है
अपलोड, SVG, SAML संदेश या integration payload भरोसे की सीमा पार कर XML API तक पहुँचता है।
Parser implementation और विकल्प व्यवहार तय करते हैं
Standard library Expat और lxml libxml2 उपयोग करता है। संस्करण, बाहरी resolution, विस्तार और flags से व्यवहार बदलता है।
Resolution या विस्तार प्रभाव डालता है
बाहरी resolution सक्रिय हो तो entity स्थानीय या दूरस्थ सामग्री माँग सकती है। असुरक्षित विस्तार और लंबे token संसाधन खत्म कर सकते हैं।
Process अधिकार प्रभाव सीमित करते हैं
फ़ाइल अधिकार और network egress XXE प्रभाव सीमित करते हैं; इनपुट सीमा, अपडेट parser, सुरक्षित flags और isolation exposure घटाते हैं।
Python की मौजूदा सुरक्षा सलाह है कि Expat डिफ़ॉल्ट रूप से स्थानीय फ़ाइलें या नेटवर्क नहीं खोलता। फिर भी 2.7.2 से पुराने संस्करण billion-laughs, quadratic-blowup, लंबे token या अत्यधिक memory उपयोग के जोखिम में हो सकते हैं। pyexpat.EXPAT_VERSION जाँचें, क्योंकि Python bundled या system Expat उपयोग कर सकता है। यह संस्करण-निर्भर संसाधन-समाप्ति जोखिम है, वर्तमान ElementTree द्वारा बाहरी entities खोलने का प्रमाण नहीं।
# Standard-library external access is off by default, # but old Expat builds have resource-exhaustion risks. import xml.etree.ElementTree as ET from xml.parsers import expat print(expat.EXPAT_VERSION) # inspect the runtime parser root = ET.fromstring(untrusted_xml) # lxml before 5.0 defaulted resolve_entities=True. # Explicit unsafe settings illustrate the risky boundary. from lxml import etree parser = etree.XMLParser(resolve_entities=True, load_dtd=True) root = etree.fromstring(untrusted_xml, parser)
from defusedxml.ElementTree import fromstring
# Reject DTD declarations when the format does not require them.
root = fromstring(untrusted_xml, forbid_dtd=True)
# If lxml is required, set its security options explicitly.
from lxml import etree
parser = etree.XMLParser(
resolve_entities=False,
no_network=True,
load_dtd=False,
huge_tree=False,
)
root = etree.fromstring(untrusted_xml, parser)
# Do not run XInclude on untrusted trees without a restricted loader.
तैनात parser के लिए सुरक्षित विकल्प चुनें
defusedxml.ElementTree entity घोषणाएँ और बाहरी संदर्भ डिफ़ॉल्ट रूप से रोकता है; format को DTD न चाहिए तो forbid_dtd=True भी दें। lxml में resolve_entities=False, load_dtd=False, no_network=True और huge_tree=False स्पष्ट रखें। मौजूदा संस्करण केवल internal entities resolve करते हैं; lxml 5.0 से पहले default resolution चालू था। सीमित loader के बिना अविश्वसनीय tree पर XInclude न चलाएँ। Parse से पहले input और decompressed आकार सीमित करें।
- ✓हर XML entry point और parser सूचीबद्ध करें: ElementTree/Expat, lxml/libxml2, SAX/DOM, SVG, SAML, archive import और बाद के XInclude चरण।
- ✓जहाँ उपलब्ध हो Expat 2.7.2 या नया वाला समर्थित Python लें;
pyexpat.EXPAT_VERSIONसे सक्रिय संस्करण सत्यापित करें। - ✓अविश्वसनीय XML के लिए
defusedxmlउपयोग करें; schema को DTD न चाहिए तोforbid_dtd=Trueदें। - ✓lxml उपयोग हो तो समर्थित संस्करण pin करें और entities, DTD loading, network तथा huge-tree स्पष्ट रूप से बंद करें; बदलते defaults पर निर्भर न रहें।
- ✓Compressed और decompressed आकार सीमित करें, ज़रूरत पर parsing isolate करें, और CI में harmless DTD/entity fixtures बाहरी request बिना जाँचें।
Parser defaults की version-aware समीक्षा क्यों करें
“Python XML” एक ही parser सेटअप नहीं है। Standard library Expat पर निर्भर है, जो build के अनुसार bundled या system library हो सकती है। lxml libxml2 का wrapper है और उसने 5.0 में entity default बदला; wrappers और explicit विकल्प व्यवहार बदलते हैं। Python, Expat, lxml और libxml2 संस्करण दर्ज करें और हर untrusted input call-site पर flags स्पष्ट रखें।
अक्सर पूछे जाने वाले प्रश्न
नहीं। Python के अनुसार Expat default में स्थानीय फ़ाइल या नेटवर्क नहीं खोलता। संस्करण जाँचें और XXE file-read को पुराने parser के resource exhaustion से अलग समझें।
सभी संस्करणों पर एक दावा न करें। मौजूदा XMLParser internal entities तक सीमित है, DTD नहीं लोड करता और network नहीं खोलता। lxml 5.0 में resolve_entities True से internal हुआ। विकल्प स्पष्ट करें और wrappers जाँचें।
नहीं। Entities और external references रोके जाते हैं, पर forbid_dtd False है। DTD की ज़रूरत न हो तो True दें।
नहीं। Compressed और decompressed आकार सीमित करें, parser अपडेट करें, huge_tree से बचें और unrestricted loader से अविश्वसनीय XInclude न चलाएँ।