FlawOpen

flawopen.com/XXE/Java XML parser सुरक्षा

Java XXE: क्या DocumentBuilderFactory डिफ़ॉल्ट रूप से सुरक्षित है?

CWE-611: Improper Restriction of XML External Entity ReferenceJava XML संदर्भ मार्गदर्शिका
संक्षिप्त उत्तर: बाहरी पहुँच डिफ़ॉल्ट रूप से बंद नहीं है

JDK कुछ सुरक्षित processing सीमाएँ डिफ़ॉल्ट रूप से चालू करता है, लेकिन DOM और SAX की डिफ़ॉल्ट सेटिंग बाहरी resources तक पहुँच नहीं रोकती। ऐप स्पष्ट रूप से प्रतिबंध न लगाए तो XML फ़ाइल या नेटवर्क अनुरोध करा सकता है। तीसरे पक्ष का JAXP provider भी व्यवहार बदल सकता है। वास्तव में उपयोग किए जा रहे parser को configure करें; केवल Java version देखकर सुरक्षा न मानें।

असुरक्षित
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newInstance();
DocumentBuilder builder =
    factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

// Java 9+: JAXP restrictions स्पष्ट रूप से चालू करें।
// आवश्यक setting उपलब्ध न हो तो सुरक्षित रूप से रुकें।
// Parser डिफ़ॉल्ट रूप से बाहरी पहुँच दे सकता है।
सुरक्षित सेटिंग
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newDefaultInstance();

// असली फ़ाइलों या सेवाओं से परीक्षण न करें।
factory.setFeature(
    XMLConstants.FEATURE_SECURE_PROCESSING, true);
factory.setFeature(
    "http://apache.org/xml/features/"
    + "disallow-doctype-decl", true);
factory.setAttribute(
    XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setXIncludeAware(false);

// आकार की सीमाएँ अलग से लागू करें।
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

DOCTYPE अस्वीकार करना DOM के लिए बेहतर नियंत्रण क्यों है

जहाँ parser समर्थन करे, DOCTYPE अस्वीकार करने से DTD में घोषित बाहरी entities और declarations संसाधित नहीं होते। FEATURE_SECURE_PROCESSING स्पष्ट रूप से चालू करें और अतिरिक्त सुरक्षा हेतु बाहरी DTD पहुँच रोकें; JDK में FSP डिफ़ॉल्ट रूप से चालू होने का अर्थ बाहरी कनेक्शन बंद होना नहीं है। आवश्यकता न हो तो XInclude बंद रखें। आवश्यक setting समर्थित न हो तो आंशिक सुरक्षा के साथ आगे न बढ़ें; parser initialization विफल करें।

यदि ऐप को DTD स्वीकार करना हो, तब भी बाहरी पहुँच न दें। बाहरी सामान्य और parameter entities तथा बाहरी DTD loading बंद करें; ACCESS_EXTERNAL_DTD को खाली string दें, processing limits रखें और XInclude बंद करें। setExpandEntityReferences(false) tree representation बदलता है; बाहरी resources रोकने का विकल्प नहीं है।

हर JAXP processor को अलग से सुरक्षित करें

यही नीति XML processing पर लागू होती है, पर API के अनुसार controls अलग हैं। SAXParserFactory/XMLReader, StAX XMLInputFactory, TransformerFactory, SchemaFactory, Validator और JAXB जाँचें। StAX FEATURE_SECURE_PROCESSING समर्थित नहीं करता; अपने properties से DTD और बाहरी entities बंद करें। बाहरी schemas और stylesheets भी सीमित करें। OWASP के API-विशिष्ट उदाहरण लें और सक्रिय provider सत्यापित करें।

एक parser की settings को पूरी JVM की सुरक्षा न मानें। JAXP provider lookup builtin parser की जगह अन्य implementation चुन सकता है और composite processor अपने parser बना सकता है। Production में उपयोग होने वाले runtime, provider और code path को ही जाँचें।

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

क्या FEATURE_SECURE_PROCESSING डिफ़ॉल्ट रूप से बाहरी entities रोकता है?

केवल डिफ़ॉल्ट रूप से चालू होने पर नहीं। Oracle के अनुसार default FSP processing limits लगाता है, लेकिन API से स्पष्ट रूप से enable करने या external-access properties सेट करने तक बाहरी connections की अनुमति रहती है। नीति स्पष्ट सेट करें और provider जाँचें।

क्या नए JDK ने defaults बदले हैं?

JDK releases में restrictions और limits बढ़े हैं, पर Oracle JAXP guide default FSP और बाहरी पहुँच रोकने के स्पष्ट निर्देश में अंतर करता है। third-party providers भी अलग हो सकते हैं। Version या classpath default पर निर्भर न रहें।

यदि वैध दस्तावेज़ को DTD चाहिए तो?

जहाँ संभव हो trusted local catalog या resolver चुनें। DTD आवश्यक हो तो external protocols और entity loading रोकें, JAXP limits रखें और आवश्यकता न हो तो XInclude बंद करें। यह DOCTYPE अस्वीकार करने से जटिल है; वास्तविक provider और वैध documents से परीक्षण करें।

स्रोत और संदर्भ

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