स्टैक बफर ओवरफ्लो

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

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

स्टैक बफर ओवरफ्लो का शोषण
एक्सप्लॉइट (कंप्यूटर सुरक्षा) के लिए एक स्टैक-आधारित बफर ओवरफ़्लो के लिए कैननिकल विधि हमलावर-नियंत्रित डेटा (सामान्यतः स्टैक पर ही) के सूचक के साथ फ़ंक्शन रिटर्न एड्रेस को ओवरराइट करना है। इसके द्वारा दर्शाया गया है  निम्नलिखित उदाहरण में:

यह कोड कमांड लाइन से तर्क लेता है और इसे स्थानीय स्टैक चर में कॉपी करता है. यह 12 वर्णों से छोटे कमांड-लाइन तर्कों के लिए ठीक काम करता है (जैसा कि नीचे चित्र B में देखा जा सकता है)। 11 वर्णों से बड़े किसी भी तर्क के परिणामस्वरूप ढेर का भ्रष्टाचार होगा। (सुरक्षित वर्णों की अधिकतम संख्या यहाँ बफ़र के आकार से एक कम है क्योंकि C प्रोग्रामिंग भाषा में, स्ट्रिंग्स को एक शून्य बाइट वर्ण द्वारा समाप्त किया जाता है। एक बारह-वर्ण इनपुट को स्टोर करने के लिए तेरह बाइट्स की आवश्यकता होती है, इनपुट के बाद प्रहरी शून्य बाइट द्वारा। शून्य बाइट तब एक स्मृति स्थान को अधिलेखित कर देता है जो बफर के अंत से एक बाइट है।)

फंक्शन ढेर हो गया  विभिन्न इनपुट के साथ:

उपरोक्त आकृति C में, जब कमांड लाइन पर 11 बाइट्स से बड़ा तर्क दिया जाता है  स्थानीय स्टैक डेटा, सहेजे गए फ़्रेम पॉइंटर और सबसे महत्वपूर्ण रूप से रिटर्न एड्रेस को ओवरराइट करता है। कब   रिटर्न यह स्टैक से वापसी पता पॉप करता है और उस पते पर कूदता है (यानी उस पते से निर्देश निष्पादित करना प्रारंभ करता है)। इस प्रकार, हमलावर ने स्टैक बफर के पॉइंटर के साथ रिटर्न एड्रेस को ओवरराइट कर दिया है , जिसमें अब हमलावर द्वारा प्रदान किया गया डेटा सम्मलित है। एक वास्तविक स्टैक बफर ओवरफ्लो में ए की स्ट्रिंग का शोषण प्लेटफॉर्म और वांछित फ़ंक्शन के लिए उपयुक्त app होगा। यदि इस फंक्शन में विशेष विशेषाधिकार थे (उदाहरण के लिए सुपरयुजर के रूप में चलने के लिए सेटयूड बिट सेट), तो हमलावर इस भेद्यता का उपयोग प्रभावित मशीन पर सुपर उपयोगकर्ता विशेषाधिकार प्राप्त करने के लिए कर सकता है।

हमलावर कुछ बगों का लाभ उठाने के लिए आंतरिक चर मानों को भी संशोधित कर सकता है।

इस उदाहरण के साथ:

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

ढेर जो बड़े होते हैं
स्टैक बफर ओवरफ्लो के विषय के भीतर, अधिकांशतः चर्चा की जाने वाली लेकिन दुर्लभ रूप से देखी जाने वाली वास्तुकला वह है जिसमें स्टैक विपरीत दिशा में बढ़ता है। आर्किटेक्चर में यह बदलाव अधिकांशतः स्टैक बफर ओवरफ्लो समस्या के समाधान के रूप में सुझाया जाता है क्योंकि स्टैक बफर का कोई भी ओवरफ्लो जो एक ही स्टैक फ्रेम के भीतर होता है, रिटर्न पॉइंटर को ओवरराइट नहीं कर सकता है। चूंकि, पिछले स्टैक फ्रेम से बफर में होने वाला कोई भी ओवरफ्लो अभी भी रिटर्न पॉइंटर को ओवरराइट करेगा और बग के दुर्भावनापूर्ण शोषण की अनुमति देगा। उदाहरण के लिए, ऊपर दिए गए उदाहरण में, रिटर्न पॉइंटर for  अधिलेखित नहीं किया जाएगा क्योंकि ओवरफ्लो वास्तव में स्टैक फ्रेम के भीतर होता है. चूंकि, क्योंकि बफर जो कॉल के समय बहता है  पिछले स्टैक फ़्रेम में रहता है, जिसके लिए रिटर्न पॉइंटर   बफर की समानता में संख्यात्मक रूप से अधिक मेमोरी एड्रेस होगा। इसका मतलब यह है कि रिटर्न पॉइंटर के अतिरिक्त   ओवरराइट किया जा रहा है, के लिए रिटर्न पॉइंटर   अधिलेखित हो जाएगा। अधिक से अधिक, इसका मतलब यह है कि स्टैक को विपरीत दिशा में बढ़ने से कुछ विवरण बदल जाएंगे कि कैसे स्टैक बफर ओवरफ्लो शोषक हैं, लेकिन यह शोषक बगों की संख्या को महत्वपूर्ण रूप से कम नहीं करेगा।

सुरक्षा योजनाएँ
पिछले कुछ वर्षों में, दुर्भावनापूर्ण स्टैक बफर ओवरफ़्लो शोषण को रोकने के लिए कई नियंत्रण-प्रवाह अखंडता योजनाएं विकसित की गई हैं। इन्हें सामान्यतः तीन श्रेणियों में वर्गीकृत किया जा सकता है:


 * पता लगाएं कि एक स्टैक बफर ओवरफ्लो हुआ है और इस प्रकार निर्देश सूचक को दुर्भावनापूर्ण कोड पर पुनर्निर्देशित करने से रोकता है।
 * सीधे स्टैक बफर ओवरफ्लो का पता लगाए बिना स्टैक से दुर्भावनापूर्ण कोड के निष्पादन को रोकें।
 * मेमोरी स्पेस को ऐसे रेंडमाइज करें कि एक्जीक्यूटेबल कोड ढूंढना अविश्वसनीय हो जाए।

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

गैर-निष्पादन योग्य ढेर
स्टैक बफर अतिप्रवाह शोषण को रोकने के लिए एक अन्य दृष्टिकोण स्टैक मेमोरी क्षेत्र पर एक मेमोरी नीति लागू करना है जो स्टैक से निष्पादन की अनुमति नहीं देता है (W^X, XOR एक्सक्यूट लिखें)। इसका अर्थ है कि स्टैक से शेलकोड को निष्पादित करने के लिए एक हमलावर को या तो मेमोरी से निष्पादन सुरक्षा को अक्षम करने का विधि ढूँढना होगा, या अपने शेलकोड पेलोड को मेमोरी के गैर-संरक्षित क्षेत्र में रखने का विधि ढूँढना होगा। यह विधि अब अधिक लोकप्रिय हो रही है कि अधिकांश डेस्कटॉप प्रोसेसर में नो-एक्ज़ीक्यूट फ़्लैग के लिए हार्डवेयर समर्थन उपलब्ध है।

जबकि यह विधि कैनोनिकल स्टैक स्मैशिंग शोषण को रोकती है, स्टैक ओवरफ्लो का अन्य विधि से शोषण किया जा सकता है। सबसे पहले, ढेर जैसे असुरक्षित मेमोरी क्षेत्रों में शेलकोड को स्टोर करने के विधि ढूँढना सामान्य है, और इसलिए शोषण के विधि में बहुत कम बदलाव की आवश्यकता है।

एक अन्य हमला शेलकोड निर्माण के लिए तथाकथित रिटर्न-टू-लिबक हमला विधि है। इस हमले में दुर्भावनापूर्ण पेलोड स्टैक को शेलकोड के साथ नहीं, बल्कि एक उचित कॉल स्टैक के साथ लोड करेगा, जिससे निष्पादन मानक लाइब्रेरी कॉल की एक श्रृंखला के लिए किया जा सके, सामान्यतः मेमोरी निष्पादन सुरक्षा को अक्षम करने और शेलकोड को सामान्य रूप से चलाने की अनुमति देने के प्रभाव से। यह काम करता है क्योंकि निष्पादन वास्तव में कभी भी स्टैक के लिए वैक्टर नहीं होता है।

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

यादृच्छिकीकरण
कोड को डेटा से अलग करने के अतिरिक्त, एक अन्य न्यूनीकरण तकनीक निष्पादन फंक्शन के मेमोरी स्पेस में यादृच्छिककरण का परिचय देना है। चूंकि हमलावर को यह निर्धारित करने की आवश्यकता होती है कि उपयोग किए जा सकने वाले निष्पादन योग्य कोड कहाँ रहता है, या तो एक निष्पादन योग्य पेलोड प्रदान किया जाता है (एक निष्पादन योग्य स्टैक के साथ) या कोड पुन: उपयोग जैसे कि ret2libc या रिटर्न-ओरिएंटेड प्रोग्रामिंग (ROP) का उपयोग करके बनाया गया है। एक अवधारणा के रूप में मेमोरी लेआउट को यादृच्छिक बनाना, हमलावर को यह जानने से रोकेगा कि कोई कोड कहां है। चूँकि , कार्यान्वयन सामान्यतः सब कुछ यादृच्छिक नहीं करेगा; सामान्यतः निष्पादन योग्य ही एक निश्चित पते पर लोड होता है और इसलिए जब ASLR (एड्रेस स्पेस लेआउट रेंडमाइजेशन) को एक गैर-निष्पादन योग्य स्टैक के साथ जोड़ा जाता है, तब भी हमलावर मेमोरी के इस निश्चित क्षेत्र का उपयोग कर सकता है। इसलिए, सभी कार्यक्रमों को स्थिति-स्वतंत्र कोड स्थिति-स्वतंत्र निष्पादन योग्य (स्थिति-स्वतंत्र निष्पादन योग्य) के साथ संकलित किया जाना चाहिए, जिससे स्मृति के इस क्षेत्र को भी यादृच्छिक बनाया जा सके। रैंडमाइजेशन की एन्ट्रापी कार्यान्वयन से कार्यान्वयन तक भिन्न होती है और एक कम पर्याप्त एन्ट्रापी अपने आप में एक समस्या हो सकती है जो मेमोरी स्पेस को यादृच्छिक रूप से मजबूर करने के स्थितियों में एक समस्या हो सकती है।

बायपास काउंटरमेशर्स
पिछले न्यूनीकरण शोषण के कदमों को कठिन बना देते हैं। लेकिन यदि कुछ भेद्यताएं उपस्थित हैं या कुछ शर्तों को पूरा किया जाता है तो स्टैक बफर ओवरफ्लो का लाभ उठाना अभी भी संभव है।

प्रारूप स्ट्रिंग भेद्यता शोषण के साथ सूचना रिसाव
एक हमलावर कमजोर फंक्शन में स्मृति स्थानों को प्रकट करने के लिए स्वरूप स्ट्रिंग भेद्यता का लाभ उठाने में सक्षम है।

गैर निष्पादन योग्य स्टैक बायपास
जब डेटा निष्पादन प्रतिबंध को स्टैक तक किसी भी निष्पादन पहुंच को प्रतिबंधित करने के लिए सक्षम किया जाता है, तो हमलावर अभी भी ओवरराइट किए गए रिटर्न एड्रेस (निर्देश सूचक) का उपयोग कोड खंड में डेटा को इंगित करने के लिए कर सकता है (.text लिनक्स पर) या प्रोग्राम के हर दूसरे निष्पादन योग्य खंड। लक्ष्य उपस्थित कोड का पुन: उपयोग करना है।

रोप चेन
प्रोग्राम के रिटर्न इंस्ट्रक्शन (x86 में रिट) से थोड़ा पहले रिटर्न पॉइंटर को ओवरराइट करना सम्मलित है। नए रिटर्न पॉइंटर और रिटर्न इंस्ट्रक्शन के बीच के निर्देशों को निष्पादित किया जाएगा और रिटर्न इंस्ट्रक्शन शोषक द्वारा नियंत्रित पेलोड पर वापस आ जाएगा।

जोप चैन
जंप ओरिएंटेड प्रोग्रामिंग एक ऐसी तकनीक है जो रिट निर्देश के अतिरिक्त कोड का पुन: उपयोग करने के लिए जंप निर्देशों का उपयोग करती है।

रैंडमाइजेशन बायपास
64-बिट प्रणाली पर ASLR प्राप्ति की एक सीमा यह है कि यह स्मृति प्रकटीकरण और सूचना रिसाव हमलों के प्रति संवेदनशील है। हमलावर सूचना रिसाव हमले का उपयोग करके एकल फ़ंक्शन पते का खुलासा करके ROP लॉन्च कर सकता है। निम्नलिखित खंड ASLR सुरक्षा को तोड़ने के लिए समान उपस्थित रणनीति का वर्णन करता है।

उल्लेखनीय उदाहरण

 * 1988 में मॉरिस कीड़ा यूनिक्स फिंगर प्रोटोकॉल सर्वर में स्टैक बफर ओवरफ्लो का दोहन करके आंशिक रूप से फैल गया।
 * 2003 में SQL स्लैमर माइक्रोसॉफ्ट के SQL सर्वर में स्टैक बफर ओवरफ्लो का शोषण करके फैल गया।
 * 2003 में माइक्रोसॉफ्ट वितरित घटक वस्तु मॉडल सर्विस में स्टैक बफर ओवरफ्लो का लाभ उठाकर विस्फ़ोटक कीड़ा फैल गया।
 * इंटरनेट सुरक्षा प्रणाली ब्लैकआईसीई डेस्कटॉप एजेंट में स्टैक बफर ओवरफ्लो का दोहन करके 2004 में मजाकिया कीड़ा फैल गया। nweaver/login_witty.txt]
 * Wii के कुछ उदाहरण हैं जो इच्छानुसार कोड को एक असंशोधित प्रणाली पर चलाने की अनुमति देते हैं। द ट्वाइलाइट हैक जिसमें द लीजेंड ऑफ ज़ेल्डा: ट्वाइलाइट प्रिंसेस में मुख्य पात्र के घोड़े को एक लंबा नाम देना सम्मलित है, और सुपर स्मैश ब्रदर्स ब्रॉल के लिए स्मैश स्टैक जिसमें विशेष रूप से तैयार फ़ाइल को इन-गेम स्तर के संपादक में लोड करने के लिए एसडी कार्ड का उपयोग करना सम्मलित है। चूंकि दोनों का उपयोग किसी भी इच्छानुसार कोड को निष्पादित करने के लिए किया जा सकता है, बाद वाले का उपयोग अधिकांशतः ब्रॉल को केवल मॉड (वीडियो गेमिंग) के साथ पुनः लोड करने के लिए किया जाता है।

यह भी देखें

 * एक्सेक्यूटिव शील्ड
 * ढेर अतिप्रवाह
 * पूर्णांक अतिप्रवाह
 * एनएक्स बिट - मेमोरी के क्षेत्रों के लिए नो-एक्ज़ीक्यूट बिट
 * सुरक्षा-उन्नत लिनक्स
 * स्टैक ओवरफ़्लो - जब स्टैक स्वयं ओवरफ्लो हो जाता है
 * भंडारण उल्लंघन