
Information and PoC about the ENLBufferPwn vulnerability
| CVE: | CVE-2022-47949 |
| CVSS v3.1: | 9.8/10 (गंभीर) |
| लेखक: | PabloMK7, Rambo6Glaz, Fishguy6564 |
| रिपोर्ट किया गया: | 8 अगस्त, 2021 (Mario Kart 7) 14 अप्रैल, 2022 (प्रभावित WiiU और Switch गेम्स के लिए) |
| खुलासा किया गया: | 22 दिसंबर, 2022 |
ENLBufferPwn Nintendo 3DS के बाद से कई प्रथम-पक्ष Nintendo गेम्स के सामान्य नेटवर्क कोड में एक भेद्यता है, जो एक हमलावर को केवल पीड़ित के साथ ऑनलाइन गेम खेलकर उनके कंसोल पर दूरस्थ रूप से कोड निष्पादित करने की अनुमति देती है (रिमोट कोड निष्पादन)। इसे 2021 के दौरान कई लोगों द्वारा स्वतंत्र रूप से खोजा गया था और 2021 और 2022 के दौरान Nintendo को रिपोर्ट किया गया था। प्रारंभिक रिपोर्ट के बाद से, Nintendo ने कई भेद्य गेम्स में इस भेद्यता को पैच किया है। इस रिपॉजिटरी में दी गई जानकारी Nintendo से अनुमति प्राप्त करने के बाद सुरक्षित रूप से सार्वजनिक की गई है।
इस भेद्यता ने CVSS 3.1 कैलकुलेटर में 9.8/10 (गंभीर) स्कोर किया है।
यहाँ उन गेम्स की सूची दी गई है जिनमें किसी समय यह भेद्यता मौजूद थी (सूचीबद्ध सभी Switch और 3DS गेम्स को भेद्यता को पैच करने वाले अपडेट मिल चुके हैं, इसलिए वे अब प्रभावित नहीं हैं):
ENLBufferPwn भेद्यता C++ क्लास NetworkBuffer में बफर ओवरफ्लो का शोषण करती है, जो नेटवर्क लाइब्रेरी enl (Mario Kart 7 में Net) में मौजूद है और कई प्रथम-पक्ष Nintendo गेम्स द्वारा उपयोग की जाती है। इस क्लास में दो विधियाँ Add और Set हैं जो अन्य खिलाड़ियों से आने वाले डेटा से नेटवर्क बफर को भरती हैं। हालाँकि, इनमें से कोई भी विधि यह जाँच नहीं करती है कि इनपुट डेटा वास्तव में नेटवर्क बफर में समाता है या नहीं। चूँकि इनपुट डेटा नियंत्रणीय है, हमलावर के साथ केवल ऑनलाइन गेम सत्र रखकर रिमोट कंसोल पर बफर ओवरफ्लो ट्रिगर किया जा सकता है। यदि सही तरीके से किया जाए, तो पीड़ित उपयोगकर्ता को यह पता भी नहीं चल सकता है कि उनके कंसोल में कोई भेद्यता ट्रिगर हुई थी। इस बफर ओवरफ्लो के परिणाम गेम के अनुसार अलग-अलग होते हैं, गेम की मेमोरी में साधारण हानिरहित संशोधनों (जैसे 3DS पर होम मेनू को बार-बार खोलना और बंद करना) से लेकर अधिक गंभीर क्रियाओं तक, जैसे कंसोल का पूर्ण नियंत्रण लेना, जैसा कि नीचे दिखाया गया है।
शेष रिपोर्ट Mario Kart 7 पर केंद्रित रहेगी, क्योंकि 3DS में सुरक्षा उपायों (उदाहरण के लिए, ASLR) की कमी के कारण, यह भेद्यता का सबसे गंभीर मामला है। हालाँकि, हमलावर को डेटा वापस भेजने के लिए उपयोग किए जाने वाले NetworkBuffer को हाईजैक करके (और उससे हीप और कोड के पॉइंटर्स लीक करवाकर) Switch गेम्स पर ASLR को बायपास करना संभव हो सकता है।
निम्नलिखित वीडियो Mario Kart 7 में भेद्यता के एक गंभीर मामले को प्रदर्शित करता है, जहाँ एक हमलावर द्वारा नियंत्रित कंसोल (बाईं ओर) एक अपरिवर्तित कंसोल (दाईं ओर) पर पूरी तरह से कब्ज़ा कर लेता है। उपयोगकर्ता द्वारा की गई एकमात्र इंटरैक्शन हमलावर के साथ ऑनलाइन गेम सत्र में शामिल होना है, इस मामले में, "communities" सुविधा का उपयोग करके (ध्यान दें कि भेद्यता को अलग-थलग तरीके से सुरक्षित रूप से परीक्षण करने और सार्वजनिक लॉबी में खेलने वाले अन्य उपयोगकर्ताओं को प्रभावित न करने के लिए एक "community" का उपयोग किया गया था)। कब्ज़ा एक ROP पेलोड को रिमोट कंसोल पर कॉपी करके और फिर उसे निष्पादित करके किया जाता है। यह ROP पेलोड फिर OS में अन्य भेद्यताओं का उपयोग करके विशेषाधिकार बढ़ाता है और पूर्ण नियंत्रण प्राप्त करता है। वीडियो में, रिमोट कंसोल को CFW इंस्टॉलर (SafeB9SInstaller) चलाने के लिए मजबूर किया जाता है। समान तकनीकों का उपयोग करके, सैद्धांतिक रूप से खाता/क्रेडिट कार्ड जानकारी चुराना या कंसोल के अंतर्निर्मित माइक/कैमरों का उपयोग करके अनधिकृत ऑडियो/वीडियो रिकॉर्डिंग करना संभव होगा।
जैसा कि पहले बताया गया है, यह भेद्यता क्लास NetworkBuffer की दो विधियों में एक चूक के कारण उत्पन्न होती है। यहाँ C++ में क्लास और विधियों का एक कार्यान्वयन है:
class NetworkBuffer
{
public:
u8 bufferType;
u8* dataPtr;
u32 dataSize;
u32 currentSize;
void Set(u8* newData, u32 newDataSize);
void Add(u8* newData, u32 newDataSize);
}
void NetworkBuffer::Set(u8* newData, u32 newDataSize)
{
memcpy(this->dataPtr, newData, newDataSize);
this->currentSize = newDataSize;
}
void NetworkBuffer::Add(u8* newData, u32 newDataSize)
{
memcpy(this->dataPtr + this->currentSize, newData, newDataSize);
this->currentSize += newDataSize;
}
जैसा कि आप देख सकते हैं, न तो Set और न ही Add यह जाँचता है कि आने वाला newDataSize बफर आकार (dataSize) में समाता है या नहीं। चूँकि यह NetworkBuffer क्लास खिलाड़ियों के बीच ऑनलाइन डेटा के आदान-प्रदान के लिए एक सामान्य कंटेनर के रूप में उपयोग की जाती है, newData की सामग्री और newDataSize का मान एक हमलावर द्वारा नियंत्रित किया जा सकता है, और बफर ओवरफ्लो किया जा सकता है।
नेटवर्क लाइब्रेरी का एक और विवरण यह है कि यह अतुल्यकालिक (asynchronous) है, ताकि जब डेटा बफर में भरा जा रहा हो, गेम अन्य ऑपरेशन कर सकें। इसे पूरा करने के लिए, डबल बफर तकनीक का उपयोग किया जाता है। इस तरह, गेम एक NetworkBuffer में पहले से प्राप्त डेटा को उसी समय एक्सेस कर सकता है जब नया डेटा प्राप्त हो रहा होता है। दूसरा NetworkBuffer भर जाने के बाद, बफर आपस में बदल दिए जाते हैं और चक्र दोहराया जाता है।
इस PoC के लिए, Mii डेटा (bufferType = 9) प्राप्त करने के लिए उपयोग किए जाने वाले डबल NetworkBuffer का शोषण किया जाएगा। हीप आवंटन के क्रम के कारण, ऐसा होता है कि NetworkBuffer ऑब्जेक्ट और उसकी सामग्री एक दूसरे के बगल में रखी जाती हैं। साथ ही, डबल बफर के दोनों बफर मेमोरी में सन्निहित होते हैं। निम्नलिखित आरेख दर्शाता है कि बफर आवंटन के बाद मेमोरी कैसी दिखती है:

अब से, छवि के शीर्ष पर स्थित बफर को Buffer0 के रूप में संदर्भित किया जाएगा, जबकि नीचे स्थित बफर Buffer1 होगा। इस जानकारी का उपयोग करके, एक हमलावर Buffer0 में बफर ओवरफ्लो ट्रिगर करके Buffer1 के गुणों को अधिलेखित कर सकता है, जिसमें इसका dataPtr सदस्य भी शामिल है। चूँकि 3DS गेम्स ASLR लागू नहीं करते हैं, रिमोट कंसोल में सभी मेमोरी स्थान ज्ञात होते हैं, इसलिए dataPtr को किसी मनमाने स्थान पर इंगित किया जा सकता है। गेम द्वारा बफर बदलते ही, नया डेटा उस मनमाने स्थान पर कॉपी कर दिया जाएगा। निम्नलिखित चरणों को करके, किसी भी आकार का पेलोड रिमोट कंसोल पर कॉपी किया जा सकता है:
Buffer0 में भेजें। यह रिमोट कंसोल में ओवरफ्लो ट्रिगर करके Buffer1 के dataPtr को अधिलेखित कर देगा।Buffer1 की सामग्री को मनमाने डेटा के साथ सेट करें। यह रिमोट कंसोल के Buffer1 के dataPtr द्वारा इंगित मनमाने पते पर कॉपी हो जाएगा।1 से फिर से शुरू करें।नीचे गेम के सामान्य संचालन का एक एनीमेशन है, उसके बाद ऊपर वर्णित चरणों का निष्पादन दिखाया गया है।

इस रिपॉजिटरी में एक PoC है जो कंपाइलर फ्लैग्स के आधार पर निम्नलिखित ऑपरेशन करने के लिए इस भेद्यता का शोषण करता है:
ध्यान रखें कि यह PoC किसी भी प्रकार की पैकेट ड्रॉप पहचान लागू नहीं करता है, क्योंकि कंसोल के बीच संचार UDP का उपयोग करके किया जाता है। सर्वोत्तम परिणाम प्राप्त करने के लिए, PoC कोड में पैकेट ड्रॉप हैंडलिंग लागू की जानी चाहिए या पैकेट गिरने की संभावनाओं को कम करने के लिए कंसोल को एक ही नेटवर्क में रखा जाना चाहिए।
भेद्य NetworkBuffer क्लास का एक संभावित समाधान भी प्रदान किया गया है।
यह भेद्यता Mario Kart 8 के WiiU और Switch संस्करण में भी मौजूद है, लेकिन इसका प्रदर्शन केवल गेम के WiiU रिलीज़ के लिए किया गया है।
जबकि इस भेद्यता को कई उपयोगकर्ताओं द्वारा स्वतंत्र रूप से खोजा गया था, उनमें से कई ने भेद्यता की जानकारी निजी रखने का निर्णय लिया। हालाँकि, निम्नलिखित लोग Nintendo को भेद्यता को सुरक्षित रूप से प्रकट करने के लिए जिम्मेदार हैं:
कानून द्वारा संभव सीमा तक,
PabloMK7, Rambo6Glaz and Fishguy6564
ने ENLBufferPwn के सभी कॉपीराइट और संबंधित या पड़ोसी अधिकारों का परित्याग कर दिया है।
यह कार्य प्रकाशित किया गया है:
स्पेन.