2012-04-18 19 views
6

क्या जावा में कोई अस्थायी फ़ाइल को सुरक्षित रूप से लिखने के लिए कोई तरीका है?जावा समकक्ष mkstemp

जहां तक ​​मैं कह सकता हूं, एक अस्थायी फ़ाइल (createTempFile) बनाने का एकमात्र तरीका वास्तव में एक ही समय में इसे खोलता नहीं है, इसलिए & फ़ाइल लिखने के बीच एक दौड़ स्थिति है। क्या मैं कुछ भूल रहा हूँ? मुझे UnixFileSystem.java में CreateFileExclusively (स्ट्रिंग) के पीछे सी स्रोत कोड नहीं मिला, लेकिन मुझे संदेह है कि यह वास्तव में कुछ भी कर सकता है क्योंकि फ़ाइल फ़ाइल खोलने के बाद जावा कोड में फ़ाइल खुली होती है (जब तक कि यह कुछ करने की कोशिश नहीं करता फ़ाइल ताले?)।

समस्या

बीच जब अस्थायी फ़ाइल बनाई गई है & आप इसे खोलने, एक दुर्भावनापूर्ण हमलावर को अनलिंक सकता है अस्थायी फ़ाइल & वहाँ दुर्भावनापूर्ण सामान डाल कि। उदाहरण के लिए, एक हमलावर संवेदनशील डेटा पढ़ने के लिए नामित पाइप बना सकता है। या इसी तरह यदि आप अंततः फ़ाइल को पढ़कर प्रतिलिपि बनाते हैं, तो नामित पाइप केवल & लिखी गई सभी चीज़ों को अनदेखा कर सकती है जो दुर्भावनापूर्ण सामग्री को पढ़ने के लिए आपूर्ति करती है।

मुझे पिछले 10+ वर्षों में अस्थायी फ़ाइल हमलों के कई उदाहरणों को पढ़ना याद है जो नामस्थान में नाम प्रकट होने पर और वास्तव में फ़ाइल खोले जाने पर दौड़ की स्थिति का फायदा उठाते हैं।

उम्मीद है कि जावा सेट का उमास्क सही ढंग से है इसलिए एक कम विशेषाधिकार प्राप्त उपयोगकर्ता फ़ाइल को पढ़/लिख नहीं सकता है और आम तौर पर/tmp निर्देशिका अनुमतियों को ठीक से प्रतिबंधित करता है ताकि आप अनलिंक हमले नहीं कर सकें।

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

+3

क्या आप समझा सकते हैं कि दौड़ की स्थिति क्या मौजूद है? –

+0

इस पर कोई अपडेट (वर्कअराउंड या जावा 7 चाल के रूप में)? –

+0

@Mr_and_Mrs_D मैंने अभी एक वास्तविक उत्तर जोड़ा है। – OrangeDog

उत्तर

0

ध्यान रखें कि कई प्रणालियों पर, सिर्फ इसलिए कि फ़ाइल का नाम नहीं है, इसका मतलब यह नहीं है कि यह पहुंच योग्य नहीं है। उदाहरण के लिए, लिनक्स ओपन फाइल डिस्क्रिप्टर पर /proc/<pid>/fd/<fdno> में उपलब्ध हैं। तो आपको यह सुनिश्चित करना चाहिए कि अस्थायी फ़ाइलों का उपयोग सुरक्षित है, भले ही कोई खुली फ़ाइल का संदर्भ/पता करे।

यदि आप निर्दिष्ट करते हैं कि आप किस वर्ग के हमलों को रोकने की कोशिश कर रहे हैं तो आपको अधिक उपयोगी उत्तर मिल सकता है।

+0

लेकिन आमतौर पर इसे उच्च विशेषाधिकारों की आवश्यकता होती है, इसलिए आपको परवाह नहीं है; अगर हमलावर को आपकी मेमोरी स्पेस को देखने की अनुमति है (जो अनिवार्य रूप से आपके एफडीएस तक पहुंचने में सक्षम है), तो ऐसा कुछ भी नहीं है जो आप कर सकते हैं। वे/proc//मानचित्रों तक पहुंच सकते हैं और वे आपकी मेमोरी कच्चे/proc//mem के माध्यम से भी पढ़ सकते हैं/लिख सकते हैं। – Vitali

0

अन्य सामान्य उपयोगकर्ता आईडी के खिलाफ सुरक्षित? हां, किसी भी उचित तरीके से काम कर रहे बहु-उपयोगकर्ता प्रणाली पर।

अपने स्वयं के उपयोगकर्ता या सुपरसियर के खिलाफ सुरक्षित? सं

1

http://kurt.seifried.org/2012/03/14/creating-temporary-files-securely/

जावा

उपयोग java.io.File.createTempFile() - निर्देशिका के लिए http://www.veracode.com/blog/2009/01/how-boring-flaws-become-interesting/

में कुछ रोचक जानकारी पर How to create a temporary directory/folder in Java?

जावा एक उपयोगी पोस्टिंग होती है फ़ाइलों के लिए 7

java.io.File का उपयोग करें।createTempFile()

निर्देशिकाओं के लिए createTempDirectory का उपयोग()

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html

+0

मैंने पोस्ट की गई अन्य टिप्पणियों को पढ़ा है कि क्यों बनाते हैं TempFile mkstemp के "स्वर्ण" मानक की तुलना में पर्याप्त नहीं है (रेस स्थिति mkstemp avoids createTempFile में मौजूद है)। लेकिन हाँ, मुझे नहीं लगता कि जावास्क्रिप्ट में फ़ाइल बनाने के लिए जावा में अंतर्निहित एक बेहतर तरीका है और इसे 1 कमांड में खोलें। – Vitali

+0

@Vitali - मुझे java.nio.file.Files का उपयोग करने पर विश्वास है (ध्यान दें कि यह उपर्युक्त वर्णित वही वर्ग पथ नहीं है) विधियां बनाएं टेम्पम्फाइल और createTempDirectory जो आप चाहते हैं वह करें, क्योंकि आप एक फ़ाइल विशेषता पैरामीटर निर्दिष्ट कर सकते हैं जिसमें विशिष्ट परमाणु विकल्प शामिल हैं , निर्देशिका/फ़ाइल बनाने के दौरान सेट करने के लिए अनुमतियों सहित (जो कि mkstemp चीजों को कैसे संभालता है) के समान होना चाहिए। संदर्भ: https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#createTempFile | https://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/FileAttribute.html –

+0

मुख्य बात यह है कि mkstemp फ़ाइल खोलता है (इसलिए आप जानते हैं कि आपने नव निर्मित फ़ाइल खोली है , और एक प्रतिस्थापन नहीं)। इनमें से कोई भी जावा समाधान ऐसा नहीं करता है। – OrangeDog

0

जावा 7 जब से हम OpenOption है।

एक ऑब्जेक्ट जो फ़ाइल को खोलने या बनाने का तरीका कॉन्फ़िगर करता है।

इस प्रकार के वस्तुओं तरीकों ऐसे newOutputStream, newByteChannel, FileChannel.open, और AsynchronousFileChannel.open के रूप में जब या खोलने एक फ़ाइल बनाने के द्वारा किया जाता है।

विशेष रुचि StandardOpenOptions.CREATE_NEW है।

एक नई फ़ाइल बनाएं, अगर फ़ाइल पहले से मौजूद है तो विफल हो रही है। फ़ाइल के अस्तित्व की जांच और फ़ाइल का निर्माण अगर यह अस्तित्व में नहीं है तो अन्य फाइल सिस्टम संचालन के संबंध में परमाणु है।

FileChannel mkstemp() { 
    Path path = Files.createTempFile(null, null); 
    Files.delete(path); 
    return FileChannel.open(path, WRITE, CREATE_NEW); 
} 

एक ही टेम्पलेट व्यवहार पाठक के लिए व्यायाम के रूप में छोड़ दिया है को लागू करने:

तो, आप कुछ इस तरह कर सकते हैं।

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