मैं Quora पर एक उत्तर पढ़ रहा था जहां मैंने सामना किया कि कुछ सरल के रूप में:

char* inputString;
printf(inputString);

एक सुरक्षा छेद है।

मुझे लगता है कि inputString केवल अनैतिक रूप से नहीं है, लेकिन दो बयानों के बीच कुछ बाहरी इनपुट के साथ आरंभिक है।

कैसे वास्तव में यह एक सुरक्षा छेद है?

Quora पर मूल उत्तर यहां था:

यदि C और C ++ सर्वश्रेष्ठ प्रदर्शन देते हैं, तो हम अभी भी अन्य भाषाओं में कोड क्यों करते हैं?

लेकिन यह इस दावे के लिए कोई अतिरिक्त संदर्भ प्रदान नहीं करता है।

1
Vishwas 13 नवम्बर 2015, 16:49

3 जवाब

सबसे बढ़िया उत्तर

मेरा मानना है कि इनपुट स्ट्रिंग एक स्ट्रिंग है जो आपको उपयोगकर्ता से मिली है, न कि केवल एक अनइंस्टाल्यूटेड वैल्यू के लिए।

समस्या यह है कि उपयोगकर्ता कर सकता है

  • कार्यक्रम को क्रैश करें: printf ("%s%s%s%s%s%s%s%s%s%s%s%s")
  • स्टैक देखें: printf ("%08x %08x %08x %08x %08x\n");
  • किसी भी स्थान पर मेमोरी देखें,
  • या यहां तक कि प्रक्रिया मेमोरी में लगभग किसी भी स्थान पर एक पूर्णांक लिखें।

इससे एक हमलावर सक्षम हो जाता है:

  • विशेष कार्यक्रम झंडे को अधिलेखित करें जो एक्सेस विशेषाधिकारों को नियंत्रित करते हैं
  • स्टैक, फ़ंक्शन पॉइंटर्स आदि पर ओवरराइट रिटर्न एड्रेस

यह सब बहुत अच्छी तरह से समझाया गया है

10
Jan Rüegg 13 नवम्बर 2015, 13:59

यह सिर्फ एक सुरक्षा समस्या नहीं है, लेकिन यह बिल्कुल भी काम नहीं करेगा, क्योंकि सूचक प्रारंभिक नहीं है। इस संदर्भ में, प्रोग्राम को क्रैश करना = अब नहीं चलना एक (सुरक्षा) समस्या हो सकती है, यह निर्भर करता है कि प्रोग्राम क्या करता है और किस संदर्भ में चलता है।

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

कुछ ऐसा ही, यानी। गलत अनियंत्रित उपयोगकर्ता इनपुट के कारण बहुत अधिक बाइट्स देना, जैसे हुआ। ज्ञात "हार्टब्लड" बग बहुत समय पहले नहीं था, जो कि एक बहुत बड़ी वैश्विक समस्या थी। ... पहला प्रिंटफ़ पैरामीटर तय किया जाना चाहिए, किसी भी चर से नहीं आना चाहिए।

अन्य प्लेसहोल्डर संयोजन भी संभव हैं, संभावित प्रभावों की एक विस्तृत श्रृंखला के लिए अग्रणी (सीपीयू में गलत फ्लोटिंग पॉइंट सिग्नलों की पीढ़ी सहित, जो वास्तुकला, इत्यादि के आधार पर अधिक गंभीर समस्याएं पैदा कर सकता है।)

8
deviantfan 16 नवम्बर 2015, 01:33
char* inputSting; 
printf(inputSting);

एक असंक्रमित स्ट्रिंग को प्रिंट करना अपरिभाषित व्यवहार है। अपरिभाषित व्यवहार से प्रभाव मुद्रण मूल्यों से लेकर segfaults और अन्य गंदेपन तक हो सकता है। इस तरह के अप्रत्याशित पैटर्न का फायदा उठाया जा सकता है और इस तरह सुरक्षा से समझौता किया जा सकता है।

लेकिन इससे भी महत्वपूर्ण बात यह है कि कोई भी इसे नहीं लिखेगा क्योंकि यह एक जोखिम के अलावा कुछ भी सार्थक नहीं करता है।

1
mag 13 नवम्बर 2015, 13:56