2011-04-04 9 views
7

यह प्रश्न C99 में परिवर्तनीय लंबाई सरणी के बारे में this one से अलग है।डेस्कटॉप ओएस पर सी कंपाइलर्स कितने मेमोरी पेज स्टैक ओवरफ़्लो का पता लगाने के लिए उपयोग करते हैं?

जवाब का कहना है ढेर में चर लंबाई सरणियों (या एक निश्चित आकार के बड़े सरणियों) के आवंटन के साथ एक खतरा यह है कि आवंटन चुपचाप, कहते हैं करने के लिए विरोध के रूप में, विफल हो सकता है यह है कि malloc बुला, जो स्पष्ट रूप से बताता है कॉलर क्या आवंटन सफल हुआ।

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

क्या कोई यह जानता है कि इस पहचान के लिए आमतौर पर कितने पेज आवंटित किए जाते हैं? मुझे लगता है कि यह कम से कम 4KiB होगा, लेकिन यह और भी हो सकता है। क्या यह संकलक या ओएस द्वारा बनाई गई पसंद है, और किसी भी मामले में, इसे बदलने का कोई तरीका है?

+1

अच्छा सवाल है, लेकिन किसी को यह टिप्पणी करनी चाहिए कि मॉलोक सभी प्रणालियों पर बताने की व्याख्या नहीं करता है कि आवंटन उत्तराधिकारी है या नहीं। यह बाद में पहले पहुंच पर असफल हो सकता है (कम से कम कुछ सिस्टम पर - आशावादी आवंटन या स्मृति ओवरकमिटमेंट देखें)। – flolo

+0

@flolo मैंने लगभग इसके बारे में टिप्पणी की, लेकिन फिर मैंने इसे छोड़ने का फैसला किया क्योंकि स्मृति ओवरकमिट वास्तव में एक ओएस मुद्दा है, न कि एक भाषा। चूंकि यह अनिर्धारित व्यवहार का कारण नहीं बनता है, यह आवंटन प्रक्रिया, या किसी अन्य प्रक्रिया को स्पष्ट रूप से मारने का कारण बनता है। –

+0

ओएसएस-सुरक्षा मेलिंग सूची पर [क्वालिज़ सिक्योरिटी एडवाइजरी - द स्टैक क्लैश] (http://www.openwall.com/lists/oss-security/2017/06/19/1) भी देखें। यह कुछ साफ चाल, और गार्ड पेज की इसकी सुंदर हानि से पता चलता है। यह आश्चर्यजनक है कि वे इसके साथ कितने ओएस ले गए। – jww

उत्तर

6

विंडोज पर, यह एक 4 केबी पृष्ठ (कम से कम x86 पर) है: Description of the stack checking for Windows NT-based applications देखें।

यह स्वत: विकास विधि एक गार्ड पेज, एक सुरक्षित, अप्रतिबद्ध, स्मृति पेज कि स्मृति के लिए प्रतिबद्ध भाग के साथ सटा हुआ है उपयोग करता है। जब एप्लिकेशन गार्ड पृष्ठ को छूता है, तो ऑपरेटिंग सिस्टम उस पृष्ठ को करता है और अगला अनुमोदित पृष्ठ नया गार्ड पेज बन जाता है। स्वचालित स्टैक वृद्धि केवल गार्ड पृष्ठ के लिए काम करती है और स्टैक मेमोरी 4K, या एक पृष्ठ, वृद्धि में बढ़नी चाहिए। से पहले ही छू लेती गार्ड पेज, एक सामान्य पृष्ठ दोष अपवाद होता है और अप्रत्याशित व्यवहार कर सकते हैं परिणाम आवेदन ढेर स्मृति का एक और सुरक्षित लेकिन अप्रतिबद्ध पेज को छूती है तो।

...

गलती, संकलक __chkstk (कॉल को रोकने के लिए) प्रत्येक समय स्थानीय आवंटन 4K से अधिक कार्य करते हैं। विंडोज एनटी __chkstk() फ़ंक्शन एमएस-डॉस संस्करण के रूप में स्पष्ट रूप से स्टैक ओवरफ़्लो की जांच नहीं करता है। यह अनुरोधित आवंटन के लिए वर्तमान स्टैक सूचक स्थान से प्रत्येक 4K मेमोरी पतों को स्पर्श करता है। यह उचित अनुक्रम में गार्ड पृष्ठों को ट्रिगर करता है और आवश्यकतानुसार स्टैक पर अतिरिक्त मेमोरी करता है।

जीसीसी के लिए, GCC Stack checking

मुझे यकीन है कि कैसे/अगर C99 के VLA के WinNT व्यवहार बदल जाएगा नहीं कर रहा हूँ।

7

मुझे पूरा यकीन है कि सबसे आम अभ्यास केवल एक पृष्ठ का उपयोग कर रहा है, आमतौर पर 4k। हालांकि, एक अच्छा कंपाइलर अनुक्रमिक रूप से फ़ंक्शन एंट्री (या VLA/alloca आवंटन पर) पृष्ठ के आकार के मुकाबले एक स्टैक फ्रेम के प्रत्येक पृष्ठ तक पहुंचने का प्रयास करेगा ताकि यह सुनिश्चित किया जा सके कि एक गार्ड पेज मारा गया है। जीसीसी वैकल्पिक रूप से ऐसा कर सकता है; देखें: http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options और -fstack-check विकल्प।

संबंधित मुद्दे