एक यादृच्छिक अजनबी से स्रोत कोड के एक टुकड़े को संकलित करना कितना सुरक्षित है? [बन्द है]


41

मान लीजिए मैं कोड की समीक्षा कर रहा हूं जो नौकरी आवेदक अपने कौशल को साबित करने के लिए भेजते हैं। स्पष्ट रूप से मैं उन निष्पादकों को नहीं चलाना चाहता जो वे भेजते हैं। ऐसा नहीं है कि मैं स्पष्ट रूप से उनके कोड के संकलन का परिणाम नहीं चलाऊंगा (उदाहरण के लिए, Java टिप्पणियों में रन करने योग्य कोड को छिपाने की अनुमति देता है )।

उनके कोड को संकलित करने के बारे में क्या? मैं संकलक चेतावनी चाहता हूँ यदि कोई हो, लेकिन क्या होगा यदि उनके कोड में कुछ चतुर वर्ण क्रम होते हैं जो मेरे संकलक का शोषण करते हैं और मेरा संकलक इस मशीन से समझौता करता है?

जब मैं Google को "कंपाइलर कमजोरियों" के लिए हिट करता हूं तो मुझे मिलने वाले सभी कंपाइलर अनुकूलन और कोड उत्सर्जन के बारे में हैं और क्या उत्सर्जित कोड उतना ही सुरक्षित है जितना मूल स्रोत कोड होना चाहिए था।

संकलक आमतौर पर यह सुनिश्चित करने के लिए मान्य होते हैं कि वे कोड के कुछ चतुर टुकड़े का संकलन करते समय उपयोगकर्ता मशीन से समझौता नहीं करेंगे? किसी अजनबी से कोड का एक टुकड़ा संकलित करना कितना सुरक्षित है?


40
बस एक वर्चुअल मशीन का उपयोग करें ...
फ्लोरियन मार्गाइन

14
यदि आप वास्तव में कोड की समीक्षा कर रहे हैं, तो यह बहुत कठिन होना चाहिए कि "उपयोगकर्ता मशीन को दबाए बिना" के रूप में देखा जा सकता है?
रेमकोगर्लिच

17
तो आप उनके कौशल को कैसे आंकते हैं? मैं यह पूछता हूं क्योंकि मैंने अक्सर नौकरी आवेदकों द्वारा भेजे गए कोड की समीक्षा की है, लेकिन मैंने हमेशा इसे पढ़ा है, कभी भी इसे निष्पादित करने की आवश्यकता महसूस नहीं की।
रेमकोगर्लिच

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

68
कोड भी न पढ़ें। वे आपके मस्तिष्क में एक असुरक्षितता का फायदा उठा सकते हैं।
हेनरिक

जवाबों:


34

निर्भर करता है।

Makefile का यह टुकड़ा आपके घर की निर्देशिका को हटा सकता है:

all:
    rm -rf ~

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

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

जैसा कि टिप्पणियों में सुझाव दिया गया है, यदि आप यह सुनिश्चित करना चाहते हैं कि आपकी मशीन पर कोई मज़ेदार चीज़ नहीं हो रही है, तो एक आभासी मशीन का उपयोग करें।


32
"एक वर्चुअल मशीन का उपयोग करें" - और यदि आप वास्तव में पागल हैं, तो ध्यान रखें कि कई खामियों का फायदा उठाकर, मैलवेयर संभावित रूप से आपके वीएम से बाहर निकल सकता है और आपका गला घोंट सकता है ( venom.crowdstrike.com )
स्टीव जेसप

23
@SteveJessop हाँ, बेहतर उपयोग नेस्टेड VMs;) संभावना कोडर हैं एहसास नहीं है कि एक वीएम से बाहर टूट रहा है, वह अभी भी दूसरे के अंदर है।
रुस्लान

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

5
@Ruslan: दुर्भाग्य से अधिकांश हैकर्स ने इनसेप्शन देखा है।
स्टीव जेसोप

2
@Ruslan यह वस्तुतः टैब है जो मैंने इस पृष्ठ से पहले खोला है: मैट्रिक्स ।wikia.com / wiki / Matrix_in_a_Matrix_theory जो मैं SciFi SE साइट पर एक असंबंधित प्रश्न के कारण पढ़ रहा था।
अरमानी

23

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

  • आवेदक आप पर एक प्रशंसनीय प्रभाव डालता है वह वास्तव में आपकी कंपनी में नौकरी चाहता है (और मुकदमा नहीं)

  • आदमी को पता नहीं है कि आपकी कितनी समीक्षा की जाती है

  • वह / वह नहीं जानता है कि आप कौन से सटीक संकलक संस्करण का उपयोग कर रहे हैं

  • वह / वह नहीं जानता कि क्या आप एक आभासी वातावरण या एक ऑनलाइन संकलक का उपयोग करते हैं, बस सुरक्षित रहने के लिए

  • आप उन कार्यक्रमों को स्वीकार नहीं करते हैं जिनकी समीक्षा की जानी बहुत बड़ी है

  • आप कुछ भी संकलित नहीं करते हैं जो आपको संदिग्ध लगता है

  • दुनिया में बहुत से लोग नहीं हैं जो वास्तव में जानते हैं कि इस तरह के कार्य को तकनीकी रूप से कैसे पूरा किया जाता है (और अकेले जाना आपको इस पर "त्वरित रेफरी" या ट्यूटोरियल नहीं देगा, जैसा कि आप पहले से ही अपने आप से पता लगा चुके हैं)।

इसलिए हालांकि संकलन सिद्धांत रूप में "पूरी तरह से सुरक्षित" नहीं है, लेकिन वास्तव में आईएमएचओ जोखिम बहुत कम है कि आपका "कंपाइलर रुक जाता है"।


15
ओब्सेस्ड अच्छा है। अंडरहैंड बेहतर है। underhanded-c.org

11
"आवेदक वास्तव में आपकी कंपनी में नौकरी चाहता है (और मुकदमा नहीं)" यह स्पष्ट नहीं है कि एक अजनबी जो आवेदन भेजता है वह वास्तव में नौकरी चाहता है।
क्रिश्चियन

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

13

हमें कई मामलों में अंतर करना होगा:

  1. संकलक में एक बग। हर जटिल प्रोग्राम की तरह, एक कंपाइलर में बग हो सकते हैं, और उन बग्स में से एक शोषक हो सकता है।
  2. एक ट्रोजन हॉर्स। हमलावर आपको संकलन प्रक्रिया के भाग के रूप में कुछ मनमाने कोड निष्पादित करने के लिए प्राप्त कर सकता है। एक Makefile, एक build.xml, एक configureखोल स्क्रिप्ट आदि तकनीकी तौर पर, यह नहीं होने के कारण हमलावर कोड संकलन बल्कि संकलन वातावरण स्थापित करने के लिए है।
  3. संकलन समय पर मनमाने कोड चलाने की अनुमति देने वाली भाषाएँ। स्काला की मैक्रो भाषा स्कैला है, कॉमन लिस्प की मैक्रो लैंग्वेज कॉमन लिस्प है, टेम्पलेट हास्केल की मैक्रो भाषा हैस्केल है। स्काला में कंपाइलर प्लगइन्स भी हैं, जो फिर से मनमाना स्काला कोड है जो संकलन के समय चलता है। F # के पास प्रदाता हैं।
  4. वे भाषाएँ जो संकलन समय पर ट्यूरिंग-कम्प्यूटेशन की अनुमति देती हैं। स्काला और हास्केल के प्रकार के सिस्टम ट्यूरिंग-पूर्ण हैं, जैसा कि C ++ के टेम्प्लेट हैं। संकलित समय पर मनमानी ट्यूरिंग-संगणना करने के लिए आप संकलक प्राप्त कर सकते हैं, लेकिन अनंत छोरों तक सीमित नहीं है। ध्यान दें कि ट्यूरिंग-पूर्ण का मतलब केवल यह है कि आप प्रत्येक ट्यूरिंग-कम्प्यूटेबल फ़ंक्शन की गणना कर सकते हैं, इसका मतलब यह नहीं है कि आप फाइलसिस्टम या कुछ इस तरह से एक्सेस कर सकते हैं। लेकिन, आप एक ऐसा कार्यक्रम बना सकते हैं जो संकलन के लिए असीम रूप से लंबा होगा।
  5. बहुत लंबा संकलन समय। उदाहरण के लिए, अधिभार संकल्प के लिए C # के नियम इतने जटिल हैं कि आप किसी भी 3-SAT समस्या को C # अधिभार संकल्प के रूप में सांकेतिक शब्दों में बदलना कर सकते हैं। 3-सैट, ज़ाहिर है, प्रसिद्ध एनपी-पूर्ण है। दूसरे शब्दों में, हमारे वर्तमान ज्ञान के अनुसार, C # में अधिभार संकल्प के लिए एक कुशल एल्गोरिथ्म खोजना असंभव है। आप संकलन को असीम रूप से लंबा नहीं बना सकते हैं, लेकिन यह संकलन को ब्रह्मांड के जीवनकाल की तुलना में अधिक समय लेने के लिए नहीं लेता है, जो व्यावहारिक रूप से एक ही बात है।

# 4। और # 5। सेवा से वंचित करने में सबसे अधिक परिणाम होगा। व्यावहारिक रूप से, C ++ और स्काला संकलक आपके द्वारा की जाने वाली पुनरावृत्ति की मात्रा को सीमित कर देते हैं, जिससे वास्तव में अनंत लूप लिखना संभव नहीं है । स्काला में, यह केवल एक कार्यान्वयन बाधा है, लेकिन C ++ में, यह स्पष्ट रूप से कल्पना द्वारा अनुमत है, मुझे विश्वास है।

# 2। तकनीकी रूप से सवाल के दायरे से बाहर है क्योंकि सवाल संकलन कोड को नहीं चलाने के बारे में था (OTOH, वहाँ गहन दार्शनिक प्रश्न है: यदि एक हास्केल कार्यक्रम की जाँच मनमाने ढंग से ट्यूरिंग-कम्प्यूटेशन कर सकता है, तो क्या वह संकलन या प्रोग्राम चल रहा है?)

# 1। संभावना नहीं है। एक ओर, उत्पादन संकलक बहुत जटिल हैं, इसलिए बग की संभावना अधिक है। दूसरी ओर, उनका कड़ाई से परीक्षण किया जाता है, आखिरकार, इलस्ट्रेटेड इनपुट को इनायत से संभालना एक कंपाइलर के नौकरी विवरण का हिस्सा है। यहां तक ​​कि अगर वे परीक्षण नहीं किए जाते हैं, तो उन्हें वैसे भी बीमार कोड के साथ बमबारी किया जाएगा ... बस कुछ स्टैकऑवरफ्लो सवालों को देखें कि उनके कंपाइलरों पर कौन से जंक लोग फेंकते हैं!

यह हमें 3 के साथ छोड़ देता है। कुछ कंपाइलर सिस्टम में कंपाइल टाइम कोड के एक्सेस की सीमा को सीमित कर सकते हैं, लेकिन उपयोग के कुछ मामलों के लिए, पूर्ण एक्सेस उपलब्ध नहीं है। उदाहरण के लिए, F # के टाइप प्रोवाइडर्स का उद्देश्य, डेटा के लिए "नकली" सिंथेटिक प्रकार है, जिसका टाइप सिस्टम F # के मैच से मेल नहीं खाता है, जिससे आप एक वेब सेवा, जिसमें WSDL स्कीमा है, से जोरदार-टाइप में बातचीत कर सकते हैं। फैशन। हालाँकि, ऐसा करने के लिए, टाइप प्रदाता को WSDL स्कीमा संसाधन तक फ़ाइल सिस्टम या वेब पर पहुँच की आवश्यकता होती है, इसलिए इसे फ़ाइल सिस्टम और नेटवर्क एक्सेस की आवश्यकता होती है।

तो, क्या यह सुरक्षित है? तकनीकी रूप से, नहीं। क्या यह जोखिम भरा है? ज़रुरी नहीं।


1
C ++ वास्तव में टेम्पलेट्स के तात्कालिकता गहराई को कुछ कार्यान्वयन-निर्भर मूल्य तक सीमित करता है। यह कुछ दर्जन हुआ करता था; आधुनिक कार्यान्वयन ने सीमा को कई सौ तक बढ़ा दिया है। फिर भी, यह पूरी तरह से प्रति स्तर टेम्पलेट्स तात्कालिकता की संख्या को दोगुना करने के लिए पूरी तरह से तुच्छ है, इसलिए 100 स्तरों को संकलक की आवश्यकता होगी 2 ^ 100 टेम्पलेट्स। यह केवल एक DoS हमले तक है।
MSalters

3

कोड को संकलित करने में कोई जोखिम नहीं होना चाहिए । में सिद्धांत संकलक है कि एक चालाक हैकर का लाभ ले सकता है, लेकिन लगता है बहुत संभावना नहीं है में एक बग हो सकता है।

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


3
स्काला, टेम्पलेट हास्केल, लगभग सभी लिस्प्स संकलन समय पर मनमाने कोड को निष्पादित कर सकते हैं। ट्यूरिंग-पूर्ण प्रकार प्रणाली (स्काला, हास्केल) के साथ सभी भाषाएं संकलन के समय मनमाने ढंग से ट्यूरिंग-संगणना कर सकती हैं, लेकिन एक अनंत लूप तक सीमित नहीं हैं। C ++ का टेम्प्लेट सिस्टम ट्यूरिंग-पूर्ण है, फिर से, आप संकलन समय पर अनंत छोरों सहित मनमाना प्रदर्शन करने की अनुमति देते हैं। सी # का अधिभार संकल्प 3-सैट के बराबर है, इसलिए एनपी-पूर्ण, जो ट्यूरिंग-पूर्ण नहीं है, लेकिन फिर भी यदि आप चाहें तो ब्रह्मांड के जीवनकाल के लिए कंपाइलर को लटका सकते हैं।
जॉर्ज डब्ल्यू मित्तग

3
ट्यूरिंग-पूर्ण प्रकार की प्रणाली आपको कंप्यूटर को pwn करने की अनुमति नहीं देती है। यदि आप इसका फायदा उठाते हैं तो कम से कम यह कंपाइलर को लटका देगा। लेकिन हाँ, अगर आपके पास ऐसी भाषाएँ हैं जहाँ संकलन कदम मनमाने कोड को निष्पादित कर सकता है, तो जाहिर है कि आपको अविश्वास कोड का संकलन नहीं करना चाहिए।
जैक्सबी

3

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

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

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

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

तीसरा, हम वास्तविक संकलक देख सकते हैं। मैंने Adobe, Microsoft, Java और GNU के C / C ++ सहित कुछ ब्राउज़ किए, और पाया कि आम तौर पर बोलना, संकलन कोड (और यहां तक ​​कि बिल्डिंग , कोई कस्टम मेक-फ़ाइल नहीं मानना) अपेक्षाकृत सुरक्षित है, लेकिन उनमें से प्रत्येक संकलक ऐसा करता है या करता है सुरक्षा कारनामे हैं जो वास्तव में संकलित बायनेरिज़ चलाने से उत्पन्न हो सकते हैं। दूसरे शब्दों में, वे आपके सिस्टम को केवल संकलन करके नहीं ले सकते थे, लेकिन वे कोड चलाकर कर सकते थे।

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


2

खैर, मैं "उनके कोड की समीक्षा करना" शुरू करूंगा। कोड को वास्तव में चलाने की आवश्यकता क्यों है?

इसके अलावा, बहुत सारे ऑनलाइन कंपाइलर हैं जहां आप कोड में डाल सकते हैं और इसे संकलित और / या चला सकते हैं। आप इसे एक आवश्यकता बना सकते हैं: यह इस और उस ऑनलाइन संकलक में संकलित करता है।

ऑनलाइन कंपाइलर्स वाले पेज का उदाहरण यहां दिया गया है: ऑनलाइन कंपाइलर्स

जॉब इंटरव्यू के लिए समीक्षा के लिए कोड किसी भी तरह से इतना बड़ा नहीं होना चाहिए जितना कि आपको समझ में न आए कि क्या हो रहा है।


3
"वास्तव में कोड चलाने की आवश्यकता क्यों है?"। यह पता लगाने के लिए कि क्या यह कोई अच्छा है, ज़ाहिर है, एक समीक्षा केवल आपको बताती है कि इसकी विफलताएं सूक्ष्म हैं :-)। "उपरोक्त कोड में बग से सावधान रहें; मैंने केवल इसे सही साबित किया है, इसे आजमाया नहीं है।" - नुथ
स्टीव जेसप

2

संकलक आमतौर पर यह सुनिश्चित करने के लिए मान्य होते हैं कि कोड के कुछ चतुर टुकड़े को संकलित करते समय वे उपयोगकर्ता मशीन को नहीं देखेंगे?

सामान्य तौर पर वे बहुत जटिल होते हैं और अक्सर उन भाषाओं का उपयोग करके लिखा जाता है जिसमें यह संपत्ति साबित करने के लिए व्यावहारिक नहीं है।

संभवतः इस विशिष्ट इरादे के साथ नहीं, लेकिन फ़ज़ टेस्टिंग कंपाइलरों की धारणा कम से कम ज्ञात है ( LLVM अब फ़ज़-टेस्ट ही कर सकता है )। टेस्ट पकड़ इनपुट कि संकलक कीड़े की वजह संकलक दुर्घटनाओं होगा करने का इरादा करते भी दोहन खामियों आगे बढ़ने की बात।

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

किसी अजनबी से कोड का एक टुकड़ा संकलित करना कितना सुरक्षित है?

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

सामान्य कोड के संकलन-समय निष्पादन के लिए सुविधाओं के साथ कोई भी भाषा या संकलक निश्चित रूप से अत्यधिक संदिग्ध है। C ++ टेम्प्लेट कार्यात्मक रूप से पूर्ण हैं, लेकिन सिस्टम तक पहुंच (इरादा) नहीं है, इसलिए वे अपेक्षाकृत कम जोखिम वाले हैं। BЈови since makeमें अत्यंत उच्च जोखिम के रूप में उल्लेख किया गया है (चूंकि यह अजनबी के कोड को निष्पादित कर रहा है, यह सिर्फ इतना है कि कोड makeभाषा में लिखा जाना है , C ++ में नहीं)। यदि कंपाइलर चलेगा systemतो आप उसी नाव में हैं। मैं एक असेंबलर के साथ काम करता था, अगर मुझे सही याद है, तो मनमाने ढंग से संकलन-समय कोड निष्पादन कर सकता है। यह लुक-अप तालिकाओं की गणना करने के लिए था, लेकिन मुझे नहीं लगता कि कुछ भी आपको सिस्टम कॉल करने से रोकता है।

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

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


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

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

1

हालांकि यह आम तौर पर एक चिंता का विषय है, मुझे लगता है कि सेटअप के कारण यह मुद्दा न के बराबर है।

आवेदक ने आपको कुछ स्रोत कोड भेजे। कैसे या क्यों हुआ?

स्पष्ट रूप से केवल तीन संभावनाएँ हैं:

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

लगभग 2) और 3)

मुख्य जोखिम 2) और 3) के बीच अंतर है। संभावना अधिक है कि अगर उसने जो कुछ भी लिखा है वह देखने लायक है , यह कुछ ऐसा है जिसे आप या तो ऑनलाइन के लिए स्रोत कोड प्राप्त कर सकते हैं (एक "तटस्थ" स्रोत से) और आप पहले से ही परिचित हो सकते हैं, या यह कुछ ऐसा है जो आप वास्तव में करते हैं क्योंकि आप एक प्रतियोगी (पूर्व नियोक्ता) की बौद्धिक संपदा का उल्लंघन करना चाहते हैं, इसलिए इसे देखना चाहते हैं। बाद का मतलब होगा कि आप उस व्यक्ति को वैसे भी नौकरी पर नहीं रखना चाहेंगे।
यदि आप स्रोत ऑनलाइन प्राप्त कर सकते हैं, तो ऐसा करें। यदि आप आवेदक के क्रेडिट में कहीं उसके नाम से एक प्रसिद्ध सॉफ्टवेयर (मालिकाना सॉफ्टवेयर सहित) के योगदान को सत्यापित कर सकते हैं, तो ऐसा करें।
हर दूसरे मामले में, जो भी उसने आपको भेजा है, उसे अनदेखा करें। यह या तो देखने लायक नहीं है, या अवैध है, या उच्च जोखिम है।

लगभग 1)

आवेदक ने आपको कुछ भेजा है क्योंकि आपने उसे एक असाइनमेंट दिया है। यदि आपके पास कोई क्षमता है (जो मैं आपको मानता हूं!), तो एक ठेठ प्रोग्रामिंग असाइनमेंट के लिए (... कि आपने खुद को भी चुना है!), आप यह बता पाएंगे कि क्या यह एक प्रशंसनीय समाधान है जो ऐसा दिखता है जैसे कि यह काम कर सकता है 30 सेकंड से कम समय (10 सेकंड से अधिक) के लिए स्रोत कोड को देखकर।

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

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

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

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


0

यदि संभावना आपको चिंतित करती है, तो एक पुरानी मशीन ले लो (हम में से अधिकांश के आसपास बैठे कुछ नहीं है?), लिनक्स और संकलक के वर्तमान संस्करण को स्थापित करें और सी, स्रोत कोड को कॉपी करें, नेटवर्क केबल को अनप्लग करें (या वाईफाई बंद करें) ), और संकलन करते हैं। अगर कुछ बुरा होता है, तो यह कुछ और * प्रभावित नहीं करेगा।

और मेकफाइल में मैलवेयर के लिए, इसे एन-फ्लैग (IIRC, RTMF) के साथ चलाएं, यह देखने के लिए कि यह वास्तव में इसे किए बिना क्या करेगा।

* जब तक कि आपके प्रोग्रामर ने मालवेयर को कोडित नहीं किया है ताकि वह पुन: संयोजन का इंतजार कर सके, लेकिन उस स्थिति में आप) मशीन को मिटा देंगे; और ख) एनएसए के लिए लड़के के फिर से शुरू होने का कारण, 'क्योंकि वह वाणिज्यिक दुनिया में बर्बाद हो गया है :-)


0

लब्बोलुआब यह है कि वहाँ है जोखिम। अन्य उत्तरों के अनुसार जोखिम काफी छोटा है, लेकिन एक जोखिम है। इसका मतलब है कि आपको दो प्रश्न पूछने की आवश्यकता है:

  1. जोखिम को कम करने के लिए मैं क्या कर सकता हूं?
  2. क्या जोखिम इतना अधिक है कि मुझे परवाह करनी चाहिए?

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

  1. एक वर्चुअल मशीन का उपयोग करें (जैसा कि @FlorianMargaine ने तुरंत टिप्पणियों में बताया है)। आप बस इसे संकलित करने से पहले स्नैपशॉट लें और फिर जब आप काम कर लें तब स्नैपशॉट को पुनर्स्थापित करें।
  2. एक होस्ट की गई सेवा (जैसे कि ऑनलाइन कंपाइलर) का उपयोग करें।

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


0

यदि आप एक अविश्वसनीय स्थान (ई, जी, डाउनलोड या नेटवर्क साझा) से एक परियोजना खोलते हैं तो दृश्य स्टूडियो आपको वास्तव में चेतावनी देता है।

एक उदाहरण कि इसका शोषण कैसे किया जा सकता है एक WPF परियोजना के साथ: आप XAML से .NET क्लासेस का संदर्भ ले सकते हैं, और IntelliSense प्रदान कर सकते हैं, डिज़ाइन समय पर संदर्भित कक्षाओं को लोड और निष्पादित करते हैं।

इसका मतलब है कि एक हमलावर दुर्भावनापूर्ण .dll को बिन निर्देशिका में छोड़ सकता है, स्रोत कोड को गैर-दुर्भावनापूर्ण के साथ बदल सकता है और डिज़ाइन समय पर, DLL निष्पादित होता है। आपके पहले निर्माण के बाद, दुर्भावनापूर्ण बाइनरी का हर निशान चला गया है।

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

इसी तरह के वैक्टर शायद अन्य भाषाओं / ओएस के साथ मौजूद हैं।


0

पठन स्रोत कोड: पूरी तरह से सुरक्षित। संकलन कोड: पूरी तरह से सुरक्षित। संकलित बायनेरिज़: अच्छी तरह से ... जो निर्भर करता है।

संकलन केवल स्रोत कोड को पढ़ने और द्विआधारी रूप में इसके समकक्ष लिखने वाला कंप्यूटर है। संकलन के बाद, आपके पास बस 2 दस्तावेज़ हैं: एक मानव-पठनीय, और दूसरा कंप्यूटर-पठनीय। जब तक आपको पढ़ने के लिए कंप्यूटर नहीं मिलता है (यानी रन) दूसरा दस्तावेज़, कुछ भी नहीं होने वाला है।


3
संकलन का कोई स्पष्टीकरण पूरी तरह से सुरक्षित क्यों है? एक चतुराई से तैयार किए गए संदेश को भेजकर एक सर्वर को चलाया जा सकता है - वह एक चतुराई से तैयार किए गए इनपुट को देकर एक कंपाइलर को क्यों नहीं पकड़ सकता है?
शार्प्यूट

2
मुझे लगता है कि आप एक सर्वर, या कंपाइलर में भेद्यता का फायदा उठाने के लिए चतुराई से तैयार कोड को नोटिस करेंगे। लेकिन इसे चरम पर ले जाने के लिए, कोड को देखने का जोखिम क्यों उठाएं ?! संपादकों में कई कारनामे हैं जिनका शोषण सिर्फ एक फाइल को देखकर किया जा सकता है ।
gbjbaanb

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

1
संकलन कोड के पूरी तरह सुरक्षित होने के बारे में इतना निश्चित नहीं है। जावा में भी, मावेन के साथ (उदाहरण के लिए) एक लापरवाह " mvn package" सामान खींच सकता है और अतिरिक्त प्लगइन्स के साथ ऐसे कार्य कर सकता है जिनके बारे में आप आसानी से नहीं जान सकते हैं। मुझे यकीन है कि वही अन्य बिल्ड सिस्टम पर लागू हो सकता है।
ब्रूनो

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

-1

मुझे लगता है कि आप दो स्वादों में से एक के बारे में चिंतित हैं:

  • परिष्कृत, शोषित-संचालित मैलवेयर : संभावना नहीं है, खासकर क्योंकि ये बहुत विशिष्ट हार्डवेयर और / या सॉफ़्टवेयर पर लक्षित होते हैं और [आपके प्रश्न के आधार पर] आपके हमलावर को शायद सिस्टम ज्ञान का स्तर नहीं है।
  • आपके पर्यावरण के साथ खराब होने वाली बातें : दुर्भावनापूर्ण शरारत निर्देश (जैसे कि आपके घर की निर्देशिका को हटाना) या असंगत / अक्षम निर्देश जो आपके सिस्टम व्यवहार को बदलते हैं (जैसे PATH या LIBRARY पर्यावरण चर को फिर से लिखना)

कुछ लोगों ने वर्चुअल मशीन या पुराने सिस्टम का सुझाव दिया है, लेकिन मैं बहुत आसान समाधान प्रदान करता हूं: कम / अलग-अलग अनुमतियों के साथ एक अलग उपयोगकर्ता के रूप में संकलित करें । वर्चुअल मशीन या डेडिकेटेड कंप्यूटर सेट करने से ज्यादा आसान है।

यदि इस संभावना के बावजूद कि आपका सिस्टम संकलन-समय के कारनामों से थर्रा जाता है, तो बैकअप से पुनर्स्थापित करें (आपके पास वे हैं, सही?)।

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