Stack buffer overflow
सॉफ्टवेयर में, एक स्टैक बफर ओवरफ्लो या स्टैक बफर ओवररन तब होता है जब कोई प्रोग्राम इच्छित डेटा संरचना के बाहर प्रोग्राम के कॉल स्टैक पर एक मेमोरी पते पर लिखते हैं, जो आमतौर पर एक निश्चित-लंबाई वाला बफर होता है। स्टैक बफर ओवरफ्लो बग्स तब होते हैं जब कोई प्रोग्राम स्टैक पर स्थित बफर को उस बफर के लिए वास्तव में आवंटित किए गए डेटा की तुलना में अधिक डेटा लिखता है। यह लगभग हमेशा स्टैक पर आसन्न डेटा के भ्रष्टाचार में परिणाम देता है, और ऐसे मामलों में जहां गलती से अतिप्रवाह शुरू हो गया था, अक्सर प्रोग्राम को क्रैश या गलत तरीके से संचालित करने का कारण बनता है। स्टैक बफर ओवरफ्लो अधिक सामान्य प्रोग्रामिंग खराबी का एक प्रकार है जिसे बफर ओवरफ्लो (या बफर ओवररन) के रूप में जाना जाता है। ढेर पर एक बफर को अधिक भरने से ढेर पर एक बफर को अधिक भरने की तुलना में ढेर पर एक बफर को अधिक भरने से कार्यक्रम के निष्पादन को पटरी से उतारने की अधिक संभावना होती है क्योंकि ढेर में सभी सक्रिय फ़ंक्शन कॉल के लिए वापसी पते होते हैं। एक स्टैक बफर अतिप्रवाह जानबूझकर एक हमले के हिस्से के रूप में हो सकता है जिसे स्टैक स्मैशिंग के रूप में जाना जाता है। यदि प्रभावित कार्यक्रम विशेष विशेषाधिकारों के साथ चल रहा है, या अविश्वसनीय नेटवर्क मेजबानों से डेटा स्वीकार करता है (जैसे। एक वेब सर्वर) तो बग एक संभावित सुरक्षा भेद्यता है। यदि स्टैक बफर एक अविश्वसनीय उपयोगकर्ता से आपूर्ति किए गए डेटा से भरा हुआ है तो वह उपयोगकर्ता स्टैक को इस तरह से दूषित कर सकता है कि चल रहे प्रोग्राम में निष्पादन योग्य कोड को इंजेक्ट कर सके और प्रक्रिया का नियंत्रण ले सके। यह हमलावरों के लिए कंप्यूटर तक अनधिकृत पहुंच प्राप्त करने के सबसे पुराने और अधिक विश्वसनीय तरीकों में से एक है। स्टैक-आधारित बफर अतिप्रवाह का दोहन करने के लिए विहित विधि हमलावर-नियंत्रित डेटा (आमतौर पर स्टैक पर ही) के लिए एक सूचक के साथ कार्य वापसी पते को अधिलेखित करना है। इसे निम्नलिखित उदाहरण में स्ट्रैकपी () के साथ चित्रित किया गया हैः #include <string.h> शून्य फ़ू (चार * बार) {चार सी [12]; स्ट्रैकपी (सी, बार);// कोई सीमा जाँच नहीं) इंट मेन (इंट आर्गक, चार * * आर्गव) {फ़ू (आर्गव [1]); रिटर्न 0;} यह कोड कमांड लाइन से एक तर्क लेता है और इसे स्थानीय स्टैक चर सी में कॉपी करता है। यह 12 वर्णों से छोटे कमांड-लाइन तर्कों के लिए ठीक काम करता है (जैसा कि नीचे चित्र बी में देखा जा सकता है)। 11 वर्णों से बड़े किसी भी तर्क के परिणामस्वरूप स्टैक में गड़बड़ी होगी। (सुरक्षित वर्णों की अधिकतम संख्या यहाँ बफर के आकार से एक कम है क्योंकि सी प्रोग्रामिंग भाषा में, स्ट्रिंग्स को एक नल बाइट वर्ण द्वारा समाप्त किया जाता है। इस प्रकार बारह वर्ण के इनपुट को संग्रहीत करने के लिए तेरह बाइट्स की आवश्यकता होती है, इनपुट के बाद प्रहरी शून्य बाइट्स होता है। शून्य बाइट तब एक मेमोरी स्थान को अधिलेखित करता है जो बफर के अंत से परे एक बाइट है।) प्रोग्राम विभिन्न निवेशों के साथ fhoo () में स्टैक करता हैः उपरोक्त चित्र C में, जब कमांड लाइन foo () पर 11 बाइट्स से बड़े तर्क की आपूर्ति की जाती है, तो स्थानीय स्टैक डेटा, सहेजे गए फ्रेम पॉइंटर और सबसे महत्वपूर्ण रूप से, रिटर्न एड्रेस को ओवरराइट कर दिया जाता है। जब फ़ू () लौटाता है तो यह स्टैक से वापसी का पता हटा देता है और उस पते पर पहुँच जाता है (यानी. उस पते से निर्देशों को निष्पादित करना शुरू करता है)। इस प्रकार, हमलावर ने स्टैक बफर चार सी [12] के लिए एक सूचक के साथ वापसी पते को अधिलेखित कर दिया है, जिसमें अब हमलावर द्वारा प्रदान किया गया डेटा शामिल है। एक वास्तविक स्टैक बफर अतिप्रवाह शोषण में "ए" की स्ट्रिंग प्लेटफ़ॉर्म और वांछित कार्य के लिए उपयुक्त शेलकोड होगी। यदि इस कार्यक्रम में विशेष विशेषाधिकार थे (जैसे। सुपरयूजर के रूप में चलाने के लिए सेट किया गया एसयूआईडी बिट), तब हमलावर प्रभावित मशीन पर सुपरयूजर विशेषाधिकार प्राप्त करने के लिए इस भेद्यता का उपयोग कर सकता है। हमलावर कुछ बग्स का फायदा उठाने के लिए आंतरिक चर मूल्यों को भी संशोधित कर सकता है। इस उदाहरण के साथः #include <string.h> #include <stdio.h> शून्य फ़ू (चार * बार) {फ्लोट माई _ फ्लोट = 10.5;// एडर = 0x0023FF4C चार सी [28];// एडर = 0x0023FF30// प्रिंट करेगा 10.500000 प्रिंटफ़ ("मेरा फ्लोट मान =% f", मेरा फ्लोट);/* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ !!!!! XXXX "); मेमकपी माई _ फ्लोट मान में 0x1010C042 (लिटिल एंडियन) डाल देगा। ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ !!!!! \x10\x10\xc0\x42 "); रिटर्न 0;} प्लेटफॉर्म से संबंधित अंतर कई प्लेटफार्मों में कॉल स्टैक के कार्यान्वयन में सूक्ष्म अंतर होते हैं जो एक स्टैक बफर अतिप्रवाह शोषण के काम करने के तरीके को प्रभावित कर सकते हैं। कुछ मशीन आर्किटेक्चर कॉल स्टैक के शीर्ष-स्तरीय वापसी पते को एक रजिस्टर में संग्रहीत करते हैं। इसका मतलब है कि किसी भी अधिलेखित वापसी पते का उपयोग कॉल स्टैक को बाद में खोलने तक नहीं किया जाएगा। मशीन-विशिष्ट विवरण का एक और उदाहरण जो दोहन तकनीकों के चयन को प्रभावित कर सकता है, वह यह है कि अधिकांश आर. आई. एस. सी.-शैली के मशीन आर्किटेक्चर स्मृति तक असंरेखित पहुंच की अनुमति नहीं देंगे। मशीन ऑपकोड के लिए एक निश्चित लंबाई के साथ संयुक्त, यह मशीन सीमा स्टैक पर कूदने की तकनीक को लागू करना लगभग असंभव बना सकती है (एक अपवाद के साथ जब प्रोग्राम में वास्तव में स्टैक रजिस्टर पर स्पष्ट रूप से कूदने के लिए असंभव कोड होता है)। स्टैक जो बड़े होते हैं स्टैक बफर ओवरफ्लो के विषय में, एक अक्सर चर्चा की जाने वाली-लेकिन-दुर्लभ-देखी जाने वाली वास्तुकला वह है जिसमें स्टैक विपरीत दिशा में बढ़ता है। वास्तुकला में इस परिवर्तन को अक्सर स्टैक बफर अतिप्रवाह समस्या के समाधान के रूप में सुझाया जाता है क्योंकि एक ही स्टैक फ्रेम के भीतर होने वाले स्टैक बफर का कोई भी अतिप्रवाह रिटर्न पॉइंटर को अधिलेखित नहीं कर सकता है। हालांकि, पिछले स्टैक फ्रेम से बफर में होने वाला कोई भी अतिप्रवाह अभी भी एक रिटर्न पॉइंटर को अधिलेखित करेगा और बग के दुर्भावनापूर्ण शोषण की अनुमति देगा। उदाहरण के लिए, उपरोक्त उदाहरण में, फ़ू के लिए वापसी सूचक को अधिलेखित नहीं किया जाएगा क्योंकि अतिप्रवाह वास्तव में मेमकपी के लिए स्टैक फ्रेम के भीतर होता है। हालाँकि, क्योंकि मेमकपी पर कॉल के दौरान ओवरफ्लो होने वाला बफर पिछले स्टैक फ्रेम में रहता है, मेमकपी के लिए रिटर्न पॉइंटर में बफर की तुलना में संख्यात्मक रूप से उच्च मेमोरी पता होगा। इसका मतलब है कि फ़ू के लिए वापसी सूचक को अधिलेखित करने के बजाय, मेमकपी के लिए वापसी सूचक को अधिलेखित किया जाएगा। अधिक से अधिक, इसका मतलब है कि विपरीत दिशा में ढेर को बढ़ाने से कुछ विवरण बदल जाएंगे कि कैसे ढेर बफर ओवरफ्लो का दोहन किया जा सकता है, लेकिन यह दोहन योग्य कीड़े की संख्या को महत्वपूर्ण रूप से कम नहीं करेगा। सुरक्षा योजनाएं वर्षों से, दुर्भावनापूर्ण स्टैक बफर अतिप्रवाह दोहन को रोकने के लिए कई नियंत्रण-प्रवाह अखंडता योजनाएं विकसित की गई हैं। इन्हें आमतौर पर तीन श्रेणियों में वर्गीकृत किया जा सकता हैः पता लगाएं कि एक स्टैक बफर अतिप्रवाह हुआ है और इस प्रकार निर्देश सूचक को दुर्भावनापूर्ण कोड पर पुनर्निर्देशित करने से रोकें। स्टैक बफर अतिप्रवाह का सीधे पता लगाए बिना स्टैक से दुर्भावनापूर्ण कोड के निष्पादन को रोकें। मेमोरी स्पेस को इस तरह से यादृच्छिक करें कि निष्पादन योग्य कोड ढूंढना अविश्वसनीय हो जाए। स्टैक कैनरी, जिनका नाम एक कोयला खदान में एक कैनरी के लिए उनके सादृश्य के लिए रखा गया है, का उपयोग दुर्भावनापूर्ण कोड के निष्पादन से पहले एक स्टैक बफर अतिप्रवाह का पता लगाने के लिए किया जाता है। यह विधि एक छोटे से पूर्णांक को रख कर काम करती है, जिसका मान यादृच्छिक रूप से प्रोग्राम शुरू होने पर, स्टैक रिटर्न पॉइंटर से ठीक पहले मेमोरी में चुना जाता है। अधिकांश बफर अतिप्रवाह स्मृति को निचले से उच्च स्मृति पतों पर अधिलेखित करते हैं, इसलिए वापसी सूचक को अधिलेखित करने के लिए (और इस प्रकार प्रक्रिया को नियंत्रित करने के लिए) कैनरी मूल्य को भी अधिलेखित किया जाना चाहिए। इस मान की जाँच यह सुनिश्चित करने के लिए की जाती है कि स्टैक पर रिटर्न पॉइंटर का नियमित उपयोग करने से पहले यह नहीं बदला है। यह तकनीक एक स्टैक बफर अतिप्रवाह का दोहन करने की कठिनाई को बहुत बढ़ा सकती है क्योंकि यह हमलावर को कुछ गैर-पारंपरिक साधनों जैसे कि स्टैक पर अन्य महत्वपूर्ण चर को दूषित करने से निर्देश सूचक पर नियंत्रण हासिल करने के लिए मजबूर करती है। स्टैक बफर अतिप्रवाह दोहन को रोकने का एक अन्य तरीका स्टैक मेमोरी क्षेत्र पर एक मेमोरी नीति को लागू करना है जो स्टैक से निष्पादन की अनुमति नहीं देता है (W ^ X, "XOR निष्पादित लिखें")। इसका मतलब है कि स्टैक से शेलकोड को निष्पादित करने के लिए एक हमलावर को या तो स्मृति से निष्पादन सुरक्षा को अक्षम करने का एक तरीका खोजना होगा, या अपने शेलकोड पेलोड को स्मृति के गैर-संरक्षित क्षेत्र में रखने का एक तरीका खोजना होगा। यह विधि अब अधिक लोकप्रिय होती जा रही है क्योंकि अधिकांश डेस्कटॉप प्रोसेसर में नो-एग्जीक्यूट फ्लैग के लिए हार्डवेयर समर्थन उपलब्ध है। जबकि यह विधि कैनोनिकल स्टैक स्मैशिंग एक्सप्लॉइट को रोकती है, स्टैक ओवरफ्लो का अन्य तरीकों से उपयोग किया जा सकता है। सबसे पहले, ढेर जैसे असुरक्षित स्मृति क्षेत्रों में शेलकोड को संग्रहीत करने के तरीके खोजना आम बात है, और इसलिए शोषण के तरीके में बहुत कम बदलाव की आवश्यकता है। एक अन्य हमला शेलकोड निर्माण के लिए तथाकथित रिटर्न टू लिबसी विधि है। इस हमले में दुर्भावनापूर्ण पेलोड स्टैक को शेलकोड के साथ नहीं, बल्कि एक उचित कॉल स्टैक के साथ लोड करेगा ताकि निष्पादन को मानक लाइब्रेरी कॉल की एक श्रृंखला के लिए वेक्टर किया जाए, आमतौर पर स्मृति निष्पादन सुरक्षा को अक्षम करने और शेलकोड को सामान्य रूप से चलाने की अनुमति देने के प्रभाव के साथ। यह काम करता है क्योंकि निष्पादन वास्तव में कभी भी स्टैक के लिए वैक्टर नहीं होता है। रिटर्न-टू-लिब्स का एक प्रकार रिटर्न-ओरिएंटेड प्रोग्रामिंग (आरओपी) है, जो वापसी पतों की एक श्रृंखला स्थापित करता है, जिनमें से प्रत्येक मौजूदा प्रोग्राम कोड या सिस्टम पुस्तकालयों के भीतर चेरी-चुने हुए मशीन निर्देशों के एक छोटे से अनुक्रम को निष्पादित करता है, जो एक वापसी के साथ समाप्त होता है। ये तथाकथित उपकरण प्रत्येक लौटने से पहले कुछ सरल रजिस्टर हेरफेर या इसी तरह के निष्पादन को पूरा करते हैं, और उन्हें एक साथ जोड़कर हमलावर के लक्ष्यों को प्राप्त करते हैं। उन निर्देशों या निर्देशों के समूहों का उपयोग करके "वापसी-रहित" वापसी-उन्मुख प्रोग्रामिंग का उपयोग करना भी संभव है जो वापसी निर्देश की तरह व्यवहार करते हैं। यादृच्छिककरण कोड को डेटा से अलग करने के बजाय, एक और शमन तकनीक निष्पादन कार्यक्रम के स्मृति स्थान में यादृच्छिककरण की शुरुआत करना है। चूँकि हमलावर को यह निर्धारित करने की आवश्यकता होती है कि निष्पादन योग्य कोड कहाँ रहता है जिसका उपयोग किया जा सकता है, या तो एक निष्पादन योग्य पेलोड प्रदान किया जाता है (एक निष्पादन योग्य ढेर के साथ) या एक कोड के पुनः उपयोग का उपयोग करके बनाया जाता है जैसे कि रेट2लिब्स या रिटर्न-ओरिएंटेड प्रोग्रामिंग (आरओपी) में। मेमोरी लेआउट को यादृच्छिक बनाना, एक अवधारणा के रूप में, हमलावर को यह जानने से रोकेगा कि कोई भी कोड कहाँ है। हालांकि, कार्यान्वयन आमतौर पर सब कुछ यादृच्छिक नहीं करेगा; आमतौर पर निष्पादन योग्य स्वयं एक निश्चित पते पर लोड किया जाता है और इसलिए जब ए. एस. एल. आर. (पता स्थान लेआउट यादृच्छिककरण) को एक गैर-निष्पादन योग्य ढेर के साथ जोड़ा जाता है तो हमलावर स्मृति के इस निश्चित क्षेत्र का उपयोग कर सकता है। इसलिए, सभी कार्यक्रमों को पी. आई. ई. (स्थिति-स्वतंत्र निष्पादन) के साथ इस तरह संकलित किया जाना चाहिए कि स्मृति का यह क्षेत्र भी यादृच्छिक हो। यादृच्छिककरण की एन्ट्रापी कार्यान्वयन से कार्यान्वयन तक अलग होती है और एक कम पर्याप्त एन्ट्रापी अपने आप में यादृच्छिक स्मृति स्थान को मजबूर करने के मामले में एक समस्या हो सकती है। बायपास प्रति-उपाय पिछले शमन शोषण के कदमों को कठिन बनाते हैं। लेकिन अगर कुछ कमजोरियां मौजूद हैं या कुछ शर्तों को पूरा किया जाता है तो एक स्टैक बफर अतिप्रवाह का फायदा उठाना अभी भी संभव है। स्टैक कैनरी बायपास प्रारूप स्ट्रिंग भेद्यता दोहन के साथ सूचना रिसाव एक हमलावर कमजोर कार्यक्रम में स्मृति स्थानों को प्रकट करने के लिए प्रारूप स्ट्रिंग भेद्यता का फायदा उठाने में सक्षम है। गैर निष्पादन योग्य स्टैक बाईपास जब डेटा निष्पादन रोकथाम स्टैक तक किसी भी निष्पादन पहुंच को प्रतिबंधित करने के लिए सक्षम होती है, तो हमलावर अभी भी एक कोड खंड (लिनक्स पर) या प्रोग्राम के हर अन्य निष्पादन योग्य खंड में डेटा को इंगित करने के लिए अधिलेखित वापसी पते (निर्देश सूचक) का उपयोग कर सकता है। लक्ष्य मौजूदा कोड का पुनः उपयोग करना है। रोप श्रृंखला में कार्यक्रम के वापसी निर्देश (x86 में पुनर्निर्धारित) से थोड़ा पहले वापसी सूचक को अधिलेखित करना शामिल है। नए वापसी सूचक और वापसी निर्देश के बीच के निर्देशों को निष्पादित किया जाएगा और वापसी निर्देश शोषक द्वारा नियंत्रित पेलोड पर वापस आ जाएगा। जॉप चेन जंप ओरिएंटेड प्रोग्रामिंग एक ऐसी तकनीक है जो पुनः निर्देश के बजाय कोड का पुनः उपयोग करने के लिए कूद निर्देशों का उपयोग करती है। यादृच्छिक बाइपास 64-बिट प्रणालियों पर ए. एस. एल. आर. प्राप्ति की एक सीमा यह है कि यह स्मृति प्रकटीकरण और सूचना रिसाव हमलों के लिए असुरक्षित है। हमलावर सूचना रिसाव हमले का उपयोग करके एकल कार्य पते का खुलासा करके आरओपी को लॉन्च कर सकता है। निम्नलिखित खंड ए. एस. एल. आर. संरक्षण को तोड़ने के लिए समान मौजूदा रणनीति का वर्णन करता है। उल्लेखनीय उदाहरण 1988 में मॉरिस कृमि यूनिक्स फिंगर सर्वर में एक स्टैक बफर अतिप्रवाह का फायदा उठाकर कुछ हद तक फैल गया। 2003 में स्लैमर कृमि माइक्रोसॉफ्ट के एसक्यूएल सर्वर में एक स्टैक बफर अतिप्रवाह का फायदा उठाकर फैल गया। 2003 में ब्लास्टर कृमि माइक्रोसॉफ्ट डी. सी. ओ. एम. सेवा में एक स्टैक बफर अतिप्रवाह का उपयोग करके फैल गया। 2004 में विट्टी वर्म इंटरनेट सुरक्षा प्रणाली ब्लैकआईसीई डेस्कटॉप एजेंट में एक स्टैक बफर अतिप्रवाह का फायदा उठाकर फैल गया। वाईआई के कुछ उदाहरण हैं जो मनमाने कोड को एक अपरिवर्तित प्रणाली पर चलाने की अनुमति देते हैं। "ट्वाइलाइट हैक" जिसमें द लीजेंड ऑफ ज़ेल्डाः ट्वाइलाइट प्रिंसेस में मुख्य पात्र के घोड़े को एक लंबा नाम देना शामिल है, और सुपर स्मैश ब्रदर्स ब्रॉल के लिए "स्मैश स्टैक" जिसमें इन-गेम स्तर के संपादक में एक विशेष रूप से तैयार फ़ाइल को लोड करने के लिए एस. डी. कार्ड का उपयोग करना शामिल है। हालाँकि दोनों का उपयोग किसी भी मनमाने कोड को निष्पादित करने के लिए किया जा सकता है, लेकिन बाद वाले का उपयोग अक्सर लागू किए गए संशोधनों के साथ ब्रॉल को फिर से लोड करने के लिए किया जाता है। यह भी देखें कि ExecShield हीप ओवरफ्लो पूर्णांक ओवरफ्लो NX बिट-मेमोरी सुरक्षा-उन्नत लिनक्स स्टैक ओवरफ्लो के क्षेत्रों के लिए नो-एग्जीक्यूट बिट-जब स्टैक स्वयं भंडारण उल्लंघन संदर्भ सॉफ्टवेयर बग सॉफ्टवेयर विसंगतियों को ओवरफ्लो करता है तो कंप्यूटर सुरक्षा कंप्यूटर त्रुटियों का फायदा उठाती है।