FlawOpen

flawopen.com/XML बाहरी entities (XXE)/Python XML parser सुरक्षा

क्या Python का xml.etree.ElementTree XXE से सुरक्षित है?

CWE-611: XML बाहरी entity संदर्भसंदर्भ पृष्ठ
संक्षिप्त उत्तर

क्लासिक फ़ाइल-पढ़ने और नेटवर्क 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 सेटिंग के अनुसार बाहरी संसाधन माँग सकती है।
चरण 1

अविश्वसनीय XML parser तक पहुँचता है

अपलोड, SVG, SAML संदेश या integration payload भरोसे की सीमा पार कर XML API तक पहुँचता है।

चरण 2

Parser implementation और विकल्प व्यवहार तय करते हैं

Standard library Expat और lxml libxml2 उपयोग करता है। संस्करण, बाहरी resolution, विस्तार और flags से व्यवहार बदलता है।

चरण 3

Resolution या विस्तार प्रभाव डालता है

बाहरी resolution सक्रिय हो तो entity स्थानीय या दूरस्थ सामग्री माँग सकती है। असुरक्षित विस्तार और लंबे token संसाधन खत्म कर सकते हैं।

चरण 4

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 खोलने का प्रमाण नहीं।

सुरक्षित — DTD और बाहरी संसाधन अस्वीकार करें
# 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)
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 आकार सीमित करें।

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 स्पष्ट रखें।

अक्सर पूछे जाने वाले प्रश्न

क्या ElementTree default में बाहरी entity से स्थानीय फ़ाइल पढ़ता है?

नहीं। Python के अनुसार Expat default में स्थानीय फ़ाइल या नेटवर्क नहीं खोलता। संस्करण जाँचें और XXE file-read को पुराने parser के resource exhaustion से अलग समझें।

क्या मौजूदा lxml default में असुरक्षित है?

सभी संस्करणों पर एक दावा न करें। मौजूदा XMLParser internal entities तक सीमित है, DTD नहीं लोड करता और network नहीं खोलता। lxml 5.0 में resolve_entities True से internal हुआ। विकल्प स्पष्ट करें और wrappers जाँचें।

क्या defusedxml default में हर DTD रोकता है?

नहीं। Entities और external references रोके जाते हैं, पर forbid_dtd False है। DTD की ज़रूरत न हो तो True दें।

क्या सुरक्षित parser हर XML resource risk हटाता है?

नहीं। Compressed और decompressed आकार सीमित करें, parser अपडेट करें, huge_tree से बचें और unrestricted loader से अविश्वसनीय XInclude न चलाएँ।

प्राथमिक स्रोत

यह भी देखें XML External Entity (XXE) इंजेक्शन (CWE-611): यह कैसे काम करता है और इससे कैसे बचें — flawopen.com क्या .NET XmlReader XXE से सुरक्षित है? Java XXE: क्या DocumentBuilderFactory सुरक्षित है?