एक्सएमएल एक्सटर्नल एंटिटी इंजेक्शन (XXE)

OWASP कैटगरी: MASVS-CODE: कोड की क्वालिटी

खास जानकारी

एक्सएमएल eXternal Entity इंजेक्शन (XXE), उन ऐप्लिकेशन पर किया जाने वाला हमला है जो एक्सएमएल इनपुट को पार्स करते हैं. XXE हमला तब होता है, जब किसी बाहरी इकाई के रेफ़रंस वाला ऐसा एक्सएमएल इनपुट प्रोसेस किया जाता है जिस पर भरोसा नहीं किया जा सकता. ऐसा तब होता है, जब एक्सएमएल पार्सर को सही तरीके से कॉन्फ़िगर नहीं किया गया हो. इस हमले का इस्तेमाल, कई तरह की घटनाओं को अंजाम देने के लिए किया जा सकता है. जैसे, सेवा से इनकार करना, फ़ाइल सिस्टम का ऐक्सेस पाना या डेटा को चुराना.

असर

जब कोई ऐप्लिकेशन किसी एक्सएमएल दस्तावेज़ को पार्स करता है, तो वह दस्तावेज़ में मौजूद किसी भी डीटीडी (दस्तावेज़ टाइप की परिभाषाएं, जिन्हें बाहरी इकाइयां भी कहा जाता है) को प्रोसेस कर सकता है. कोई हमलावर, डीटीडी के तौर पर नुकसान पहुंचाने वाला कोड इंजेक्ट करके इस गड़बड़ी का गलत इस्तेमाल कर सकता है. इसके बाद, यह कोड डिवाइस के फ़ाइल सिस्टम के उन हिस्सों को ऐक्सेस कर सकता है जिन्हें सिर्फ़ ऐप्लिकेशन ऐक्सेस कर सकता है. इनमें संवेदनशील डेटा भी शामिल हो सकता है. इसके अलावा, यह नुकसान पहुंचाने वाला कोड डिवाइस से अनुरोध कर सकता है. इससे सुरक्षा के दायरे को संभावित रूप से बायपास किया जा सकता है.

आखिर में, अगर ऐप्लिकेशन डीटीडी को बड़ा करता है, तो इससे ऐसी स्थिति पैदा हो सकती है जिसमें रेफ़र की गई इकाइयों के कई वर्शन मौजूद हों. इससे डिवाइस के संसाधन खत्म हो जाते हैं और सेवा से इनकार कर दिया जाता है.

जोखिम कम करने के तरीके

डीटीडी बंद करना

XXE को रोकने का सबसे सुरक्षित तरीका यह है कि डीटीडी (बाहरी इकाइयां) को हमेशा पूरी तरह से बंद कर दिया जाए. इस्तेमाल किए जा रहे पार्सर के आधार पर, यह तरीका XML Pull Parser लाइब्रेरी के लिए यहां दिए गए उदाहरण जैसा हो सकता है:

Java

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

Kotlin

val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)

डीटीडी बंद करने से, पार्सर को डिनायल ऑफ़ सर्विस अटैक से सुरक्षित रखने में भी मदद मिलती है. अगर डीटीडी को पूरी तरह से बंद नहीं किया जा सकता, तो बाहरी इकाइयों और बाहरी दस्तावेज़ टाइप के एलान को इस तरह से बंद किया जाना चाहिए कि यह हर पार्सर के लिए खास हो.

बाज़ार में कई तरह के एक्सएमएल पार्सिंग इंजन उपलब्ध हैं. इसलिए, XXE हमलों को रोकने के तरीके, इंजन के हिसाब से अलग-अलग होते हैं. ज़्यादा जानकारी के लिए, आपको अपने इंजन के दस्तावेज़ देखने पड़ सकते हैं.

इनपुट सैनिटाइज़ेशन करना

ऐप्लिकेशन को फिर से कॉन्फ़िगर किया जाना चाहिए, ताकि वह उपयोगकर्ताओं को XML दस्तावेज़ के प्रीऐम्बल में कोई भी कोड इंजेक्ट करने की अनुमति न दे. इसकी पुष्टि सर्वर-साइड पर होनी चाहिए, क्योंकि क्लाइंट-साइड कंट्रोल को बायपास किया जा सकता है.

किसी दूसरी लाइब्रेरी का इस्तेमाल करना

अगर इस्तेमाल की गई लाइब्रेरी या तरीके को सुरक्षित तरीके से कॉन्फ़िगर नहीं किया जा सकता, तो किसी दूसरे तरीके का इस्तेमाल किया जाना चाहिए. XML पुल पार्सर और SAX पार्सर, दोनों को सुरक्षित तरीके से कॉन्फ़िगर किया जा सकता है. इससे डीटीडी और इकाइयों को अनुमति नहीं मिलती.

संसाधन