2010-12-01 7 views
9

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

अब मैं न करे नहीं करना चाहता, लेकिन फाइल सिस्टम, यानी करने के लिए कॉल पुनर्निर्देशित करने के लिए करता है, तो आवेदन "/home/user/application.txt" लिखने के लिए फ़ाइल का पथ की तरह कुछ के साथ प्रतिस्थापित किया जाना चाहिए चाहता है "/temp/trusted_folder/application.txt"। तो मूल रूप से मैं एप्लिकेशन को केवल कुछ विशेष फ़ोल्डर में फ़ाइल सिस्टम तक पहुंचने और इस फ़ोल्डर में अन्य सभी कॉल रीडायरेक्ट करने की अनुमति देना चाहता हूं।

तो यहां कक्षा फ़ाइलऑटपुटस्ट्रीम से विधि है, जहां एसएम से पूछा जाता है कि क्या दिए गए पथ को लिखने की अनुमति है या नहीं।

public FileOutputStream(File file, boolean append) 
    throws FileNotFoundException 
{ 
    String name = (file != null ? file.getPath() : null); 
    SecurityManager security = System.getSecurityManager(); 
    if (security != null) { 
     security.checkWrite(name); 
    } 
    if (name == null) { 
     throw new NullPointerException(); 
    } 
    fd = new FileDescriptor(); 
    fd.incrementAndGetUseCount(); 
    this.append = append; 
    if (append) { 
     openAppend(name); 
    } else { 
     open(name); 
    } 
} 

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

तो मेरा सवाल यह है: क्या सुरक्षा प्रबंधक को सिस्टम सिस्टम में कॉल को प्रतिस्थापित करने की अनुमति देने के कोई तरीके हैं? यदि नहीं, तो क्या ऐसा करने के लिए मैं कोई अन्य दृष्टिकोण उपयोग कर सकता हूं?

मुझे उम्मीद है कि मैं काफी स्पष्ट था।

उत्तर

6

सुरक्षा प्रबंधक ऐसा नहीं कर सकता है, यह केवल हाँ या नहीं कह सकता है।

मैं दो विकल्प के बारे में सोच सकते हैं:

  1. फाइल सिस्टम के साथ ओएस स्तर पर कुछ करो। chroot jails जैसी चीजें हैं। यह एप्लिकेशन के लिए पारदर्शी होगा, लेकिन जावा के बाहर काम की आवश्यकता है।

  2. उनके लिए FileOutputStream खोलने वाले एप्लिकेशन को एक एपीआई प्रदान करें। एपीआई परत यह तय करने के लिए हो जाती है कि फाइल कहां से हैं, और इसे कहीं से भी फाइल खोलने के लिए विशेषाधिकार प्राप्त है (सुरक्षा प्रबंधक शर्तों में)। बेशक, यह आवश्यक है कि sandboxed एप्लिकेशन सीधे java.io.File के बजाय आपके एपीआई का उपयोग करता है। लेकिन यह भी अधिक लचीला है, और किसी बिंदु पर यह संभवतः किसी एप्लिकेशन के लिए सैंडबॉक्स से अवगत होना और सैंडबॉक्स एपीआई का उपयोग करना आवश्यक है, जैसे कि जावा वेबस्टार्ट for example पर।

+0

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

0

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

भले ही यह कुछ गंभीर प्रतिबिंब हैकरी के माध्यम से संभव हो, फिर भी यह अलग-अलग जेवीएम विक्रेताओं और यहां तक ​​कि एक ही जेवीएम चलाने वाले विभिन्न ऑपरेटिंग सिस्टम के बीच पोर्टेबल नहीं होगा। (ऐसा इसलिए है क्योंकि आपको ओएस विशिष्ट कक्षाओं में हेरफेर करने की आवश्यकता होगी)।

जो आप करना चाहते हैं उसे निम्न स्तर पर प्रयास किया जाना चाहिए, लिनक्स और अन्य भारी वर्चुअलाइजेशन तकनीकों के लिए chroot देखें।

0

मुझे लगता है कि आप क्या करने की कोशिश कर रहे हैं कि पहले से ही Wealthfront के इंजीनियरों द्वारा लागू किया गया था।
यहाँ इसके बारे में उनके ब्लॉग प्रविष्टि है: http://eng.wealthfront.com/2010/11/less-io-for-your-java-unit-tests.html

+0

लेख ऐसा कुछ नहीं कहा। वे एक SecurityManager कि आडिट का वर्णन कर रहे हैं और संभावित अप्रत्याशित आई/ओ के संचालन की अनुमति नहीं देता। अस्वीकार करता है, संशोधित नहीं करता है। – Thilo

5

अब जब कि जावा खुला स्रोत है, यदि आप स्रोत कोड FileOutputStream करने के लिए, डाउनलोड कर सकते हैं लागू करने के लिए जो कुछ भी बाधाओं आप चाहें तो इसके स्रोत कोड को संशोधित, यह पुन: संयोजित, एक जार में जोड़ने, और JVM के बूटलोडर classpath है कि जार पहले जोड़ें:

java -Xbootclasspath/p:myModifiedJavaClasses.jar sandbox.Main -run untrusted.Main 

JVM अब बजाय हमेशा की तरह एक के java.io.FileOutputStream के अपने कार्यान्वयन का प्रयोग करेंगे। कुल्ला और सभी जेएसई कक्षाओं के लिए दोहराएं जिन्हें विशेष सैंडबॉक्स पुनर्निर्देशन तर्क की आवश्यकता है।

यह सबसे पोर्टेबल या आसानी से तैनात समाधान नहीं है के रूप में यह संशोधन "वी एम के बाहर" की आवश्यकता है मापदंडों शुरू करने के लिए, लेकिन कुछ स्थितियों में इस समाधान स्वीकार्य और प्रभावी हो सकता है। जवाब के लिए

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

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