सेतु निष्पादन योग्य पर काम क्यों नहीं करता है?


9

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

लेकिन यह चलने से पहले और बाद में एक ही यूआईडी (1000) देता है sudo chmod +s ./setuid-test। मुझे लगता है कि इसका मतलब यह है कि सेतुबंध का मेरे निष्पादन पर कोई प्रभाव नहीं पड़ता है, क्यों और कैसे हल करना है?

स्रोत कोड:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

साथ बनाया और चलाया

$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000

दौड़ते समय ls -la, मुझे यही मिलता है:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test

2
क्या आपके द्वारा चलाए जा रहे एक के अलावा एक उपयोगकर्ता के पास निष्पादन योग्य स्वामित्व है? (सेट्युइड का अर्थ रूट में परिवर्तन नहीं है; इसका अर्थ है कि निष्पादन योग्य होने वाले उपयोगकर्ता के लिए परिवर्तन।)
cjm

PHPLearner मुझे लगता है कि आपको फ़ाइल के SUID को बदलने के लिए एक समूह / उपयोगकर्ता को शामिल करना होगा
ryekayo

@cjm me@me:~$ ls -la setuid-test---- रिटर्न -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP लर्नर

7
आपका प्रोग्राम मेरे Ubuntu 14.04 सिस्टम पर अपेक्षित रूप से काम करता है अगर यह मेरे होम डायरेक्टरी में है, लेकिन तब नहीं है जब यह / tmp में है, क्योंकि पैरामीटर ने / setpid प्रोग्राम को टैम्प माउंट करने के लिए उपयोग किया है। आपका कार्यक्रम कहाँ स्थित है?
मार्क प्लॉटनिक

2
df .माउंट बिंदु को खोजने के लिए निर्देशिका में टाइप करें , फिर mount | grep nameofmountpoint। क्या वहाँ कोई nosuidध्वज सूचीबद्ध है?
मार्क प्लॉटनिक

जवाबों:


10

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

आपके मामले में, आपके द्वारा उपयोग किया जा रहा फाइलसिस्टम, टाइप क्रिप्टोकरंसी है, जो कि आक्यूबंटु के अनुसार : एन्क्रिप्टेड होम डायरेक्टरी के तहत रूट सेतु के साथ बाइनरी को चलाने में त्रुटि स्वतः nosuid (और नोडव) को लागू करती है, कुछ साल पहले संस्करणों से शुरू होती है।

यहाँ परिवर्तन का कारण का वर्णन, https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 से दिया गया है :

विंसेंट दानेन 2012-07-20 11:25:56 EDT
यह बताया गया था कि निजी ecryptfs माउंट हेल्पर (/sbin/mount.ecryptfs_pStreet) है, जो सेतु-रूट है, एक अप्रभावी स्थानीय उपयोगकर्ता को उपयोगकर्ता-नियंत्रित ecryptfs शेयर माउंट करने की अनुमति दे सकता है स्थानीय प्रणाली पर। चूँकि ecryptfs हेल्पर "nosuid" और "नोडव" झंडे के साथ फाइल सिस्टम को माउंट नहीं करता है, इसलिए उपयोगकर्ता के लिए setuid-root binaries और / या डिवाइस फ़ाइलों वाली फाइल सिस्टम को माउंट करना संभव होगा, जो उनके विशेषाधिकारों की वृद्धि का कारण बन सकता है। यह एक यूएसबी डिवाइस के माध्यम से किया जा सकता है, अगर उपयोगकर्ता को सिस्टम तक भौतिक पहुंच थी।
...
मजबूरन MS_NOSUID और MS_NODEV माउंट झंडे को संस्करण 99 में जोड़ा गया।


यदि सिस्टम ने एक उपयोगकर्ता को एक फ़ाइल-सिस्टम को माउंट करने की अनुमति दी है जो सेट्यूइड की अनुमति देता है, तो यह रूट बनने के लिए तुच्छ होगा। 1) एक निष्पादन योग्य 2 बनाएं) कहीं और chown root, chmod +s3) इसे 4 माउंट करें) निष्पादन योग्य चलाएं
ctrl-alt-delor

1

निष्पादन योग्य पर SetUID बिट फ़ाइल स्वामी ( सुपरयुजर नहीं) पर निष्पादन योग्य चलाने की अनुमति देता है । निष्पादन योग्य को रूट के रूप में चलाने में सक्षम होने के लिए, निष्पादित करें:

sudo chown 0:0 ./setuid-test

ज़रूर, लेकिन यह मुद्दा नहीं है। ऐसा प्रोग्राम संभव है जो रूट के अलावा किसी अन्य उपयोगकर्ता के लिए सेट किया गया हो। प्रश्न में परिदृश्य में, UID setuid-testप्रदर्शित होना चाहिए nobody
गिल्स एसओ- बुराई को रोकना '

@ गिल्स आप सही कह रहे हैं। मुझे उम्मीद है कि setuid- परीक्षण प्रदर्शित करता है nobody, न किroot
PHP Learner

"निष्पादन योग्य पर सेट बिट फ़ाइल स्वामी पर निष्पादन योग्य चलाने की अनुमति देता है" और मेरा फ़ाइल मालिक है nobody, इस प्रकार मैं 65534बदले में उम्मीद करता हूं , लेकिन मैं देखता हूं कि 1000कोई भी मालिक हो!
PHP लर्नर

2
उस फ़ाइल सिस्टम के माउंट विकल्पों की जाँच करें जिस पर आपका परीक्षण कार्यक्रम चलता है। यदि यह साथ में रखा गया है nosuid, तो आपका कार्यक्रम संभवतः काम नहीं कर सकता है।
काउंटरमोड

1
@countermode @MarkPlotnick mount | grep /home/meरिटर्न /home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)
PHP लर्नर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.