लिनक्स सिस्टम पर निष्पादन ध्वज को बदलना। यह क्यों संभव है?


23

इसे पढ़ते हुए , मुझे निम्नलिखित कारनामे मिले:

% cp /usr/bin/id ~
% chmod -x ~/id
% ls -al ~/id
-rw-r--r-- 1 edd edd 22020 2012-08-01 15:06 /home/edd/id
% ~/id
zsh: permission denied: /home/edd/id
% /lib/ld-linux.so.2 ~/id
uid=1001(edd) gid=1001(edd) groups=1001(edd),1002(wheel)

यह स्निपेट दिखाता है कि हम सामान्य अनपेक्षित उपयोगकर्ता के रूप में फाइल सिस्टम के निष्पादन की अनुमति को तुच्छ रूप से रोक सकते हैं। मैंने इसे एक Ubuntu 12.04 पर चलाया।

जबकि फ़ाइल (1) के अनुसार लिनक्स लोडर एक साझा वस्तु है, इसमें एक प्रवेश बिंदु भी है जो इसे सीधे निष्पादित करने की अनुमति देता है। जब इस तरह से निष्पादित किया जाता है तो लिनक्स लोडर ईएलएफ बायनेरिज़ के लिए दुभाषिया के रूप में कार्य करता है।

मेरी ओपनबीएसडी मशीन पर, हालांकि, यह शोषण प्रभावी नहीं है, क्योंकि आप लोडर को एक कार्यक्रम के रूप में निष्पादित नहीं कर सकते हैं। OpenBSD मैनुअल पेज कहता है: "ld.so अपने आप में एक साझा वस्तु है जिसे शुरू में कर्नेल द्वारा लोड किया जाता है।"

सोलारिस 9 पर यह कोशिश करें, और आपको एक सेगफॉल्ट मिलेगा। मुझे यकीन नहीं है कि कहीं और क्या होता है।

मेरे प्रश्न इसलिए हैं:

  • क्यों लिनक्स लोडर (जब सीधे निष्पादित) करता नहीं एक ELF द्विआधारी की व्याख्या से पहले फाइल सिस्टम विशेषताओं की जांच?
  • एक तंत्र को क्यों लागू किया गया है, जिसे फाइलों के निष्पादन को अस्वीकार करने के लिए डिज़ाइन किया गया है, अगर यह इतना तुच्छ है? क्या मुझे कुछ याद आया?

1
कोई अच्छा कारण नहीं है, लेकिन यदि आप कभी भी अपने सिस्टम को हटाने में कामयाब रहे हैं libc(मैंने एक बार किया था, एक आर्क बॉक्स को अपग्रेड करते हुए), तो आप इस छोटे क्विक के लिए आभारी होंगे।
new123456

1
@ new123456 हे भगवान, उस अपग्रेड के बाद IRC चैनल में होना दर्दनाक था।
Rob

यह लोडर है , लिंकर नहीं है।
मोनिका

जवाबों:


33

executeअनुमति का लक्ष्य सामान्य रूप से निष्पादन को रोकना नहीं है । यह (1) यह बताने के लिए है कि कौन सी फाइलें निष्पादित की जानी हैं, और (2) एक विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में निष्पादन को रोकने के लिए , जब सेट बिट (आदि) निर्दिष्ट किया जाता है।

लिंकर हैक जितना लगता है उससे कम शोषण नहीं है। आप किसी भी गैर-निष्पादन योग्य फ़ाइल को निष्पादित कर सकते हैं जिसे आपके पास और भी आसानी से पढ़ने की अनुमति है:

$ cp unexecutable_file ~/runme
$ chmod +x ~/runme
$ ~/runme

आर्क लिनक्स फोरम पर इस चर्चा को देखें ।

संक्षेप में:

उन फ़ाइलों को चिह्नित करना, जिन्हें निष्पादित किया जाना चाहिए

जब आप एक शेल स्क्रिप्ट लिखते हैं, तो आप इसे निष्पादन योग्य के रूप में चिह्नित कर सकते हैं chmod +x। यह आपके शेल को संकेत देता है कि आप इसे निष्पादन योग्य बनाने का इरादा रखते हैं (अन्यथा सभी शेल के लिए पता है, यह सिर्फ एक और सादे पाठ फ़ाइल है)। जब आप टाइप करते हैं तो शेल इसे टैब-पूर्णता में दिखा सकता है ./Tab

इसी तरह: something.dनिर्देशिका (जैसे init.d) में स्टार्टअप या नियंत्रण शेल स्क्रिप्ट शामिल हैं जो आमतौर पर डेमॉन द्वारा स्वचालित रूप से निष्पादित होते हैं। आप निर्देशिका में एक टिप्पणी या README फ़ाइल को एक सादे पाठ फ़ाइल के रूप में रखना चाह सकते हैं। या आप किसी एक स्क्रिप्ट को अस्थायी रूप से अक्षम करना चाह सकते हैं। आप उस विशेष फ़ाइल के लिए निष्पादित बिट को साफ़ करके ऐसा कर सकते हैं। यह डेमॉन को इसे छोड़ देने के लिए कहता है।

विशेषाधिकार हनन को रोकना

setuidबिट साधन जब आप फ़ाइल को अंजाम कि, यह एक निर्दिष्ट उपयोगकर्ता (जैसे रूट) के रूप में क्रियान्वित किया जाता है।

मंच पोस्ट इसे अच्छी तरह से समझाता है:

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


2
धन्यवाद - मैंने इस तथ्य को नजरअंदाज कर दिया कि उपयोगकर्ता किसी भी फाइल को पढ़ सकता है और इसलिए वह मनमाना अनुमतियां चुन सकता है।
Edd Barrett

कैसे अनुमति के साथ फ़ाइलों के बारे में अनुमति है, लेकिन कोई पढ़ने की अनुमति?
रेयान

@LieRyan उनके बारे में क्या?
मोनिका

@BrendanLong: आप स्पष्ट रूप से उन लोगों की नकल नहीं कर सकते, इसलिए आप उनकी अनुमति नहीं बदल सकते। (लेकिन आप ऐसा क्यों करना चाहते हैं, मैं नहीं कह सकता - केवल एक चीज जिसे आप कॉपी के साथ कर सकते थे, वह निष्पादन की अनुमति छोड़ रहा है)
MSalters 8

9

यदि आपने किसी फ़ाइल तक पहुंच पढ़ ली है, तो आप हमेशा उसकी एक प्रति बना सकते हैं।

यदि आप एक व्यक्तिगत प्रतिलिपि बना सकते हैं, तो आप हमेशा उस प्रतिलिपि को निष्पादन योग्य बना सकते हैं।

यह ld-linux के bahaviour की व्याख्या नहीं करता है लेकिन यह इंगित करता है कि यह एक बहुत ही उपयोगी सुरक्षा बचाव नहीं हो सकता है।

यदि आप सख्त सुरक्षा चाहते हैं, तो SELinux पर विचार करें


यह एकदम सच है।
एड्ड बैरेट

यह सिर्फ एक वैचारिक सवाल था। मुझे लगता है कि आप फाइलसिस्टम पर भी कोई नहीं सेट कर सकते थे।
एड्ड बैरेट

2

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

$ mount -o noexec /dev/sdd1 /test
$ cd /test
$ cp /usr/bin/id .
$ ./id
-bash: ./id: Permission denied

जाहिरा तौर पर यह सवाल में उल्लेखित लोडर चाल का उपयोग करके नोक्सेक विकल्प को दरकिनार करने के लिए संभव हुआ करता था, लेकिन यह कर्नेल में कुछ संस्करणों में तय किया गया था।

से http://linux.die.net/man/8/mount :

noexec

माउंटेड फ़ाइल सिस्टम पर किसी भी बायनेरिज़ के प्रत्यक्ष निष्पादन की अनुमति न दें। (हाल ही में जब तक /lib/ld*.so / mnt / बाइनरी जैसी कमांड का उपयोग करके बायनेरिज़ को चलाना संभव था। लिनक्स 2.4.25 / 2.6.0 के बाद से यह चाल विफल रहती है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.