CVE-2022-24125 और CVE-2022-24126 के लिए दस्तावेज़ीकरण और प्रूफ ऑफ कॉन्सेप्ट कोड।
डार्क सोल्स III के लिए 2022/08/25 को एक नया गेम अपडेट, 1.15.1 जारी किया गया है, साथ ही ऑनलाइन सेवाओं की बहाली भी की गई है। इस अपडेट ने CVE-2022-24125 और CVE-2022-24126 दोनों को ठीक किया, साथ ही गेम के P2P नेटवर्किंग में मौजूद अन्य संभावित सुरक्षा कमजोरियों (OOB reads/writes) की एक विस्तृत श्रृंखला को भी ठीक किया। इसके अलावा, अन्य खिलाड़ियों की सेव को भ्रष्ट करने की अनुमति देने वाले सभी ज्ञात शोषणों को ठीक कर दिया गया है। कई सामान्य छोटे-मोटे धोखे (जैसे "कर्स नाइफ") जो अक्सर ऑनलाइन मल्टीप्लेयर के दौरान सामने आ सकते थे, उन्हें भी पैच कर दिया गया है।
इस रिपॉजिटरी में FROM SOFTWARE गेम्स को प्रभावित करने वाले सबसे हालिया RCE शोषण, CVE-2022-24126 के लिए प्रूफ ऑफ कॉन्सेप्ट कोड और दस्तावेज़ीकरण शामिल है। हालांकि सैद्धांतिक रूप से अन्य गेम्स में संभव है, ध्यान डार्क सोल्स III पर है क्योंकि यह वह गेम है जिस पर मेरा शोध किया गया है। अब तक प्रूफ ऑफ कॉन्सेप्ट कोड केवल डार्क सोल्स III के लिए मौजूद है, इस कमजोरी की उपस्थिति की पुष्टि की गई है:
कमजोर कोड सेकिरो में भी मौजूद है (क्रेडिट: LukeYui), हालांकि इसे ट्रिगर करने का कोई तरीका नहीं है। डेमन्स सोल्स में उपस्थिति की पुष्टि नहीं हुई है लेकिन बहुत संभावना है। जबकि बंद नेटवर्क टेस्ट इससे प्रभावित था, एल्डन रिंग का रिलीज़ संस्करण प्रभावित नहीं है। वास्तव में, नेटवर्क क्रैश, आउट-ऑफ-बाउंड्स रीड्स/राइट्स और शोषणों की एक बड़ी सूची जो खिलाड़ियों को साथियों के गेम डेटा को संशोधित करने की अनुमति देती थी, जो डार्क सोल्स III में मौजूद थे, एल्डन रिंग में पैच कर दिए गए हैं। इस सूची को संकलित करने के लिए LukeYui और तुरंत कार्रवाई करने के लिए FROM SOFTWARE को बधाई! मुझे यह कहते हुए खुशी हो रही है कि एल्डन रिंग निस्संदेह हैकर्स जो नुकसान पहुंचा सकते हैं उसकी सीमा के मामले में सबसे सुरक्षित FROM SOFTWARE शीर्षक है।
आम धारणा के विपरीत, यह कोई पीयर-टू-पीयर नेटवर्किंग शोषण नहीं है। यह मैचमेकिंग सर्वर से संबंधित है और इसलिए बहुत अधिक गंभीर है, क्योंकि एक अन्य मैचमेकिंग सर्वर कमजोरी (CVE-2022-24125) के कारण असुरक्षित होने के लिए आपको किसी भी मल्टीप्लेयर गतिविधि में भाग लेने की आवश्यकता नहीं है।
सर्वर बंद होने से पहले के महीनों में लगभग 20,000 खिलाड़ियों के औसत समवर्ती खिलाड़ी आधार वाले गेम के साथ, यह स्पष्ट रूप से एक ऐसा मुद्दा था जिसे तत्काल ठीक करने की आवश्यकता थी, विशेष रूप से एल्डन रिंग में इसके होने की संभावना के साथ। चूंकि FROM SOFTWARE ने प्रूफ ऑफ कॉन्सेप्ट वीडियो और विस्तृत शोषण दस्तावेज़ीकरण (जिस पर इस रीडमी का एक बड़ा हिस्सा आधारित है) के साथ मेरी प्रारंभिक रिपोर्ट के 40 दिनों से अधिक समय बाद भी कार्रवाई नहीं की थी, मैंने डेवलपर्स द्वारा इसे संबोधित करने के लिए ध्यान आकर्षित करने की उम्मीद में सार्वजनिक रूप से एक सौम्य तरीके से शोषण के अस्तित्व को प्रदर्शित करने का फैसला किया, और यह काम कर गया।
NRSessionSearchResult मैचमेकिंग डेटा के पार्सिंग के दौरान स्टैक बफर और डेटा साइज़ फील्ड पर अनुचित बाउंड्स चेकिंग एक हमलावर को मनमाना कोड निष्पादित करने की अनुमति देती है। स्टैक ओवरफ्लो स्ट्रीम रीडर द्वारा आंतरिक रूप से उपयोग किए जाने वाले DLMemoryInputStream ऑब्जेक्ट के निचले दो बाइट्स vftable_ptr को ओवरराइट करने की अनुमति देता है, जिससे निष्पादन सावधानीपूर्वक चुने गए पड़ोसी कोड पर रीडायरेक्ट हो जाता है। DLMemoryInputStream ऑब्जेक्ट की संरचना और डेटा साइज़ फील्ड का चतुर शोषण तब मनमाना कोड रीडायरेक्शन प्राप्त करने की अनुमति देता है, जिसमें RCX हमारे पैकेट के पते की ओर इशारा करता है। वहां से, विभिन्न ऑफ़सेट वाले वर्चुअल कॉल के माध्यम से कोड रीडायरेक्शन की एक श्रृंखला (जो अब उन पतों पर कूद जाएगी जो हमने पैकेट बफर में लिखे थे) का उपयोग मनमाना कोड निष्पादन प्राप्त करने के लिए किया जा सकता है।
वितरण वेक्टर ही इस विशेष RCE को विशेष रूप से गंभीर बनाते हैं (पहले से ही RCE होने के अलावा)। शोषण NRSessionSearchResult जानकारी वाले मैचमेकिंग पुश अनुरोधों के माध्यम से प्रेषित होता है। इसका मतलब है कि हमलावर उन सभी को लक्षित कर सकता है जो उनके ऑनलाइन सत्र में शामिल होते हैं। विशेष रूप से, DS3 के लिए:
PushRequestSummonSign)PushRequestAllowBreakInTarget)PushRequestVisit)PushRequestAcceptQuickMatch)यह पहले से ही काफी बुरा है, लेकिन वास्तविक क्षमता RequestSendMessageToPlayers अनुरोध द्वारा अनलॉक की गई है:
message RequestSendMessageToPlayers {
repeated uint32 player_ids = 1;
required bytes push_message = 2;
}
होस्ट इस अनुरोध का उपयोग आक्रमणकारियों को सीधे PushRequestAllowBreakInTarget पुश संदेश भेजने के लिए करता है ताकि वे स्पॉन निर्देशांक प्राप्त कर सकें और अपने P2P सत्र में शामिल हो सकें। बस इतना ही। गेम द्वारा इस अनुरोध का उपयोग करने का यही एकमात्र तरीका है।
मैं इस बात पर पर्याप्त जोर नहीं दे सकता कि यह कितना भयानक रूप से असुरक्षित है। कोई भी खिलाड़ी मूल रूप से मैचमेकिंग सर्वर का रूप धारण कर सकता है। PushRequestVisit के माध्यम से शोषण भेजने के लिए इस अनुरोध का उपयोग करके, किसी भी ऑनलाइन खिलाड़ी को हमलावर द्वारा दूरस्थ रूप से लक्षित किया जा सकता है, जब तक उनका खिलाड़ी आईडी ज्ञात हो। हमलावर कई अनुरोध भेजकर, प्रत्येक में संभावित खिलाड़ी आईडी का एक बड़ा टुकड़ा शामिल करके, पूरे ऑनलाइन खिलाड़ी आधार को बहुत जल्दी शोषण भेज सकता है।
जबकि RCE हर गेम में बिल्कुल वैसा ही पोर्ट नहीं होता, शोषण का मुख्य विचार जो हमलावर को मनमाना कोड रीडायरेक्शन देता है वही है। यदि यह प्राप्त किया जा सकता है, तो बहुत संभावना है कि गेम-विशिष्ट वर्चुअल कॉल श्रृंखला या ROP श्रृंखला पाई जा सकती है। यह "पहला कदम" निम्नलिखित कमजोरियों का उपयोग करता है:
सत्र जुड़ने की जानकारी वाले मैचमेकिंग पुश अनुरोध उक्त जानकारी को एक कस्टम बाइनरी प्रारूप में संग्रहीत करते हैं जिसमें लंबाई-सीमांकित डेटा प्रविष्टियों की एक श्रृंखला होती है। प्रत्येक प्रविष्टि का निम्नलिखित प्रारूप है:
struct Entry
{
uint32_t type_or_id; // पक्का नहीं, लेकिन शायद एक प्रकार (निश्चित लंबाई = 2, चर लंबाई = 1 ?)
uint32_t size;
uint8_t data[size];
}
इन प्रविष्टियों के डेटा को कॉपी करने के लिए जिम्मेदार गेम फ़ंक्शन आँख बंद करके साइज़ फील्ड पर भरोसा करता है, जो एक आउट-ऑफ-बाउंड्स रीड बनाता है। एक दुर्भावनापूर्ण क्लाइंट साइज़ फील्ड को 0x7FFFFFFF जैसे मानों पर सेट करके इसका दुरुपयोग कर सकता है, जिससे मेमोरी आवंटन विफल हो जाता है और पीड़ित का गेम क्रैश हो जाता है। बाद में, यह साइज़ DLMemoryInputSteam के कंस्ट्रक्टर को भी पास किया जाता है, जो शोषण का एक सहायक हिस्सा है।