ईज़ी ग्रेड प्रो 4.1 फ़ाइल पार्सिंग बग को एक शैक्षिक उदाहरण के रूप में उपयोग किया गया है, जो शुरुआती लोगों को रिवर्स इंजीनियरिंग के माध्यम से भेद्यता अनुसंधान शुरू करने का तरीका दिखाता है।
एक शैक्षिक उदाहरण जो शुरुआती लोगों को दिखाने के लिए बनाया गया है कि रिवर्स इंजीनियरिंग के माध्यम से भेद्यता अनुसंधान शुरू से ही संभव है।
यह रिपॉजिटरी एक सरल उदाहरण की आवश्यकता से उत्पन्न हुई है जिसका उपयोग उन शुरुआती लोगों को पढ़ाने के दौरान किया जा सकता है जो भेद्यता अनुसंधान में शुरुआत कर रहे हैं, विशेष रूप से वे जो रिवर्स इंजीनियरिंग में रुचि रखते हैं।
बाइनरी एक्सप्लॉइटेशन या बाइनरी विश्लेषण से संबंधित किसी पाठ्यक्रम, प्रशिक्षण सत्र या मास्टर प्रोग्राम को पूरा करने के बाद, कई छात्रों को लगता है कि वास्तविक भेद्यता अनुसंधान उनके स्तर से कहीं परे है। वे आमतौर पर रिवर्स इंजीनियरिंग को कर्नेल भेद्यताओं, ब्राउज़र एक्सप्लॉइटेशन, फर्मवेयर अनुसंधान या जटिल आधुनिक लक्ष्यों जैसे बहुत उन्नत विषयों से जोड़ते हैं, और इस वजह से उन्हें लगता है कि वे अभी तैयार नहीं हैं। व्यवहार में, समस्या ज्ञान की कमी नहीं है, बल्कि एक यथार्थवादी शुरुआती बिंदु की कमी है।
मैं एक ऐसा उदाहरण चाहता था जो दिखा सके कि एक बुनियादी पाठ्यक्रम के दौरान सीखे गए कौशल के साथ, पहले से ही एक वास्तविक प्रोग्राम लेना, यह समझना कि यह कैसे काम करता है, एक क्रैश को ट्रिगर करना और एक वास्तविक बग की पहचान करना संभव है।
यह रिपॉजिटरी बिल्कुल इसी तरह का उदाहरण है। यह एक जटिल भेद्यता खोजने के बारे में नहीं है। यह यह दिखाने के बारे में है कि शुरुआती लोग किसी छोटी, दोहराने योग्य और समझने योग्य वस्तु से शुरुआत कर सकते हैं, और फिर भी वास्तविक भेद्यता अनुसंधान कर सकते हैं।
यह रिपॉजिटरी सीधे मेरे वार्ता "द पाथ दैट लीड्स टू योर फर्स्ट सीवीई" से संबंधित है, जहाँ मैं समझाता हूँ कि भेद्यता अनुसंधान की दुनिया में प्रवेश करने के कई तरीके हैं, और प्रत्येक व्यक्ति आमतौर पर अपनी रुचियों के आधार पर एक अलग रास्ता अपनाता है।
कुछ लोग स्रोत कोड ऑडिटिंग से शुरुआत करते हैं, कुछ रिवर्स इंजीनियरिंग से, कुछ वेब सुरक्षा से, और कुछ तकनीक अनुसंधान से। ये सभी रास्ते मान्य हैं, लेकिन महत्वपूर्ण बात यह समझना है कि प्रत्येक क्षेत्र में शुरुआती-अनुकूल प्रवेश बिंदु भी मौजूद हैं।
शुरुआती रास्तों के उदाहरणों में शामिल हैं:
इस प्रकार के लक्ष्य बुनियादी लग सकते हैं, लेकिन वे वही मूल कौशल सिखाते हैं जिनकी बाद में जटिल प्रणालियों पर काम करते समय आवश्यकता होती है।
यह रिपॉजिटरी रिवर्स इंजीनियरिंग क्षेत्र में उन शुरुआती रास्तों में से एक का प्रतिनिधित्व करती है।
यहाँ प्रलेखित भेद्यता एक पुराने एप्लिकेशन का विश्लेषण करके, यह समझकर कि इसके फ़ाइल प्रारूप को कैसे पार्स किया जाता है, और एक प्रोग्रामिंग गलती की पहचान करके पाई गई थी जो क्रैश की ओर ले जाती है। प्रभाव स्वयं जटिल नहीं है, लेकिन प्रक्रिया वास्तविक, दोहराने योग्य और यह सीखने के लिए उपयोगी है कि भेद्यता अनुसंधान वास्तव में कैसे काम करता है।
यह उस प्रकार का उदाहरण है जिसका उपयोग मैं "द पाथ दैट लीड्स टू योर फर्स्ट सीवीई" समझाते समय करता हूँ, यह दिखाने के लिए कि रिवर्स इंजीनियरिंग शुरू से ही एक मान्य मार्ग है, और सरल लक्ष्यों से शुरुआत करना न केवल स्वीकार्य है, बल्कि अक्सर सीखने का सबसे अच्छा तरीका है।
जब आप शुरुआत कर रहे हैं, तो आधुनिक एप्लिकेशन अक्सर बहुत जटिल होते हैं। वे सुरक्षा उपायों, शमन तकनीकों और कोडबेस का उपयोग करते हैं जिन्हें बिना अधिक अनुभव के समझना कठिन है। पुराना सॉफ्टवेयर अलग है।
पुराने अनुप्रयोगों को आधुनिक सुरक्षा प्रथाओं को ध्यान में रखकर नहीं लिखा गया था। उनमें अक्सर सरल पार्सिंग बग, असुरक्षित मेमोरी ऑपरेशन और तर्क दोष होते हैं जिन्हें बुनियादी रिवर्सिंग कौशल के साथ समझा जा सकता है। यह उन्हें सीखने के लिए उपयुक्त बनाता है।
एक पुराने प्रोग्राम के साथ आप यह कर सकते हैं: बाइनरी को रिवर्स करें, फ़ाइल प्रारूप को समझें, एक क्रैश ट्रिगर करें, क्रैश का विश्लेषण करें, बग का पता लगाएं, मुद्दे का दस्तावेजीकरण करें और भेद्यता की रिपोर्ट करें। दूसरे शब्दों में, आप मूलभूत कौशल सीखते हैं जिनकी हर भेद्यता शोधकर्ता को आवश्यकता होती है।
यही इस उदाहरण के बारे में है।
यह उदाहरण महत्वपूर्ण है क्योंकि यह कुछ बहुत ही सरल दिखाता है:
यदि आपको रिवर्स इंजीनियरिंग पसंद है, तो आप शुरू से ही उस मार्ग का अनुसरण कर सकते हैं। इसमें महारत हासिल करने में वर्षों लग सकते हैं, लेकिन वास्तविक काम शुरू करने के लिए आपको वर्षों इंतजार करने की आवश्यकता नहीं है।
यह भेद्यता (CVE-2025-70330) Easy Grade Pro 4.1 के फ़ाइल पार्सिंग तर्क को प्रभावित करती है जब मालिकाना .EGP ग्रेडबुक फ़ाइलें लोड की जाती हैं।
एप्लिकेशन फ़ाइल से निश्चित-स्थिति वाले फ़ील्ड पढ़कर और उन मानों को लोड की गई फ़ाइल बफर के अंदर ऑफसेट के रूप में उपयोग करके आंतरिक ग्रेडबुक संरचनाओं का पुनर्निर्माण करता है। इन ऑफसेट का उपयोग बाद में मेमोरी आकारों की गणना करने और गतिशील रूप से आवंटित बफर में डेटा कॉपी करने के लिए किया जाता है।
सामान्य परिस्थितियों में, पार्सिंग जारी रखने से पहले फ़ाइल कई संरचनात्मक जाँचों को पास करती है। हालाँकि, एक बार जब ये जाँचें सफल हो जाती हैं, तो पार्सर लोड किए गए बफर की सीमाओं के भीतर रहने की पुष्टि किए बिना फ़ाइल के अंदर संग्रहीत ऑफसेट मानों पर भरोसा करता है।
एक अन्यथा मान्य .EGP फ़ाइल के अंदर विशिष्ट बाइट्स को संशोधित करके, इन आंतरिक ऑफसेट गणनाओं को दूषित करना संभव है। जब पार्सर बाद में इन मानों का उपयोग करता है, तो यह मान्य फ़ाइल क्षेत्र के बाहर मेमोरी पढ़ने का प्रयास करता है, जिसके परिणामस्वरूप एक एक्सेस उल्लंघन और एप्लिकेशन क्रैश होता है।
यह स्थिति एक आउट-ऑफ-बाउंड रीड (CWE-125) से मेल खाती है, जो क्राफ्टेड फ़ाइल खोले जाने पर एक स्थानीय डिनायल-ऑफ-सर्विस की ओर ले जाती है।
.EGP फ़ाइल प्रारूप को ऑफसेट-आधारित दृष्टिकोण का उपयोग करके पार्स किया जाता है। फ़ाइल को अनुक्रमिक रूप से संसाधित करने के बजाय, पार्सर आंतरिक संरचनाओं को पढ़ता है जिसमें प्रारंभ और अंत ऑफसेट होते हैं जो बताते हैं कि फ़ाइल के अंदर विशिष्ट डेटा ब्लॉक कहाँ स्थित होने चाहिए।
इन ऑफसेट का उपयोग मेमोरी क्षेत्र के आकार की गणना करने और लोड की गई फ़ाइल बफर से नवीनतम आवंटित मेमोरी में डेटा कॉपी करने के लिए किया जाता है।
भेद्य तर्क को इस प्रकार संक्षेपित किया जा सकता है:
size = offset_end - offset_start + 1
buffer = calloc(1, size)
memcpy(buffer, file_buffer[offset_start - base_offset], size)
एक बार जब फ़ाइल प्रारंभिक सत्यापन जाँचों को पास कर लेती है, तो पार्सर मान लेता है कि फ़ाइल में संग्रहीत ऑफसेट मान्य हैं। यह सुनिश्चित करने के लिए कोई सत्यापन नहीं किया जाता है कि गणना किया गया स्रोत पॉइंटर लोड की गई फ़ाइल बफर के अंदर रहे।
यदि ऑफसेट को नियंत्रित तरीके से हेरफेर किया जाता है, तो पार्सर मान्य क्षेत्र के बाहर मेमोरी पढ़ने का प्रयास कर सकता है, जिससे memcpy() ऑपरेशन के दौरान एक्सेस उल्लंघन होता है।
हर दूषित .EGP फ़ाइल क्रैश को ट्रिगर नहीं करती है।
पार्सर भेद्य कोड पथ तक पहुँचने से पहले कई संगति जाँचें करता है। यदि फ़ाइल संरचना बहुत अधिक दूषित है, तो एप्लिकेशन पार्सिंग को जल्दी रोक देता है और रिपोर्ट करता है कि ग्रेडबुक क्षतिग्रस्त है।
हालाँकि, कुछ संशोधन आंतरिक संरचनाओं को प्रारंभिक जाँचों को पास करने के लिए पर्याप्त सुसंगत रखते हैं, जबकि बाद में पार्सिंग प्रक्रिया में गलत ऑफसेट मान उत्पन्न करते हैं।
जब ऐसा होता है, तो पार्सर गहरी रूटीन तक पहुँचता है जहाँ इन ऑफसेट पर भरोसा किया जाता है और मेमोरी कॉपी ऑपरेशन में उपयोग किया जाता है, अंततः आउट-ऑफ-बाउंड रीड का कारण बनता है।
क्रैश को एक मान्य .EGP फ़ाइल को संशोधित करके और एक विशिष्ट ऑफसेट पर नियंत्रित डेटा सम्मिलित करके ट्रिगर किया जा सकता है।
प्रूफ ऑफ कॉन्सेप्ट इस प्रकार काम करता है:
PoC में उपयोग किए गए उदाहरण पैरामीटर:
यह संशोधन फ़ाइल को प्रारंभिक जाँचों को पास करने के लिए पर्याप्त रूप से संरचनात्मक रूप से मान्य रखता है, लेकिन बाद में पार्सर द्वारा उपयोग की जाने वाली आंतरिक ऑफसेट गणनाओं को दूषित करता है, अंततः एप्लिकेशन क्रैश का कारण बनता है।
जब दूषित फ़ाइल को डीबगर के तहत खोला जाता है, तो एप्लिकेशन मेमोरी कॉपी ऑपरेशन के दौरान क्रैश हो जाता है।
देखा गया अपवाद एक अमान्य मेमोरी रीड के कारण होने वाला एक्सेस उल्लंघन है।
डीबगिंग के दौरान, memcpy() द्वारा उपयोग किया गया अमान्य पॉइंटर पार्स की गई फ़ाइल संरचनाओं से प्राप्त ऑफसेट गणनाओं से उत्पन्न होता है। जब ये ऑफसेट लोड की गई फ़ाइल बफर के बाहर मेमोरी को संदर्भित करते हैं, तो स्रोत पॉइंटर एक अनमैप्ड पते की ओर इशारा करता है, जिससे क्रैश होता है।
यह पुष्टि करता है कि भेद्यता फ़ाइल पार्सिंग के दौरान सीमा सत्यापन की कमी के कारण होती है।
यह भेद्यता एक एंड-ऑफ-लाइफ उत्पाद को प्रभावित करती है जिसे विक्रेता द्वारा अब बनाए नहीं रखा जाता है।
मुद्दा शैक्षिक और अनुसंधान उद्देश्यों के लिए प्रलेखित किया गया है, और शुरुआती लोगों को एक ठोस उदाहरण देने के लिए कि सॉफ्टवेयर का चरण दर चरण विश्लेषण कैसे किया जा सकता है ताकि यह समझा जा सके कि बग कैसे प्रकट होते हैं और वास्तविक भेद्यताएँ कैसे पाई जाती हैं।