एग्जीक्यूटिव को रूट द्वारा us / usr / sbin लिखने योग्य क्यों बनाया जाता है?


31

क्या आप बता सकते हैं कि बाइनरी संकलित फ़ाइल (उदाहरण के लिए /usr/sbin) ने rootउपयोगकर्ता के लिए अनुमति क्यों लिखी है ?

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

एक स्क्रिप्ट (उदाहरण के लिए एक bashफ़ाइल) लेखन योग्य हो सकती है क्योंकि यह मूल रूप से एक पाठ फ़ाइल है, लेकिन यह संकलित फ़ाइल के लिए समान क्यों है जहां कोई भी लेखन वास्तव में आवश्यक नहीं है जहां तक ​​मुझे पता है?

आपकी प्रतिक्रिया के लिए अग्रिम धन्यवाद।


6
बस स्पष्ट करने के लिए, आप सोच रहे हैं कि उपयोगकर्ता rootने बाइनरी फ़ाइल की अनुमति क्यों लिखी है? अगर उस पैकेज को अपग्रेड करने में मदद मिलेगी तो कुछ नहीं।
एरिक रेनॉफ

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

1
@slebetman: आप सीधे पाठ फ़ाइलों को संपादित कर सकते हैं। उदाहरण के लिए, फ़ाइल खोलें, इसे विस्तारित करें, इसे मेमोरी मैप करें, memmove()अंतिम भाग को अंत तक स्थानांतरित करने और एक छेद खोलने के लिए उपयोग करें, फिर छेद में नया पाठ डालें। या आप ऐसा करने के लिए pread()/ की एक श्रृंखला का उपयोग कर सकते हैं pwrite()
ज़ैन लिंक्स

6
@EricRenouf वास्तव में, बाइनरी फ़ाइल पर अनुमतियों को लिखना उस पैकेज को अपग्रेड करने के लिए आवश्यक नहीं है जिसमें यह शामिल है। पैकेज अपग्रेड पर, पुराने बाइनरी को नहीं लिखा गया है; वास्तव में यह असंभव है यदि बाइनरी वर्तमान में चल रही है (खोज के लिए ETXTBSY)। इसके बजाय, पुराने बाइनरी को हटा दिया जाता है , और नया बाइनरी उसी नाम की एक नई फ़ाइल को लिखा जाता है। फ़ाइलों को हटाने से उन पर लिखने की अनुमति की आवश्यकता नहीं है, केवल युक्त निर्देशिका (यानी, /usr/sbin/) पर।
मार्सेलम

1
@marcelm: सख्ती से बोलना कि आप केवल fseek का उपयोग नहीं कर रहे हैं और लिख रहे हैं, आप शेष बचे हुए RAM को बफ़र कर रहे हैं। आप शेष को किसी अन्य फ़ाइल में भी बफर कर सकते हैं। या आप एक नई फ़ाइल में नई सामग्री लिख सकते हैं। जिनमें से कोई भी आपको बड़े बफर के कुछ प्रकार के बिना पाठ फ़ाइलों को विस्तारित करने की अनुमति देता है।
स्लीवेटमैन

जवाबों:


50

यह वास्तव में कोई फर्क नहीं पड़ता कि अगर /bin(या किसी अन्य मानक निर्देशिका में जहां निष्पादनयोग्य फाइलें रखी जाती हैं) रूट या नहीं द्वारा लिखित हैं। मेरे द्वारा उपयोग किए जा रहे लिनक्स सर्वर पर, वे मूल रूप से लिखने योग्य हैं, लेकिन मेरी OpenBSD मशीन पर, वे नहीं हैं।

जब तक वे समूह या "अन्य" द्वारा लिखने योग्य नहीं हैं!

कोई सुरक्षा समस्या नहीं है, उदाहरण के लिए

-rwxr-xr-x 1 root root 126584 Feb 18  2016 /bin/ls

यदि कोई इसे अधिलेखित करना चाहता था, तो उन्हें मूल होना चाहिए, और यदि वे हैं rootऔर इसे अधिलेखित करते हैं, तो वे या तो हैं

  1. एक नया संस्करण स्थापित करना, या
  2. अनाड़ी, या
  3. रूट अनुमतियों के साथ एक हमलावर ।

विचार करने के लिए एक और बात यह है कि रूट फ़ाइल में कोई फर्क नहीं पड़ता कि क्या यह सुरक्षित है या नहीं, क्योंकि ... लिख सकता है।

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

अब सब कुछ पर अनुमतियाँ बदलते मत जाओ! यह सभी प्रकार के कहर को मिटा सकता है और संभावित रूप से भ्रमित पैकेज प्रबंधकों को सत्यापित कर सकता है जो अनुमतियाँ ठीक से सेट हैं। यदि आप गलती से सुरक्षा-महत्वपूर्ण एप्लिकेशन पर गलत तरीके से अनुमतियों को बदल देते हैं तो यह सिस्टम को कमजोर बना सकता है।

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


टिप्पणियों से और चैट पर , कुछ इतिहास के लिए एक कॉल था।

लिनक्स पर बायनेरिज़ पर अनुमतियों का इतिहास कुछ भी नहीं है जिसके बारे में मुझे कुछ भी पता नहीं है। यह अनुमान लगाया जा सकता है कि उन्हें निर्देशिका से अनुमतियाँ विरासत में मिली हैं, या केवल umaskलिनक्स के डिफ़ॉल्ट से, लेकिन मुझे वास्तव में नहीं पता है।

मुझे क्या पता है कि OpenBSD बेस सिस्टम 1 में बायनेरिज़ को डिफ़ॉल्ट रूप से अनुमति मोड 555 के साथ स्थापित करता है ( -r-xr-xr-x)। यह एक मेकफाइल टुकड़ा में निर्दिष्ट है /usr/share/mk/bsd.own.mkजिसमें BINMODE555 सेट करता है (जब तक कि यह पहले से सेट न हो)। यह बाद में उपयोग किया जाता है जब निष्पादन के दौरान स्थापित किया जाता make buildहै /usr/src

मैंने इस फाइल के लिए एनोटेट सीवीएस लॉग पर एक नजर डाली , और पाया कि फाइल में यह लाइन अपरिवर्तित है क्योंकि इसे 1995 में NetBSD से आयात किया गया था।

NetBSD पर, फ़ाइल को पहली बार 1993 में CVS में रखा गया था, जिसमें BINMODE555 सेट थे।

फ्रीबीएसडी परियोजना ने लगता है कि कम से कम 1994 के बाद से नेटबीएसडी के रूप में एक ही फाइल का उपयोग किया है , और बाद में कमिट के साथ इस संदेश में एक संकेत जोड़ता है कि पुरानी फाइलें बर्कले सॉफ्टवेयर वितरण के 4.4BSD रिलीज से थीं।

इसके अलावा, बर्कले में सीएसआरजी ने एससीएससी में स्रोतों को रखा था, लेकिन उनकी रिपॉजिटरी GitHub 2 पर Git रूप में उपलब्ध है । फ़ाइल है कि हम forencic इलाज यहां दे रहे हैं किया गया है लगता है द्वारा कीथ बोस्टिक 1990 में (या उसे करीब निकटता में किसी को)।

तो वो कहानी है। यदि आप चाहते हैं क्यों , तो मुझे लगता है कि हम कीथ पूछने के लिए होगा। मैं एक बदलाव के लिए एक प्रतिबद्ध संदेश देखने की उम्मीद कर रहा था जिसमें कहा गया था कि " यह 555 होना चाहिए क्योंकि ... ", लेकिन नहीं।

1 बीएसडी सिस्टम में लिनक्स की तुलना में "बेस सिस्टम" और "3 पार्टी पैकेज" (पोर्ट / पैकेज) में एक सख्त विभाजन होता है। आधार प्रणाली एक सुसंगत इकाई है जो ऑपरेटिंग सिस्टम को चलाने के लिए सुविधाओं का एक पूरा सेट प्रदान करती है, जबकि बंदरगाहों या पैकेजों को "स्थानीय सॉफ़्टवेयर" के रूप में देखा जाता है और इसके तहत स्थापित किया जाता है /usr/local

यूनिक्स के Un० के बाद से रिलीज होने वाली एक अधिक व्यापक गिटहॉस रिपॉजिटरी भी उपलब्ध है


1
जवाब देने के लिए धन्यवाद। लिखने की अनुमति सामान्य है क्योंकि यह मूल उपयोगकर्ता होने के रूप में वास्तव में कोई फर्क नहीं पड़ता (वह कुछ भी कर सकता है)। लेकिन, जैसा कि यह वास्तव में मायने नहीं रखता है, अगर हम शुरू से ही ऐसा नहीं करते हैं तो हम कोई लिखित अनुमति क्यों नहीं देते हैं? क्या यह मनमाना फैसला है?
t1m0th33

1
@ t1m0th33 मुझे विश्वास है कि यह एक मनमाना निर्णय हो सकता है जिसे किसी ने लिया है, हाँ। जैसा कि मैंने कहा, मेरे OpenBSD सिस्टम पर, उन स्थानों की फाइलें राइट नहीं हैं root
Kusalananda

1
मुझे नहीं लगता कि यह किसी के द्वारा किया गया एक सचेत निर्णय है। पैकेज प्रबंधक फ़ाइल को स्थापित करने की अनुमति उन डिफ़ॉल्ट बिट्स के साथ देता है जिन्हें उन्होंने निर्माण प्रक्रिया के दौरान समाप्त किया था; लिंकर का निर्माण करते समय 755 की अनुमतियों के साथ फाइलें बनाई गईं, क्योंकि आपको 777 से umask घटाते समय क्या मिलता है, और umask रूट (OS विक्रेता की निर्माण मशीनों पर) का निर्माण करते समय 022 था क्योंकि 022 सभी के लिए डिफ़ॉल्ट रंबक है और बना रहा है यह 222 रूट के लिए व्यर्थ अतिरिक्त काम होगा।
हेन्निंग मैखोलम

8
+1 के लिए "अब सब कुछ पर अनुमतियाँ बदलते मत जाओ!" मैं इतने सारे जहां उपयोगकर्ता किया उबंटू पूछने पर कि जैसे प्रश्नों को देखने chmod -R पर /usrया /var, और आश्चर्य की बात है - अपने sudoकाम नहीं कर रहा या कुछ और काम नहीं कर रहा।
सर्गी कोलोडियाज़नी

4
ऐतिहासिक रूप से रूट के लिए लिखित अनुमति की अनुपस्थिति का कोई प्रभाव नहीं होगा (रूट किसी भी चीज़ को चकमा दे सकता है, और इसकी आवश्यकता भी नहीं है, क्योंकि रूट को कभी भी खुले में ईपीईएम नहीं मिलता है या वैसे भी लिखते हैं)। मुझे आश्चर्य है कि अगर यह 555 सामान शुरू हो गया, क्योंकि यह वास्तव में रूट के लिए प्रतिबंधित होना संभव हो गया था (जब सिक्योरवेल्स पहली बार दिखाई दिए थे? लगभग उसी समय 4.4BSD या शुरुआती 386BSD / NetBSD?)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.