2008-10-03 9 views
13

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

input = "sweet" 
output = nil 
Thread.start { 
    $SAFE = 4 
    #... untrusted code goes here, it uses the input variable(s) 
    #to calculate some result that it places in the output variable 
} 
#parse the output variable as a string. 

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

  1. ऊपर $ सुरक्षित स्तर निर्माण का उपयोग करें:

    अब, मैं वर्तमान में यह करने के लिए 3 तरीके के बारे में सोच सकते हैं।

  2. व्हाटेलकीस्टिफ़ में रूबी
  3. के लिए एक सैंडबॉक्स प्लगइन है, मैं प्रत्येक फंक्शन को अपनी वर्चुअल मशीन में चला सकता हूं, कुछ प्रकार के ओएस वर्चुअलाइजेशन सॉफ़्टवेयर जैसे वीएमवेयर या ज़ेन या कुछ का उपयोग कर।

मुझे आश्चर्य है कि किसी को किसी कार्यात्मक तरीके से अविश्वसनीय रूबी कोड चलाने के लिए कोई अनुशंसा है? आप किस विकल्प की सिफारिश करेंगे? आप इसके बारे में कैसे जाएंगे? धन्यवाद।

उत्तर

12

$ सुरक्षित पर्याप्त नहीं है; आपको कम से कम क्यों अजीब sandbox के स्तर पर होना चाहिए। हालांकि, मुझे नहीं पता कि क्या सैंडबॉक्स कोड सक्रिय रूप से बनाए रखा गया है या यदि उन्होंने कभी भी अनंत लूप, आदि जैसे छेद हल किए हैं,

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

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

लेकिन याद रखें और दोहराना जारी रखें, "सुरक्षित शत्रुता से निपट नहीं सकता"।

+3

क्या किसी के पास कोई संदर्भ है जो बताता है कि $ SAFE के साथ क्या गलत है? – sheldonh

3

मैं दृढ़ता से केवल JRuby का उपयोग करने की अनुशंसा करता हूं।

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

+0

+1, लेकिन रिकॉर्ड के लिए, JRuby वर्तमान में '$ SAFE' को पूरी तरह कार्यान्वित नहीं करता है, है ना? –

+0

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

3

$SAFE दुर्भावनापूर्ण हैकर जो कुछ भी कर सकता है उससे आपको सुरक्षित नहीं करता है।

इस पथ को नीचे जाने के बाद (Ruby: creating a sandboxed eval? देखें), मैंने टिप्पणीकर्ताओं की ऋषि सलाह का पालन किया और एक एप्लिकेशन-विशिष्ट दुभाषिया को एम्बेड किया जिसने मुझे पूरा नियंत्रण दिया और क्या नहीं किया जा सका (Ruby: looking for ruby-embeddable interpreter or scripting language देखें)।

यह (एक स्वनिर्धारित दुभाषिया के लिए मणि को डाउनलोड करने से एक घंटे से कम) की तरह निकला अविश्वसनीय रूप से आसान stickup उपयोग करने के लिए - https://github.com/jcoglan/stickup

1

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

आप यहाँ इसके बारे में अधिक पढ़ सकते हैं: https://github.com/vaharoni/trusted-sandbox

मुझे बताएं कि आप क्या सोचते हैं!

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