"केवल निष्पादित" फ़ाइल अनुमति के लिए एक वैध उपयोग मामला क्या है?


20

मैं chmod और इसके अष्टक मोड पर पढ़ रहा था । मैंने देखा कि 1केवल निष्पादन है। केवल अनुमति के लिए एक वैध उपयोग मामला क्या है? किसी फ़ाइल को निष्पादित करने के लिए, एक आम तौर पर पढ़ने और अनुमति निष्पादित करना चाहते हैं।

$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo

जवाबों:


41

शेल स्क्रिप्ट को निष्पादित करने के लिए पढ़ने की अनुमति की आवश्यकता होती है, लेकिन बाइनरी फाइलें नहीं होती हैं:

$ cat hello.cpp
#include<iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
$ g++ -o hello hello.cpp
$ chmod 100 hello
$ ./hello
Hello, world!
$ file hello
hello: executable, regular file, no read permission

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

निर्देशिकाओं के लिए, निष्पादन की अनुमति थोड़ी अलग है; इसका मतलब है कि आप फ़ाइलों को कर सकते हैं के भीतर उस निर्देशिका (जैसे पढ़ने के लिए या उन्हें अमल)। तो मान लीजिए कि आपके पास ऐसे उपकरण हैं, /toolsजिनमें आप चाहते हैं कि लोग उपयोग कर सकें, लेकिन केवल अगर वे उनके बारे में जानते हैं। chmod 711 /tools। तब निष्पादन योग्य चीजों को /toolsस्पष्ट रूप से चलाया जा सकता है (उदा /tools/mytool), लेकिन ls /tools/इनकार किया जाएगा। इसी तरह, दस्तावेजों को संग्रहीत किया /private-docsजा सकता है जिसमें पढ़ा जा सकता है यदि और केवल अगर फ़ाइल नाम ज्ञात हैं।


1
जब तक आप अनाम ftp नहीं चलाते हैं, संयोग से सिस्टम बायनेरी पर केवल निष्पादित करने का कोई मतलब नहीं है।
जोशुआ

1
इसके अलावा, एक निर्देशिका पर निष्पादन योग्य बिट सेट करना आपको इसकी अनुमति देता cdहै।
बाग़


1
BTW, stdio.hयहाँ C हेडर को शामिल करने की कोई आवश्यकता नहीं है। मैं इसे हटाने का सुझाव देता हूं।
स्पिकट्रिक्स

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

4

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

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

आधुनिक प्रणालियों में अक्सर अतिरिक्त सुरक्षा शामिल होती है जो अधिक प्रभावी होती हैं, जैसे कि एएसएलआर , लेकिन 32-बिट प्लेटफॉर्म में मौजूद प्रतिबंध उन्हें अधिक आसानी से शोषक बना सकते हैं।


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

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

1

ऐसा लगता है कि "केवल निष्पादित करें" का मान किसी फ़ाइल के लिए बहुत अधिक उपयोग नहीं है, लेकिन इसका उपयोग किसी निर्देशिका की सामग्री को पढ़ने से रोकने के लिए किया जा सकता है।

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied

1
यह ध्यान देने योग्य है कि इसका कारण यह उपयोगी है क्योंकि यदि आप फ़ाइल नाम जानते हैं तो भी आप फू / बार पढ़ सकते हैं। मैंने वेब सर्वर पर इसका उपयोग किया है।
रैंडम 832

0

स्क्रिप्ट को निष्पादित करने के लिए आपको अनुमतियों को पढ़ना और निष्पादित करना होगा। एक स्क्रिप्ट की सामग्री को पढ़ना वह है जो इसे निष्पादित करने की अनुमति देता है, इसलिए आपको सक्षम होने की आवश्यकता है read and execute। अन्यथा, आप इसके बिना स्क्रिप्ट नहीं चला सकते।

केवल अनुमति के लिए एक वैध उपयोग मामला क्या है?

सुरक्षा। कुछ अपनी फ़ाइलों को सुरक्षित रखना चाहते हैं और दूसरों को क्रियान्वित या उनका उपयोग करने से रोक सकते हैं।


2
chmod 000के अलावा किसी को भी अनुमति नहीं देगाroot । कभी-कभी आपको सुरक्षा के लिए बस इतना व्यापक जाने की आवश्यकता नहीं होती है - यह उपयोगकर्ता के इरादों पर निर्भर करता है। आदेश में, "re-chmod" फ़ाइल को पठनीय और लिखने योग्य अनुमतियों के लिए वापस कहें, जो आपको इसके माध्यम से करना होगा root। यदि आप पहुंच नहीं पा रहे हैं root, तो यह मुश्किल साबित होगा।
जॉर्डन सैवेल

2
मान लीजिए कि आपके पास ऐसे उपकरण हैं, /toolsजिनमें आप चाहते हैं कि लोग उपयोग कर सकें, लेकिन केवल अगर वे उनके बारे में जानते हैं। chmod 711 /tools। फिर निष्पादन योग्य चीजों को /tools स्पष्ट रूप से चलाया जा सकता है, लेकिन ls /tools/इनकार कर दिया जाएगा।
डोपघोटी

1
अच्छा उत्तर! वहां भी मुझे कुछ सिखाया। बाइनरी फ़ाइलों को निष्पादित करने के लिए पढ़ने की अनुमति की आवश्यकता क्यों नहीं है?
जॉर्डन सेवेल

2
क्योंकि किसी फ़ाइल की सामग्री को प्रदर्शित करना और उन्हें निष्पादित करना दो अलग-अलग चीजें हैं। शेल स्क्रिप्ट्स को एक नए शेल (यदि आप सरलीकरण को माफ करते हैं) में उन्हें "पढ़ने" द्वारा "निष्पादित" किया जाता है, यही कारण है कि आपको उन्हें पढ़ने में सक्षम होने की आवश्यकता है। बायनेरिज़ उस तंत्र का उपयोग नहीं करते हैं।
डोपघोटी

1
आह सामान्य ज्ञान। मैंने सोचा कि यह कुछ अलग था - धन्यवाद!
जॉर्डन सावेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.