अजगर सैंडबॉक्सिंग कठिन है । पायथन कई स्तरों पर स्वाभाविक रूप से आत्मनिरीक्षण योग्य है।
इसका मतलब यह भी है कि आप उन प्रकारों से विशिष्ट प्रकार के लिए कारखाने के तरीकों को पा सकते हैं, और नई निम्न-स्तरीय वस्तुओं का निर्माण कर सकते हैं , जो बिना किसी सीमा के सीधे दुभाषिया द्वारा चलाया जाएगा।
पायथन सैंडबॉक्स से बाहर निकलने के रचनात्मक तरीके खोजने के कुछ उदाहरण यहां दिए गए हैं:
मूल विचार हमेशा आधार पायथन प्रकार बनाने का एक तरीका खोजना है; कार्यों और कक्षाएं और मनमाने ढंग से निष्पादित करने के लिए पायथन दुभाषिया प्राप्त करके खोल से बाहर तोड़ (अनियंत्रित!) bytecode।
वही और अधिक exec
कथन ( exec()
पायथन 3 में कार्य) पर लागू होता है ।
तो, आप चाहते हैं:
पायथन कोड के बाइट संकलन को सख्ती से नियंत्रित करें, या कम से कम पोस्ट-प्रोसेस को बायटकोड को अंडरस्कोर से शुरू होने वाले नामों तक किसी भी पहुंच को हटाने के लिए।
इसके लिए अंतरंग ज्ञान की आवश्यकता होती है कि पायथन दुभाषिया कैसे काम करता है और पायथन बाइटकोड को कैसे संरचित किया जाता है। कोड ऑब्जेक्ट्स नेस्टेड हैं; एक मॉड्यूल का बायोटेक केवल बयानों के शीर्ष स्तर को कवर करता है, प्रत्येक फ़ंक्शन और वर्ग में अपने स्वयं के बायोटेक अनुक्रम प्लस मेटाडेटा होते हैं , उदाहरण के लिए नेस्टेड फ़ंक्शन और कक्षाओं के लिए अन्य बायटेकोड ऑब्जेक्ट्स होते हैं ।
आपको श्वेतसूची मॉड्यूल का उपयोग करने की आवश्यकता है जो उपयोग किए जा सकते हैं। सावधानी से।
एक अजगर मॉड्यूल में अन्य मॉड्यूल के संदर्भ शामिल हैं । यदि आप आयात करते हैं os
, तो os
आपके मॉड्यूल नेमस्पेस में एक स्थानीय नाम है जो os
मॉड्यूल को संदर्भित करता है । यह एक निर्धारित हमलावर को मॉड्यूल तक ले जा सकता है जो सैंडबॉक्स से बाहर निकलने में मदद कर सकता है। pickle
मॉड्यूल, उदाहरण के लिए, आप उदाहरण के लिए मनमाने ढंग से कोड वस्तुओं लोड है, इसलिए यदि सुविधा देता है किसी भी करने के लिए श्वेतसूची मॉड्यूल सुराग के माध्यम से पथ pickle
मॉड्यूल, आप अभी भी एक समस्या है।
आपको समय कोटा को सख्ती से सीमित करने की आवश्यकता है। यहां तक कि सबसे न्यूटर्ड कोड अभी भी अपने संसाधनों को बांधते हुए, हमेशा के लिए चलाने का प्रयास कर सकता है।
RestrictedPython पर एक नज़र डालें , जो आपको सख्त बायटेकोड नियंत्रण देने का प्रयास करता है। RestrictedPython
पायथन कोड को ऐसी चीज़ में परिवर्तित करता है जो आपको यह नियंत्रित करने देती है कि पायथन 2.3 से 2.7 के माध्यम से कौन से नाम, मॉड्यूल और ऑब्जेक्ट अनुमेय हैं।
यदि RestrictedPython
आपके उद्देश्यों के लिए पर्याप्त सुरक्षित है तो आपके द्वारा कार्यान्वित नीतियों पर निर्भर करता है। अंडरस्कोर से शुरू होने वाले नामों तक पहुंच की अनुमति नहीं देना और मॉड्यूल को सख्ती से सफेद करना एक शुरुआत होगी।
मेरी राय में, एकमात्र वास्तविक रूप से मजबूत विकल्प एक अलग वर्चुअल मशीन का उपयोग करना है, जिसमें कोई बाहरी दुनिया तक नेटवर्क का उपयोग नहीं करता है जिसे आप प्रत्येक रन के बाद नष्ट कर देते हैं। प्रत्येक नई स्क्रिप्ट को इसके बजाय एक ताज़ा VM दिया जाता है। इस तरह से भले ही कोड आपके पायथन सैंडबॉक्स से बाहर निकलने का प्रबंधन करता है (जो कि संभावना नहीं है) सभी हमलावर को अल्पकालिक और बिना मूल्य के एक्सेस मिलता है।