क्या एक पुरानी सी संकलक का उपयोग सुरक्षा जोखिम है?


139

हमारे पास उत्पादन में कुछ निर्माण प्रणालियां हैं जिनकी किसी को परवाह नहीं है और ये मशीनें GCC के प्राचीन संस्करणों जैसे GCC 3 या GCC 2 को चलाती हैं।

और मैं प्रबंधन को इसे और अधिक हाल के लिए अपग्रेड करने के लिए राजी नहीं कर सकता: वे कहते हैं, "अगर टूट नहीं गया है, तो इसे ठीक न करें"।

चूंकि हम एक बहुत पुराने कोड बेस (80 के दशक में लिखे गए) को बनाए रखते हैं, इसलिए यह C89 कोड इन कंपाइलरों पर ठीक-ठीक संकलन करता है।

लेकिन मुझे यकीन नहीं है कि इन पुराने सामानों का उपयोग करना अच्छा है।

मेरा सवाल यह है कि:

एक पुराने सी संकलक का उपयोग कर संकलित कार्यक्रम की सुरक्षा से समझौता कर सकते हैं?

अपडेट करें:

समान कोड विजुअल स्टूडियो 2008 द्वारा विंडोज लक्ष्यों के लिए बनाया गया है, और MSVC अभी तक C99 या C11 का समर्थन नहीं करता है (मुझे नहीं पता कि नया MSVC करता है), और मैं नवीनतम GCC का उपयोग करके अपने लिनक्स बॉक्स पर इसका निर्माण कर सकता हूं। इसलिए यदि हम एक नए GCC में बस छोड़ देंगे, तो यह पहले की तरह ही ठीक होगा।


5
दिलचस्प सवाल - यह एक त्वरित रूप से पढ़ने लायक भी हो सकता है - Developers.slashdot.org/story/13/10/29/2150211/… .. इसलिए नए संकलनकर्ता भी अनुकूलन करते समय सुरक्षा से समझौता कर सकते हैं।
नील

6
उन पुराने जीसीसी संस्करणों का समर्थन ASLR के लिए PIC / PIE के संकलन के लिए करते हैं? क्या वे स्टैक कैनरी का समर्थन करते हैं? डब्ल्यू ^ एक्स (एनएक्स)? यदि नहीं, तो कमजोरियों के लिए मितली की कमी उन्नयन का एक अच्छा कारण है।
EOF

12
बस gcc 4.x से चेतावनी को देखते हुए आप अपने पास मौजूद मौजूदा सुरक्षा छेद का पूरा भार तुरंत प्रकट कर सकते हैं।
ऑरेंजडॉग

7
@ ऑरेंजडॉग: क्यों जीसीसी 4.x? gcc6 वर्तमान रिलीज़ सीरीज़ है, और gcc 5 कुछ समय के लिए आसपास रहा है। लेकिन हाँ, -O3 -Wall -Wextra -fsanitize=undefinedआधुनिक gcc और clang से पहचानी गई किसी भी समस्या को ठीक करने में मदद करनी चाहिए।
पीटर कॉर्ड्स

4
@OrangeDog जीसीसी मार्केटिंग संस्करण संख्या में चला गया है। GCC 5 एक प्रमुख संस्करण टक्कर के हकदार थे, क्योंकि उन्होंने डिफ़ॉल्ट C और C ++ मानकों और libstdc ++ ABI को बदल दिया था। जीसीसी 6 को 5.1 कहा जाना चाहिए था।
zwol

जवाबों:


102

वास्तव में मैं इसके विपरीत तर्क दूंगा।

ऐसे कई मामले हैं जहां व्यवहार C मानक द्वारा अपरिभाषित है लेकिन जहां यह स्पष्ट है कि किसी दिए गए प्लेटफ़ॉर्म पर "डंब कंपाइलर" के साथ क्या होगा। दो अलग-अलग प्रकार के चर हालांकि एक ही मेमोरी पर हस्ताक्षर किए गए पूर्णांक को अतिप्रवाह या एक्सेस करने की अनुमति देने जैसे मामले।

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

"पारंपरिक" व्यवहार को पुनर्स्थापित करने के लिए कंपाइलर स्विच हैं (-fwrapv और -fno-सख्त-अलियासिंग जो मैंने ऊपर उल्लिखित दोनों के लिए किया है), लेकिन पहले आपको उनके बारे में जानना होगा।

हालांकि सिद्धांत रूप में एक कंपाइलर बग एक सुरक्षा छेद में आज्ञाकारी कोड को बदल सकता है मैं इस बात के जोखिम पर विचार करूंगा कि चीजों की भव्य योजना में यह लापरवाही है।


13
लेकिन यह तर्क दोनों तरीकों से काम करता है। यदि एक संकलक ने "अपरिभाषित व्यवहार" की भविष्यवाणी की है, तो इसका दुर्भावनापूर्ण उपयोग करना यकीनन अधिक आसान हो सकता है ...
एंड्रे

18
@Andre संकलित कोड का वैसे भी अप्रभावी व्यवहार है। यही है, एक बार कोड संकलित किए जाने के बाद, कोई भी अप्रत्याशित व्यवहार अब उस विशेष संकलित संस्करण में अनुमानित है।
user253751

6
people who treated C like a "portable assembler"यह नहीं है, हालांकि सी क्या है?
अधिकतम

10
@Max यह उत्तर इस तथ्य के बारे में सटीक चेतावनी देता है कि आधुनिक ऑप्टिमाइज़र के कारण "पोर्टेबल असेंबलर" धारणा व्यवहार में कम से कम पुरानी है। और मैं यह तर्क दूंगा कि यह कभी भी शुरू करने के लिए वैचारिक रूप से सही नहीं था।
थियोडोरोस चटजिआनियाकिस

6
यहां उन लोगों के लिए कोई सहानुभूति नहीं है जो अपरिभाषित व्यवहार पर भरोसा करते हैं और बाद में वे जो बोते हैं उसे काटना शुरू करते हैं। इसका मतलब यह नहीं है कि नए संकलक स्वाभाविक रूप से कम सुरक्षित हैं - इसका मतलब है कि गैर-असंगत कोड एक समय बम था। इसके अनुसार दोष का अनुमोदन किया जाना चाहिए।
अंडरस्कोर_ड

52

कार्रवाई के दोनों पाठ्यक्रमों में जोखिम हैं।


पुराने कंपाइलरों में परिपक्वता का लाभ होता है, और उनमें जो कुछ भी टूट गया था वह शायद (लेकिन इसकी कोई गारंटी नहीं है) सफलतापूर्वक काम किया गया है।

इस मामले में, एक नया संकलक नए बग का एक संभावित स्रोत है।


दूसरी ओर, नए संकलक अतिरिक्त टूलिंग के साथ आते हैं :

  • GCC और Clang दोनों में अब सैनिटाइज़र हैं जो विभिन्न प्रकार के अपरिभाषित व्यवहारों का पता लगाने के लिए रनटाइम का साधन कर सकते हैं (पिछले साल Google Compiler टीम के चांडलर कारूथ ने दावा किया था कि उन्हें उम्मीद है कि वे पूर्ण कवरेज तक पहुँच सकते हैं)
  • क्लैंग, कम से कम, सुविधाओं को सख्त करना , उदाहरण के लिए कंट्रोल फ्लो इंटीग्रिटी नियंत्रण प्रवाह के हाय-जैक का पता लगाने के बारे में है, स्टैक मुंहतोड़ हमलों (डेटा भाग से स्टैक के नियंत्रण-प्रवाह वाले हिस्से को अलग करके) से बचाने के लिए सख्त औजार भी हैं। ; सख्त विशेषताएं आम तौर पर कम ओवरहेड होती हैं (<1% सीपीयू ओवरहेड)
  • Clang / LLVM भी libFuzzer पर काम कर रहा है , जो इंस्ट्रूमेंटेड फ़ज़िंग यूनिट-टेस्ट बनाने के लिए एक टूल है, जो टेस्ट के इनपुट स्पेस को स्मार्टली टेस्ट करता है (इनपुट को ट्विक करके , नॉट-एज़-एक्सटर्नल एक्ज़ीक्यूटेड पाथ्स को लेने के लिए।

सैनिटाइज़र (एड्रेस सेनिटाइज़र, मेमोरी सेनिटाइज़र या अनफाइंड बिहेवियर सैनिटाइज़र) के साथ अपने बाइनरी को इंस्ट्रूमेंट करना और फिर इसे फ़्यूज़ करना ( उदाहरण के लिए अमेरिकन फ़ज़ी लोप का उपयोग करना ) ने कई हाई-प्रोफाइल सॉफ्टवेयर्स में कमजोरियों को उजागर किया है, उदाहरण के लिए इस LWN.net लेख को देखें

जब तक आप अपने कंपाइलर को अपग्रेड नहीं करते हैं, वे नए उपकरण और भविष्य के सभी उपकरण आपके लिए दुर्गम हैं।

एक कमज़ोर कंपाइलर पर रहकर, आप अपने सिर को रेत में डाल रहे हैं और उंगलियों को पार कर रहे हैं, जो कोई भेद्यता नहीं है। यदि आपका उत्पाद उच्च मूल्य का लक्ष्य है, तो मैं आपसे पुनर्विचार करने का आग्रह करता हूं।


ध्यान दें: यहां तक ​​कि अगर आप उत्पादन संकलक को अपग्रेड नहीं करते हैं, तो आप किसी भी तरह से भेद्यता की जांच करने के लिए एक नए संकलक का उपयोग करना चाह सकते हैं; ध्यान रखें कि चूंकि वे अलग-अलग संकलक हैं, इसलिए गारंटी कम है।


1
+1 उन मामलों का उल्लेख करने की जहमत उठाने के लिए जिनमें नए कंपाइलर अन्य उत्तरों के 'b- लेकिन मेरे अच्छे पुराने UB' बैंडवागन पर जमा होने के बजाय अधिक सुरक्षित हो सकते हैं। यह उन कई अन्य सुधारों में शीर्ष पर है जो वे प्रदान करते हैं जो सीधे सुरक्षा से संबंधित नहीं हैं, लेकिन उचित आधुनिक होने के लिए और भी अधिक प्रेरणा प्रदान करते हैं।
अंडरस्कोर_ड

हालांकि यह 'अस्पष्टता के माध्यम से सुरक्षा' की वकालत करने जैसा लगता है; पुराने संकलक को प्रभावित करने वाले कीड़े ज्ञात और सार्वजनिक हैं। जबकि मैं मानता हूं कि नए कंपाइलर बग का परिचय देंगे, ये बग्स अभी तक सार्वजनिक नहीं हैं जैसे कि पिछले संस्करणों के लिए हैं, जो कि कुछ सुरक्षा है यदि आप अक्सर एप्लिकेशन को अपडेट कर रहे हैं।
6P4C

Chandler Carruth बहुत प्यारा है, और ऐसी अद्भुत चीजों की बात करता है। अगर मैं कर सकता तो मैं उससे शादी कर लेता।
डैनियल कामिल कोजार

46

आपके संकलित कोड में बग होते हैं जिनका शोषण किया जा सकता है। कीड़े तीन स्रोतों से आते हैं: आपके स्रोत कोड में कीड़े, कंपाइलर और लाइब्रेरी में बग, और आपके स्रोत कोड में अपरिभाषित व्यवहार जो कंपाइलर बग में बदल जाता है। (अपरिभाषित व्यवहार एक बग है, लेकिन संकलित कोड में अभी तक बग नहीं है। उदाहरण के लिए, C या C ++ में i = i ++; बग है, लेकिन आपके संकलित कोड में यह i 1 से बढ़ सकता है और ठीक हो सकता है, या सेट हो सकता है। मैं कुछ कबाड़ और एक बग हो)।

आपके संकलित कोड में बगों की दर परीक्षण के कारण और ग्राहक बग रिपोर्ट के कारण कीड़े को ठीक करने के लिए संभवतः कम है। तो शुरू में बड़ी संख्या में कीड़े हो सकते हैं, लेकिन यह कम हो गया है।

यदि आप एक नए संकलक में अपग्रेड करते हैं, तो आप बग को खो सकते हैं जो संकलक कीड़े द्वारा पेश किए गए थे। लेकिन ये कीड़े सभी कीड़े हैं कि आपके ज्ञान के लिए कोई नहीं मिला और किसी ने शोषण नहीं किया। लेकिन नए कंपाइलर में बग हो सकते हैं, और महत्वपूर्ण रूप से नए कंपाइलरों में अपरिभाषित व्यवहार को संकलित कोड में बग्स में बदलने की एक मजबूत प्रवृत्ति है।

इसलिए आपके संकलित कोड में आपके पास बहुत सारे नए बग होंगे; सभी बग जिन्हें हैकर्स ढूंढ सकते थे और उनका शोषण कर सकते थे। और जब तक आप पूरी तरह से परीक्षण नहीं करते हैं, और लंबे समय तक बग ढूंढने के लिए ग्राहकों के साथ अपना कोड छोड़ देते हैं, यह कम सुरक्षित होगा।


6
तो दूसरे शब्दों में ... यह बताने का कोई आसान तरीका नहीं है कि कंपाइलर किन समस्याओं का परिचय देता है, और आप सभी को स्विच करके अज्ञात मुद्दों का एक अलग सेट प्राप्त करते हैं?
जेरेमी काटो

1
@JeremyKato: अच्छी तरह से, वहाँ कुछ मामलों में जहां आप कर रहे हैं भी ज्ञात समस्याओं का एक अलग सेट हो रही। मुझे यकीन नहीं है कि संकलक में क्या ज्ञात सुरक्षा खामियां हैं, लेकिन एक ठोस उदाहरण के लिए मान लीजिए कि एक नए संकलक के लिए अद्यतन करने का मतलब है कि नवीनतम लेबेक लेने में सक्षम है (जबकि पुराने का उपयोग करने में सक्षम नहीं होने का मतलब है ऐसा करने के लिए), तो आपको पता होगा कि आप इस दोष को ठीक कर रहे हैं getaddrinfo(): access.redhat.com/articles/2161461 । यह उदाहरण वास्तव में संकलक सुरक्षा दोष नहीं है, लेकिन 10+ वर्षों में कुछ ज्ञात निश्चित खामियां हैं।
स्टीव जेसोप

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

19

अगर यह टूट नहीं गया है, तो इसे ठीक न करें

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

हालाँकि, यदि कोड आधार प्राचीन है, और उपयोग किए गए K & R C की कमजोरियों को कम करने के लिए काम रखा गया था, जैसे कि प्रकार की सुरक्षा की कमी, असुरक्षित फ़िज़, इत्यादि, तो सवाल उठाएं " कंपाइलर को और अधिक आधुनिक C99 में अपग्रेड करेंगे। / C11 मानक सब कुछ तोड़ देते हैं? "

बशर्ते, कि नए सी मानकों पर माइग्रेट करने के लिए एक स्पष्ट रास्ता है, जो साइड इफेक्ट को प्रेरित कर सकता है, पुराने कोडबेस के कांटे का प्रयास करने के लिए सबसे अच्छा हो सकता है, इसका आकलन करें और अतिरिक्त प्रकार की जांच, पवित्रता जांच, और निर्धारित करें कि क्या अपग्रेड करना है नए संकलक का इनपुट / आउटपुट डेटासेट पर कोई प्रभाव पड़ता है।

फिर आप इसे अपने बॉस को दिखा सकते हैं, " यहां अपडेट किया गया कोड आधार, रिफलेक्ट किया गया है, जो उद्योग द्वारा स्वीकृत C99 / C11 मानकों के अनुरूप है ... "।

यही कारण है कि जुआ, पर तौला जाना करने के लिए होता है कि बहुत सावधानी से , परिवर्तन करने के लिए प्रतिरोध है कि वातावरण में वहाँ दिखाई दे सकते हैं और नए सामान को छूने के लिए मना कर सकते हैं।

संपादित करें

बस कुछ मिनटों के लिए वापस बैठ गया, यह महसूस किया कि के एंड आर उत्पन्न कोड 16 बिट प्लेटफॉर्म पर चल सकता है, संभावना है, अधिक आधुनिक संकलक में अपग्रेड करना वास्तव में कोड बेस को तोड़ सकता है, वास्तुकला के संदर्भ में सोच रहा हूं, 32 बिट कोड उत्पन्न होगा , यह इनपुट / आउटपुट डेटासेट के लिए उपयोग की जाने वाली संरचनाओं पर मज़ेदार दुष्प्रभाव हो सकता है, जो ध्यान से तौलना एक और बहुत बड़ा कारक है।

इसके अलावा, चूंकि ओपी ने कोडबेस बनाने के लिए विजुअल स्टूडियो 2008 का उपयोग करने का उल्लेख किया है, इसलिए gcc का उपयोग करके वातावरण में लाने के लिए प्रेरित किया जा सकता है या तो MinGW या Cygwin, जो कि पर्यावरण पर प्रभाव को बदल सकता है, जब तक कि लक्ष्य लिनक्स के लिए नहीं है, तब यह एक शॉट के लायक, पुराने K & R कोड आधार पर शोर को कम करने के लिए संकलक में अतिरिक्त स्विच शामिल करना पड़ सकता है, अन्य महत्वपूर्ण बात यह है कि कोई कार्यक्षमता नहीं टूटी है यह सुनिश्चित करने के लिए बहुत सारे परीक्षण करना है, एक दर्दनाक व्यायाम हो सकता है।


समान कोड विजुअल स्टूडियो 2008 द्वारा विंडोज लक्ष्यों के लिए बनाया गया है, और MSVC अभी तक C99 या C11 का समर्थन नहीं करता है (मुझे नहीं पता कि नया MSVC करता है), और मैं नवीनतम GCC का उपयोग करके अपने लिनक्स बॉक्स पर इसका निर्माण कर सकता हूं। इसलिए यदि हम एक नए GCC में बस छोड़ देंगे, तो यह पहले की तरह ही ठीक होगा।
कालमेरी

@ कलमाई सर के लिए धन्यवाद, हो सकता है कि टिप्पणी को शामिल करने के लिए अपने प्रश्न को संपादित करना सबसे अच्छा हो, यह महत्वपूर्ण है :) और होना चाहिए था; डी
t0mm13b

@ कलामरी ने मेरे उत्तर को संपादित किया है, जो कि नए अपडेटेड प्रश्न पर मेरी सोच है।
t0mm13b

2
"एक 16 बिट प्लेटफॉर्म पर चल सकता है, संभावना है कि अधिक आधुनिक संकलक में अपग्रेड करना वास्तव में कोड बेस को तोड़ सकता है, वास्तुकला के मामले में सोच रहा हूं, 32 बिट कोड" मुझे नहीं लगता कि प्रश्न नए कार्यान्वयन-परिभाषित करने के लिए कोड को पोर्ट करने के बारे में है मापदंडों।
पास्कल क्यूक

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

9

एक पुराने सी संकलक का उपयोग कर संकलित कार्यक्रम की सुरक्षा से समझौता कर सकते हैं?

बेशक, यह हो सकता है, अगर पुराने संकलक में ज्ञात बग होते हैं जो आपको पता है कि आपके कार्यक्रम को प्रभावित करेगा।

सवाल यह है कि क्या यह? निश्चित रूप से जानने के लिए, आपको अपने संस्करण से लेकर वर्तमान तिथि तक पूरे परिवर्तन लॉग को पढ़ना होगा और वर्षों में तय किए गए हर एक बग की जांच करनी होगी।

यदि आपको कंपाइलर बग्स का कोई सबूत नहीं मिलता है जो आपके कार्यक्रम को प्रभावित करेगा, तो इसके लिए जीसीसी को अपडेट करना थोड़ा पागल सा लगता है। आपको यह ध्यान रखना होगा कि नए संस्करणों में नए बग हो सकते हैं, जिन्हें अभी खोजा नहीं गया है। हाल ही में जीसीसी 5 और सी 11 समर्थन के साथ बहुत सारे बदलाव किए गए थे।

कहा जा रहा है कि, 80 के दशक में लिखा गया कोड सबसे अधिक संभावना है कि पहले से ही सुरक्षा छेद और खराब-परिभाषित व्यवहार पर निर्भरता से कोई फर्क नहीं पड़ता। हम यहां प्री-स्टैंडर्ड सी की बात कर रहे हैं।


6
मुझे नहीं लगता कि यह व्यामोह है; मुझे लगता है कि ओपी अपने बॉस को समझाने के लिए कारणों का आविष्कार करने की कोशिश कर रहा है। संभवतः ओपी वास्तव में एक नया संकलक चाहता है क्योंकि वे बेहतर एएसएम बनाते हैं (एलटीओ के साथ क्रॉस-फ़ाइल ऑप्टिमाइज़ेशन सहित), अधिक उपयोगी डायग्नोस्टिक्स / चेतावनियाँ हैं, और आधुनिक भाषा सुविधाओं और सिंटैक्स की अनुमति देते हैं। (उदा। C11 स्टैडाटॉमिक)।
पीटर कॉर्डेस

9

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

इस हमले को इस लेख में कार्यक्रम सूडो पर चित्रित किया गया है । bcrypt ने जावास्क्रिप्ट मिनिफायर्स के लिए एक शानदार फॉलो-अप लिखा ।

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


7

पुराने संकलक को ज्ञात हैकिंग हमलों से सुरक्षा नहीं मिल सकती है। उदाहरण के लिए स्टैक मुंहतोड़ सुरक्षा, जीसीसी 4.1 तक पेश नहीं किया गया था । तो हाँ, पुराने संकलक के साथ संकलित कोड उन तरीकों से असुरक्षित हो सकता है जो नए संकलक से रक्षा करते हैं।


6

चिंता का एक और पहलू नए कोड का विकास है

पुराने संकलक प्रोग्रामर द्वारा मानकीकृत और अपेक्षित की तुलना में कुछ भाषा सुविधाओं के लिए अलग व्यवहार कर सकते हैं। यह बेमेल विकास को धीमा कर सकता है और सूक्ष्म कीड़े का परिचय दे सकता है जिनका शोषण किया जा सकता है।

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


5

नहीं

कारण सरल है, पुराने संकलक में पुराने कीड़े और कारनामे हो सकते हैं, लेकिन नए संकलक में नए कीड़े और शोषण होंगे।

नए संकलक में अपग्रेड करके किसी भी बग को "ठीक" नहीं करना। आपका स्विचिंग पुराने बग्स और नए बग्स और कारनामों के लिए शोषण करता है।


3
यह बहुत सरल लगता है: नए कंपाइलर की अपनी कमजोरियां हो सकती हैं, लेकिन मैं उनसे पुराने कंपाइलर की तुलना में कम होने की उम्मीद करूंगा, और यह कई कोड कमजोरियों का पता लगाने की संभावना है जो तब से ज्ञात हो गई हैं।
PJTraill

लेकिन नए संकलक में अज्ञात नई कमजोरियां हो सकती हैं। अकेले संकलक एक सुरक्षा जोखिम नहीं है जिसे अद्यतन करने की आवश्यकता है। आप अपने सतह क्षेत्र को कम नहीं कर रहे हैं। आपका व्यापार एक अज्ञात सेट के लिए मुद्दों का एक ज्ञात सेट है।
coteyr

शुरुआती जीसीसी दिनों से बग्स को खोजने में मदद करने के लिए उपकरणों में बहुत सुधार हुआ है, और गुणवत्ता में सुधार करने में मदद करने के लिए इन उपकरणों (स्थैतिक विश्लेषण, इंस्ट्रूमेंट कोड डायनेमिक विश्लेषण / सैनिटाइज़र, फ़ज़र्स आदि) को कंपाइलर कोड पर भी लागू किया गया है। जीसीसी 2 युग में सभी वर्गों के कीड़े ढूंढना बहुत कठिन था। संस्करणों पर संकलक कीड़ों की तुलना - पृष्ठ 7 देखें: cs.utah.edu/~regehr/papers/pldi11-preprint.pdf GCC 4.5 और LLVM 2.8 (प्रकाशन में नवीनतम) फ़ज़िंग के सबसे कम कीड़े हैं।
जेट्स्की एस-टाइप

2

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


0

आपका प्रश्न दो भागों में आता है:

  • स्पष्ट करें: "क्या पुराने संकलक का उपयोग करने में अधिक जोखिम है" (आपके शीर्षक में कम या ज्यादा)
  • लागू: "मैं प्रबंधन को कैसे उन्नत कर सकता हूं"

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

लेकिन अगर आपका सिस्टम हैकर्स के संपर्क में नहीं आता है, तो आपको शायद अधिक दिलचस्पी लेनी चाहिए कि क्या कंपाइलर अपग्रेड से आपकी प्रभावशीलता बढ़ेगी: MSVS 2013 कोड विश्लेषण अक्सर MSVS 2010 की तुलना में बहुत जल्दी संभावित बग ढूंढ लेता है, और यह C99 या C11 का अधिक या कम समर्थन करता है - यह सुनिश्चित नहीं है कि अगर यह आधिकारिक रूप से करता है, लेकिन घोषणाएं बयानों का पालन कर सकती हैं और आप for-loops में चर घोषित कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.