2011-09-16 11 views
33

सुरक्षित रूप से node.js में उपयोगकर्ता द्वारा सबमिट की गई स्क्रिप्ट को चलाने (संभावित रूप से दुर्भावनापूर्ण) के विकल्प क्या हैं? अर्थात। ऐसे वातावरण में जो कोड को संवेदनशील डेटा और एपीआई तक पहुंचने से रोकता है?उपयोगकर्ता द्वारा सबमिट की गई स्क्रिप्ट को node.js सैंडबॉक्स में सुरक्षित रूप से कैसे चलाया जाए?

vm.runInNewContext(userScript, {}) एक आकर्षक प्रारंभिक बिंदु है ... लेकिन ऐसा लगता है कि वहां known issues हैं।

sandbox module दिलचस्प लग रहा है, लेकिन runInNewContext() का भी उपयोग करता है, इसलिए मैं इसका थोड़ा सा हिस्सा लेता हूं।

+0

मैं 'vm' का उपयोग करने की सलाह दूंगा क्योंकि यह नोड कोर का हिस्सा है। और चूंकि नोड कोर अपनी बग तय करता है, बस मान लें कि यह समस्या ठीक हो जाएगी – Raynos

+0

@ रेनोस यह एक बग नहीं है। दस्तावेज़ कहते हैं कि यह केवल ज्ञात-अच्छे कोड के लिए है। – thejh

+0

@thejh - सच है, लेकिन एपीआई खुद को उचित दृढ़ विश्वास की ओर उधार देता है कि कोड एक पूरी तरह से अलग संदर्भ में निष्पादित कर रहा है, जिसका अर्थ यह है कि कहा गया कोड वर्तमान संदर्भ तक पहुंचने में सक्षम नहीं होना चाहिए। और मुझे उम्मीद है कि एपीआई का * इरादा * बिल्कुल है - स्क्रिप्ट चलाने के लिए एक सैंडबॉक्स प्रदान करना। तो ... मुझे लगता है कि एक सुंदर मजबूत मामला बनाया जा सकता है कि यह केवल एक अच्छी तरह से प्रलेखित बग है। :) – broofa

उत्तर

29

आपको हमेशा एक अलग प्रक्रिया में अविश्वसनीय कोड चलाया जाना चाहिए, जो वास्तव में सैंडबॉक्स मॉड्यूल करता है। एक साधारण कारण यह है कि नोड फ्रीज करेगा।

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

अविश्वसनीय कोड strict mode (नियमित जावास्क्रिप्ट में) के साथ बंद होने पर लपेटा जाता है, तो आप अपने दायरे के बाहर डेटा तक पहुंचने के लिए arguments.callee.caller का उपयोग कर सकते हैं)। अंत में, नोड के एपीआई तक पहुंच को रोकने के लिए बहुत सीमित global ऑब्जेक्ट पास किया गया है। अविश्वसनीय कोड केवल मूल गणना कर सकता है और फ़ाइलों या सॉकेट तक पहुंच नहीं है।

आप एक प्रेरणा के रूप सैंडबॉक्स के कोड को पढ़ने के लिए चाहिए, मैं इसे उपयोग कर रहा है के रूप में की सिफारिश नहीं होगा:

  • कोड पुराने हो रही है और 7 महीने के लिए अद्यतन नहीं किया गया।
  • नोड में बाल प्रक्रिया मॉड्यूल पहले से ही आपको आवश्यक अधिकांश सुविधाएं प्रदान करता है, खासकर child_process.fork()
  • child_process.fork द्वारा प्रदान किया गया आईपीसी चैनल शायद बेहतर प्रदर्शन करता है।

बढ़ी हुई सुरक्षा के लिए, आप setuid-sandbox का उपयोग करने पर भी विचार कर सकते हैं। टैब प्रक्रियाओं को फ़ाइल सिस्टम तक पहुंचने से रोकने के लिए Google Chrome द्वारा उपयोग किया जाने वाला कोड है। आपको मूल मॉड्यूल बनाना होगा, लेकिन यह example सरल लगता है।

+3

'vm' मॉड्यूल में विधियां अब 'टाइमआउट' पैरामीटर का समर्थन करती हैं जो आपको 'सत्य (सत्य) {}' को सुरक्षित रूप से निष्पादित करने देती है। यह स्पष्ट रूप से सुरक्षा चिंताओं को संबोधित नहीं करता है, लेकिन यह अंतहीन लूप को संबोधित करता है। –

+0

@AndrewPaprocki क्या आप उन दस्तावेज़ों से लिंक कर सकते हैं जहां टाइमआउट दिखाया गया है? –

+0

@RobFox यह v0.11 में है, http://nodejs.org/docs/v0.11.13/api/vm.html –

8

a newer module on github called vm2 है जो इन चिंताओं में से कुछ को संबोधित करता है, खासकर नोड.जेएस अनुप्रयोगों में। हो सकता है कि कुछ अन्य लोगों को यह ढूंढने में मदद मिलेगी, जैसा कि मैंने अभी किया है।

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

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