बफर ओवरफ्लो एक बड़ा है। सी में कुछ भी डिफ़ॉल्ट रूप से रेंज-चेक नहीं किया गया है, इसलिए बफर को ओवरराइट करना बहुत आसान है। एक मानक लाइब्रेरी फ़ंक्शन है, gets()
जिसे बफर के अतिप्रवाह से रोका नहीं जा सकता है, और लगभग कभी भी उपयोग नहीं किया जाना चाहिए।
शोषण को रोकने के लिए कुछ कार्यान्वयन-स्तर की तकनीकें हैं, जैसे कि ढेर ब्लॉकों को खंगालना, लेकिन यह स्थानीय बफर में बफर ओवरफ्लो को रोक नहीं पाएगा, जो अक्सर दिलचस्प चीजें कर सकता है जैसे पता बदलने के लिए एक फ़ंक्शन वापस आ जाएगा।
सी में कोई अच्छा सामान्य समाधान नहीं है। कई लाइब्रेरी फ़ंक्शंस में ऐसे संस्करण हैं जो उस राशि को सीमित करेंगे जो वे लिखेंगे। यद्यपि यह गणना करना कि अनाड़ी हो सकता है। सॉफ्टवेयर है कि परीक्षण में ढेर बफर overflows का पता लगा सकते हैं, जब तक उचित परीक्षण चलाया जाता है, और स्टैक ओवरफ्लो अक्सर परीक्षण में एक दुर्घटना के रूप में दिखाई देगा। इसके अलावा, यह सावधानीपूर्वक कोडिंग और कोड समीक्षा की बात है।
एक संबंधित समस्या बफर में लिखने की समस्या एक चरित्र से बहुत छोटी है, यह भूल जाते हैं कि एक सी स्ट्रिंग जो n वर्ण लंबा है उसे '\0'
टर्मिनेटर की वजह से स्मृति में n + 1 वर्ण की आवश्यकता होती है। यदि हमलावर टर्मिनेटर के बिना एक स्ट्रिंग को स्टोर करने का प्रबंधन कर सकता है, तो एक स्ट्रिंग की अपेक्षा करने वाला कोई भी सी फ़ंक्शन एक शून्य बाइट हिट होने तक प्रसंस्करण जारी रखेगा, जिसके परिणामस्वरूप वांछित जानकारी की प्रतिलिपि बनाने या आउटपुट करने में अधिक परिणाम हो सकता है (या डॉस हमले के लिए संरक्षित मेमोरी को हिट करना। )। समाधान, फिर से, जागरूकता, देखभाल और कोड समीक्षा है।
printf()
परिवार के साथ एक और जोखिम है । यदि आप कभी लिखते हैं char * str; ... printf(str);
, तो आप अपने आप को समस्याओं के लिए सेट कर रहे हैं यदि str
मुद्रित होने पर '%' होता है। %n
प्रारूप के निर्देश की अनुमति देता है printf()
स्मृति में लिखने के लिए। समाधान है printf("%s", str);
या puts(str);
। (इसके अलावा, C99 का उपयोग snprintf()
करने के बजाय sprintf()
।)
अहस्ताक्षरित पूर्णांक का उपयोग करना, विशेष रूप से लूप इंडेक्स के रूप में, समस्याएं पैदा कर सकता है। यदि आप एक छोटे से नकारात्मक मान को असाइन करते हैं, तो आपको एक बड़ा सकारात्मक मूल्य मिलता है। यह किसी चीज़ के केवल N उदाहरणों को संसाधित करने जैसी चीज़ों को सीमित कर सकता है, या जैसे सीमित कार्यों में strncpy()
। सभी अहस्ताक्षरित पूर्णांक की जांच करें। आप बचना चाह सकते हैं unsigned short
, क्योंकि उनमें से एक में एक बड़ा मूल्य एक में बड़े सकारात्मक मूल्य में बदल जाएगा int
।
यह मत भूलो कि सी में एक चरित्र स्थिर, वास्तव में एक है int
। जैसे कुछ लिखना char c; while((c = getchar()) != EOF) ...
आसानी से विफल हो सकता है, क्योंकि EOF
एक में प्रतिनिधित्व करने योग्य नहीं होगा char
।
और भी बहुत सी विशिष्ट सी गलतियाँ हैं जिनके बारे में मैं सोच सकता हूँ, लेकिन ये सुरक्षा समस्याओं का कारण बन सकती हैं।