2013-07-22 5 views
9

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

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

+1

क्या यह कोड किसी (उदा। आपका) सर्वर पर या क्लाइंट मशीनों पर चल रहा है? –

+1

बिल्कुल वही नहीं है, लेकिन यह प्रश्न आपके लिए उपयोगी साबित हो सकता है यदि आपने इसे पहले ही नहीं खोजा है: http://stackoverflow.com/questions/6210045/bullet-proof-groovy-script-embedding –

+0

@AndrewThompson कोड होगा क्लाइंट मशीनों पर चलाएं, हालांकि चिंता यह है कि मैं अंततः मल्टीप्लेयर समर्थन और संशोधित सर्वर होस्ट करने की क्षमता जोड़ना चाहता हूं। इस उदाहरण में, मैं ऐसे (तृतीय पक्ष) संशोधित सर्वरों को सीधे कनेक्ट करने के लिए आवश्यक मॉड फ़ाइलों (जिसमें स्क्रिप्ट शामिल हो) प्रदान करने की अनुमति देने की व्यवहार्यता को देख रहा हूं। यह निश्चित रूप से "ऑप्ट-इन" प्रक्रिया होने की आवश्यकता होगी, लेकिन इससे सुरक्षा चिंता कम नहीं होती है। [यहां] देखें (http://gamedev.stackexchange.com/questions/59390/how-far-should-i-go-in-securing-groovy-mod-scripts) – Hawkwing

उत्तर

1

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

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

+1

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

+0

@ हॉकविंग मेला पर्याप्त है। सौभाग्य। – CPerkins

+0

माइक सैमुअल का जवाब जो-ई का उल्लेख करता है, जो जावा का एक सुरक्षित सबसेट है। यह एक बेहतर दृष्टिकोण की तरह लगता है। हालांकि, यह पुस्तकालय है जो मुश्किल हैं। –

4

मैं फिर भी जिज्ञासा कर रहा हूं अगर जावा पैकेजों और कक्षाओं के श्वेतसूची (हालांकि छोटे) पर आम तौर पर सहमति होती है जिसे उपयोगकर्ता के लिए महत्वपूर्ण जोखिम के बिना पहुंचा जा सकता है।

हां वहाँ सफेद सूचियां हैं, लेकिन मुझे नहीं पता कि वे "आम तौर पर सहमत" कैसे हैं। सामुदायिक सर्वसम्मति एक श्वेत सूची में प्रवेश करने का एक तरीका है, लेकिन आप सूची निर्माताओं के अनुभव को भी देख सकते हैं, और देख सकते हैं कि उनकी प्रक्रिया समझ में आता है या नहीं।


जो ई परियोजना एक जावा के "taming" के साथ आया था, और कहा कि के कुछ हिस्सों में से एक वर्ग/विधि/क्षेत्र द्वारा मुख्य लाइब्रेरीज की एक सफेद सूची थी। उदाहरण के लिए, StringBuilder के लिए, StringBuilder.safej कहते

# Manually verified. 
class("java.lang.StringBuilder", 
    static(constructor("StringBuilder()"), 
    constructor("StringBuilder(CharSequence)"), 
... 
    method(suppress, "insert(int, Object)", comment("calls toString on arbitrary object")), 

जबकि Runtime.safej कहते

# auto-generated safej: default deny everything 
class("java.lang.Runtime", 
    static(method(suppress, "getRuntime()", comment("default deny")), 
    method(suppress, "runFinalizersOnExit(boolean)", comment("default deny"))), 
    ... 

taming समझने के लिए, Joe-E paper जो कहते देखें:

4.2.1 जावा Taming कक्षा पुस्तकालय

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

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

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

+1

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

+0

@ टॉमहॉविन-टाइललाइन, कुछ स्थैतिक प्रवाह-विश्लेषण लापता स्रोतों को उजागर करके एक सफेद सूची को डीबग करने में मदद कर सकता है, उदाहरण के लिए' नया java.io.FileInputStream (स्ट्रिंग , स्ट्रिंग) 'एक सिंक के रूप में और सुनिश्चित करें कि सभी तार जो इसे प्राप्त करते हैं, सफेद संसाधनों द्वारा सिस्टम संसाधनों के रूप में पहचाने जाते हैं। यह कभी पूरा नहीं होने वाला है और शायद' java.lang 'की उपस्थिति के बाद रूढ़िवादी के करीब नहीं होगा .reflect.Method' और क्राफ्टिंग [अपारदर्शी भविष्यवाणियों] की आसानी (http://en.wikipedia.org/wiki/Opaque_predicate) –

+1

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

0

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

+0

उपयोगकर्ता-स्क्रिप्ट अक्सर बेवकूफ डेवलपर्स द्वारा लिखी जाती हैं और उन्हें आमंत्रित करने वाले एप्लिकेशन की तुलना में कम ध्यान से समीक्षा की जाती है, इसलिए [भ्रमित डिप्टी] (http://en.wikipedia.org/wiki/Confused_deputy_problem) से अधिक प्रवण होते हैं जैसे स्क्रिप्ट इंजेक्शन की तुलना में कमजोरियां कोर कोडबेस। –

+0

ओपी उपयोगकर्ता स्क्रिप्ट और आश्चर्यों का समर्थन करना चाहता है कि इसे सुरक्षित तरीके से कैसे किया जाए। – ZhongYu

+0

सहमत हुए। ओपी उपयोगकर्ता स्क्रिप्ट को अपनी नौकरी करने के लिए पर्याप्त अधिकार देने की कोशिश करने के लिए बुद्धिमान है, लेकिन स्क्रिप्ट लेखकों के निहित और कम समीक्षा और परीक्षण मानकों के कारण बहुत कुछ नहीं है। –

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