c - शोषण के प्रकार




एक प्रारूप-स्ट्रिंग भेद्यता का शोषण कैसे किया जा सकता है? (4)

मैं कोड में भेद्यता के बारे में पढ़ रहा था और इस प्रारूप-स्ट्रिंग भेद्यता में आया था।

Wikipedia कहता है:

प्रारूप स्ट्रिंग बग आमतौर पर तब दिखाई देते हैं जब कोई प्रोग्रामर उपयोगकर्ता द्वारा प्रदान किए गए डेटा वाले स्ट्रिंग को मुद्रित करना चाहता है। प्रोग्रामर गलती से printf ("% s", बफर) के बजाय printf (बफर) लिख सकता है। पहला संस्करण बफर को स्वरूप स्ट्रिंग के रूप में व्याख्या करता है, और इसमें किसी भी प्रारूपण निर्देशों का विश्लेषण किया जा सकता है। प्रोग्रामर के इरादे के रूप में दूसरा संस्करण बस स्क्रीन पर एक स्ट्रिंग प्रिंट करता है।

मुझे printf (बफर) संस्करण के साथ समस्या मिली, लेकिन मुझे अभी भी यह नहीं मिला कि हमलावर द्वारा हानिकारक कोड निष्पादित करने के लिए इस भेद्यता का उपयोग कैसे किया जा सकता है। क्या कोई मुझे बता सकता है कि इस भेद्यता का उदाहरण कैसे इस्तेमाल किया जा सकता है ?


आह, जवाब लेख में है!

अनियंत्रित प्रारूप स्ट्रिंग एक प्रकार का सॉफ़्टवेयर भेद्यता है, जिसे 1 999 के आसपास खोजा गया था, जिसका उपयोग सुरक्षा शोषण में किया जा सकता है। पहले हानिरहित सोचा था, प्रारूप स्ट्रिंग शोषण का उपयोग किसी प्रोग्राम को क्रैश करने या हानिकारक कोड निष्पादित करने के लिए किया जा सकता है।

एक सामान्य शोषण इन तकनीकों के संयोजन का उपयोग करता है ताकि प्रोग्राम को लाइब्रेरी फ़ंक्शन के पते को ओवरराइट करने के लिए मजबूर किया जा सके या कुछ दुर्भावनापूर्ण शेलकोड के लिए पॉइंटर के साथ स्टैक पर वापसी पता। प्रारूप विनिर्देशों के लिए पैडिंग पैरामीटर बाइट्स आउटपुट की संख्या को नियंत्रित करने के लिए उपयोग किए जाते हैं और %x टोकन का उपयोग स्टैक से बाइट्स पॉप करने के लिए किया जाता है जब तक कि प्रारूप स्ट्रिंग की शुरुआत पूरी नहीं हो जाती। प्रारूप स्ट्रिंग की शुरुआत उस पते को शामिल करने के लिए तैयार की जाती है जो %n प्रारूप टोकन तब दुर्भावनापूर्ण कोड के निष्पादन के पते के साथ ओवरराइट कर सकता है

ऐसा इसलिए है क्योंकि %n एक चर को डेटा लिखने के लिए printf का कारण बनता है , जो ढेर पर है। लेकिन इसका मतलब है कि यह मनमाने ढंग से कुछ लिख सकता है। किसी व्यक्ति के लिए उस चर का उपयोग करने की आवश्यकता है (यह अपेक्षाकृत आसान है यदि यह फ़ंक्शन पॉइंटर होता है, जिसका मूल्य आपने अभी नियंत्रित किया है कि कैसे नियंत्रित किया जाए) और वे आपको मनमाने ढंग से निष्पादित कर सकते हैं।

लेख में लिंक पर एक नज़र डालें; वे दिलचस्प लग रहे हैं


AFAIK यह मुख्य रूप से इसलिए है क्योंकि यह आपके प्रोग्राम को क्रैश कर सकता है, जिसे एक इनकार सेवा-सेवा माना जाता है। आपको केवल एक अमान्य पता देना है (कुछ %s साथ व्यावहारिक रूप से कुछ भी काम करने की गारंटी है), और यह एक साधारण अस्वीकार सेवा (डीओएस) हमला बन जाता है।

अब, यह सैद्धांतिक रूप से संभव है कि अपवाद / सिग्नल / इंटरप्ट हैंडलर के मामले में कुछ भी ट्रिगर करें, लेकिन यह पता लगाने के लिए कि यह कैसे करना है मेरे बाहर है - आपको यह समझने की जरूरत है कि स्मृति को मनमाने ढंग से डेटा कैसे लिखना है

लेकिन अगर कोई प्रोग्राम दुर्घटनाग्रस्त हो तो कोई परवाह क्यों करता है, आप पूछ सकते हैं? क्या यह उपयोगकर्ता की असुविधा नहीं है (जो वैसे भी इसके लायक है)?

समस्या यह है कि कुछ प्रोग्रामों को कई उपयोगकर्ताओं द्वारा एक्सेस किया जाता है, इसलिए उन्हें क्रैश करने से गैर-नगण्य लागत होती है। या कभी-कभी वे सिस्टम के चलने के लिए महत्वपूर्ण होते हैं (या हो सकता है कि वे कुछ बहुत महत्वपूर्ण करने के बीच में हों), इस मामले में यह आपके डेटा को हानिकारक हो सकता है। बेशक, यदि आप नोटपैड को क्रैश करते हैं तो कोई भी परवाह नहीं कर सकता है, लेकिन यदि आप सीएसआरएसएस को क्रैश करते हैं (जो मुझे लगता है कि वास्तव में एक समान प्रकार की बग - एक डबल-फ्री बग, विशेष रूप से) तो हाँ, पूरी प्रणाली आपके साथ नीचे जा रही है ।

अद्यतन करें:

सीएसआरएसएस बग के लिए यह लिंक देखें जिसका मैं जिक्र कर रहा था।

संपादित करें:

ध्यान दें कि मनमाना डेटा पढ़ना मनमाने ढंग से कोड निष्पादित करने जितना खतरनाक हो सकता है ! यदि आप पासवर्ड, कुकी, इत्यादि पढ़ते हैं तो यह एक मनमाना कोड निष्पादन के रूप में उतना ही गंभीर है - और यह छोटा है यदि आपके पास पर्याप्त प्रारूप स्ट्रिंग का प्रयास करने के लिए पर्याप्त समय है।


मैं प्रारूप स्ट्रिंग भेद्यता के बारे में this व्याख्यान नोट को पढ़ने की सिफारिश करता हूं। यह विवरण में वर्णन करता है कि क्या होता है और कैसे, और कुछ छवियां हैं जो आपको विषय को समझने में मदद कर सकती हैं।


यह दिलचस्प है कि किसी ने भी POSIX द्वारा समर्थित n$ नोटेशन का उल्लेख नहीं किया है। यदि आप हमलावर के रूप में प्रारूप स्ट्रिंग को नियंत्रित कर सकते हैं, तो आप नोटेशन का उपयोग कर सकते हैं जैसे कि:

"%200$p"

स्टैक पर 200 वें आइटम को पढ़ने के लिए (अगर कोई है)। इरादा यह है कि आपको सभी n$ संख्याओं को अधिकतम से 1 से अधिकतम सूची में सूचीबद्ध करना चाहिए, और यह I18N (L10N, G11N, M18N * ) से निपटने के दौरान एक प्रारूप स्ट्रिंग में पैरामीटर कैसे दिखाई देता है, यह शोध करने का एक तरीका प्रदान करता है।

हालांकि, कुछ (शायद अधिकतर) सिस्टम कुछ हद तक कमजोर हैं कि वे n$ मूल्यों को कैसे मान्य करते हैं और इससे हमलावरों द्वारा दुरुपयोग हो सकता है जो प्रारूप स्ट्रिंग को नियंत्रित कर सकते हैं। %n प्रारूप विनिर्देशक के साथ संयुक्त, यह पॉइंटर स्थानों पर लिखने का कारण बन सकता है।

* शब्दकोष I18N, L10N, G11N और M18N क्रमशः अंतर्राष्ट्रीयकरण, स्थानीयकरण, वैश्वीकरण और बहुराष्ट्रीयकरण के लिए हैं। संख्या छोड़े गए अक्षरों की संख्या का प्रतिनिधित्व करती है।





format-string