अविश्वसनीय कोड के निष्पादन के लिए सर्वोत्तम अभ्यास


31

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

यहाँ मैंने क्या माना है:

  • संभावित खतरनाक पैकेजों जैसे उपयोग को प्रतिबंधित करने के __builtins__लिए execसंदर्भ से निकालें os। उपयोगकर्ता केवल मेरे द्वारा प्रदान किए गए पैकेज का उपयोग करने में सक्षम होंगे।
  • उचित टाइमआउट को लागू करने के लिए थ्रेड्स का उपयोग करें।
  • मैं स्मृति की कुल मात्रा को सीमित करना चाहता हूं जिसे execसंदर्भ में आवंटित किया जा सकता है, लेकिन मुझे यकीन नहीं है कि यह संभव है।

कुछ विकल्प हैं एक सीधे exec, लेकिन मुझे यकीन नहीं है कि इनमें से कौन सा यहाँ उपयोगी होगा:

  • ast.NodeVisitorअसुरक्षित वस्तुओं तक पहुंचने के किसी भी प्रयास को पकड़ने के लिए उपयोग करना । लेकिन मुझे किन वस्तुओं पर प्रतिबंध लगाना चाहिए?
  • इनपुट में किसी भी डबल-अंडरस्कोर की खोज करना। (उपरोक्त विकल्प की तुलना में कम सुंदर)।
  • PyPyकोड को सैंडबॉक्स के समान उपयोग करना या कुछ करना ।

नोट: मुझे पता है कि कम से कम एक जावास्क्रिप्ट-आधारित दुभाषिया है। मेरे परिदृश्य में यह काम नहीं करेगा।


8
अध्ययन के लिए कुछ शुरुआती बिंदु: blog.delroth.net/2013/03/… , nedbatchelder.com/blog/201206/eval_really_is_dangerous.html , nedbatchelder.com/blog/201302/… और nedbatchelder.com/blog/201302/finding_python_3_builtins। सैंडबॉक्स से बाहर निकलने के बारे में html
मार्टिज़न पीटरर्स

3
@MartijnPieters: बहुत बढ़िया। शायद एक जवाब के योग्य है, यदि आप प्रत्येक को संक्षिप्त करते हैं।
रॉबर्ट हार्वे

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


1
PyPy का प्रयास करें :> सैंडबॉक्सिंग: PyPy पूरी तरह से सुरक्षित तरीके से अविश्वसनीय कोड चलाने की क्षमता प्रदान करता है।
वोरैक

जवाबों:


28

अजगर सैंडबॉक्सिंग कठिन है । पायथन कई स्तरों पर स्वाभाविक रूप से आत्मनिरीक्षण योग्य है।

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

पायथन सैंडबॉक्स से बाहर निकलने के रचनात्मक तरीके खोजने के कुछ उदाहरण यहां दिए गए हैं:

मूल विचार हमेशा आधार पायथन प्रकार बनाने का एक तरीका खोजना है; कार्यों और कक्षाएं और मनमाने ढंग से निष्पादित करने के लिए पायथन दुभाषिया प्राप्त करके खोल से बाहर तोड़ (अनियंत्रित!) bytecode।

वही और अधिक execकथन ( exec()पायथन 3 में कार्य) पर लागू होता है ।

तो, आप चाहते हैं:

  • पायथन कोड के बाइट संकलन को सख्ती से नियंत्रित करें, या कम से कम पोस्ट-प्रोसेस को बायटकोड को अंडरस्कोर से शुरू होने वाले नामों तक किसी भी पहुंच को हटाने के लिए।

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

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

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

  • आपको समय कोटा को सख्ती से सीमित करने की आवश्यकता है। यहां तक ​​कि सबसे न्यूटर्ड कोड अभी भी अपने संसाधनों को बांधते हुए, हमेशा के लिए चलाने का प्रयास कर सकता है।

RestrictedPython पर एक नज़र डालें , जो आपको सख्त बायटेकोड नियंत्रण देने का प्रयास करता है। RestrictedPythonपायथन कोड को ऐसी चीज़ में परिवर्तित करता है जो आपको यह नियंत्रित करने देती है कि पायथन 2.3 से 2.7 के माध्यम से कौन से नाम, मॉड्यूल और ऑब्जेक्ट अनुमेय हैं।

यदि RestrictedPythonआपके उद्देश्यों के लिए पर्याप्त सुरक्षित है तो आपके द्वारा कार्यान्वित नीतियों पर निर्भर करता है। अंडरस्कोर से शुरू होने वाले नामों तक पहुंच की अनुमति नहीं देना और मॉड्यूल को सख्ती से सफेद करना एक शुरुआत होगी।

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


10

TL; DR एक चेरोट / जेल का उपयोग करें और किसी भी विशेषाधिकार के बिना एक कस्टम उपयोगकर्ता के रूप में चलाएं।

अविश्वसनीय कोड निष्पादित करने के लिए सबसे अच्छा अभ्यास एक सिस्टम सैंडबॉक्स के माध्यम से अलग करना है । सबसे अधिक सुरक्षा के लिए:

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

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


यह एकमात्र ऐसी चीज़ है जहाँ आप दूर से भी सुनिश्चित करने जा रहे हैं कि आपने इसे सही कर लिया है - इसे स्वयं की प्रक्रिया दें।
माइकल कोहेन

3

ऐसा कोई तरीका नहीं है जिससे आप इसे सुरक्षित रूप से कर सकें।

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


4
सुरक्षा का सवाल उसके सर्वर के लिए था, क्लाइंट की मशीन के लिए नहीं। किसी भी अन्य वेब तकनीक के लिए जावा के संभावित सुरक्षा खतरे, यह है कि सर्वर का उपयोग क्लाइंट के लिए खतरनाक कार्यक्रमों को तैनात करने के लिए किया जा सकता है।
ddyer

1
@grasGendarme विमान दुर्घटनाओं के बारे में नई कहानियों की तरह वास्तव में आपको बताती हैं कि वे कितने दुर्लभ हैं; जावा सुरक्षा छेद के बारे में कहानियाँ आपको बताती हैं कि जावा तुलनात्मक रूप से सुरक्षित है। आपको सी के बारे में ऐसी कहानी कभी नहीं मिलेगी क्योंकि प्रतिक्रिया आपको "अच्छी तरह से मिल जाएगी; यदि आप इसे चलाते हैं तो यह जो चाहेगा,"
रिचर्ड टिंगल

2

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

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


0

जब तक प्रदर्शन आपके लिए व्यापक रूप से महत्वपूर्ण नहीं है, तब तक आप इसे हमेशा ब्रायथन में चला सकते हैं, जो इसे प्रभावी रूप से जावास्क्रिप्ट सैंडबॉक्स में रखता है

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