समूह की सदस्यताएँ और सेट्युड / सेटगिड प्रक्रियाएँ


10

वे प्रक्रियाएं जो विशेषाधिकारों के माध्यम से डी-एस्केलेट करती हैंsetuid() और setgid()उनके द्वारा निर्धारित यूआईडी / जीआईडी ​​के समूह सदस्यता को विरासत में नहीं मिलती हैं।

मेरे पास एक सर्वर प्रक्रिया है जिसे एक विशेषाधिकार प्राप्त बंदरगाह को खोलने के लिए रूट के रूप में निष्पादित किया जाना चाहिए; इसके बाद यह विशिष्ट गैर-निजीकृत यूआईडी / जीआईडी, 1 - उदाहरण के लिए, उपयोगकर्ता foo(यूआईडी 73) से डी-एस्केलेट करता है । उपयोगकर्ता fooसमूह का सदस्य है bar:

> cat /etc/group | grep bar
bar:x:54:foo

इसलिए यदि मैं लॉगिन करता fooहूं, तो मैं /test.txtइन विशेषताओं के साथ एक फ़ाइल पढ़ सकता हूं :

> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar  8 16:22 /test.txt

हालांकि, निम्नलिखित सी कार्यक्रम (संकलन std=gnu99), जब रूट चलाते हैं:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main (void) {
    setgid(73);
    setuid(73);
    int fd = open("/test.txt", O_RDONLY);
    fprintf(stderr,"%d\n", fd);
    return 0;
}   

हमेशा रिपोर्ट की अनुमति से इनकार किया । मुझे लगता है कि यह एक गैर-लॉगिन प्रक्रिया होने के साथ करना है, लेकिन यह जिस तरह से अनुमतियों को काम करने के लिए माना जाता है उसी तरह का हैमस्ट्रिंग है।


1. अक्सर सर्वर के लिए एसओपी है कौन सा है, और मुझे लगता है कि एक तरीके के रूप मैंने पाया इस के आसपास होना चाहिए एक रिपोर्ट किसी की अपाचे के साथ यह कर - अपाचे ऑडियो समूह में जोड़ा गया है और जाहिरा तौर पर तो ध्वनि प्रणाली का उपयोग कर सकते हैं। बेशक, यह संभावना एक कांटे में होती है और मूल प्रक्रिया नहीं होती है, लेकिन वास्तव में मामला मेरे संदर्भ में एक ही है (यह सेट्युड कॉल के बाद होने वाली एक बच्चा प्रक्रिया है)।


स्विच setuid()/ setgid()चारों ओर कहता है।
वॉनब्रांड

@vonbrand ROTFL मुझे लगा कि मैं वहां एक फेसपाल के लिए हूं - लेकिन एक ही परिणाम, इसलिए मैं लाल हेरिंग को खत्म करने के लिए प्रश्न संपादित करूंगा।
गोल्डीलॉक्स

1
यदि आप setgid(54)इसके बजाय उपयोग करते हैं setgid(73)(जैसे कि /etc/groups, समूह के barपास 54 है), क्या यह काम करता है?
लार्जेट

@lgeorget ज़रूर, लेकिन यह उद्देश्य को हरा देता है। प्रक्रिया को अन्य कारणों से अपने स्वयं के GID की आवश्यकता होती है, और इसी तरह, उन फ़ाइलों के पास अनुमतियाँ होनी चाहिए। इसलिए समूह बहुवचन में सदस्यता आवश्यक है - जैसे, यदि आपके पास दो उपयोगकर्ता हैं जो ऐसा करने की आवश्यकता है। ध्यान दें कि आप setuid()इसे करने के बाद फिर से नहीं कर सकते ... लेकिन, हम्म् ... मुझे लगता है कि आप के साथ कर सकते हैं seteuid()...
Goldilocks

1
मेरा प्रश्न यह सुनिश्चित करना था कि कहीं और कोई छिपी हुई सूक्ष्म समस्या नहीं थी। :-)
लैजेरगेट २२

जवाबों:


14

समस्या यह है कि है setuidऔर setgid अपनी प्रक्रिया सभी साख इसकी आवश्यकता देने के लिए पर्याप्त नहीं हैं। एक प्रक्रिया के प्राधिकरण पर निर्भर करते हैं

  • इसकी यूआईडी
  • इसकी जी.आई.डी.
  • इसके पूरक समूह
  • इसकी क्षमताओं।

man 7 credentialsअधिक विस्तृत अवलोकन प्राप्त करने के लिए देखें । तो, आपके मामले में, समस्या यह है कि आपने यूआईडी और जीआईडी ​​को सही ढंग से सेट किया है, लेकिन आप प्रक्रिया के पूरक समूहों को सेट नहीं करते हैं। और समूह barमें GID 54, संख्या 73 है, इसलिए यह उस समूह के रूप में मान्यता प्राप्त नहीं है, जिसमें आपकी प्रक्रिया है।

तुम्हें करना चाहिए

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <grp.h>

int main (void) {
    gid_t supplementary_groups[] = {54};

    setgroups(1, supplementary_groups);
    setgid(73);
    setuid(73);
    int fd = open("/test.txt", O_RDONLY);
    fprintf(stderr,"%d\n", fd);
    return 0;
}  

1
यह एक दिलचस्प सवाल था जो अधिक उत्थान का हकदार है क्योंकि यह वास्तव में बहुत से लोगों के लिए उपयोगी हो सकता है। :-)
२३:१४

इसलिए मैं सीरियल पोर्ट के साथ इसी तरह का मुद्दा रख रहा था। मैंने dialoutइसे समूह के लिए लागू किया और इसने पहली बार काम किया।
tl8

0

ठीक है, जाल के चारों ओर एक सा फँस गया। मैंने पहले सोचा था कि APUE सभी उत्तरों को पकड़ लेगा, लेकिन गलत था। और मेरी कॉपी (पुराना संस्करण) काम पर है, इसलिए ... यूनिक्स और लिनक्स प्रशासन हैंडबुक के अध्याय 5 का वादा अच्छा लग रहा है, लेकिन मुझे यह नहीं मिला है (बस पहले दो संस्करणों की एक प्रति, काम पर भी)।

मुझे जो छोटे संसाधन मिले हैं ("डेमन राइटिंग यूनिक्स" के लिए गूगल) सभी महत्वपूर्ण चरणों के बारे में बात करते हैं, जैसे कि ट्टी से अलग कैसे करें, आदि। लेकिन यूआईडी / जीआईडी ​​के बारे में कुछ भी नहीं। अजीब बात है, यहां तक ​​कि http://tldp.org पर व्यापक HOWTO संग्रह का विवरण नहीं है। केवल excetion जेसन कम की है भाग मैं - लेट्स लिखें एक लिनक्स Daemon । कैसे SUID / SGID और सभी गड़बड़ काम करता है की पूरी जानकारी है चेन, वैगनर और डीन का SUID विध्वंसक (USENIX 2002 में एक पेपर)। लेकिन सावधान रहें, लिनक्स में एक अतिरिक्त यूआईडी है, एफएसयूआईडी (देखें वाल्टर का यूनिक्स असंगतता नोट: एक चर्चा के लिए यूआईडी सेटिंग फ़ंक्शंस )।

निश्चित रूप से दिल के बेहोश होने के लिए एक प्रक्रिया का निंदा करना नहीं है। लिनक्स और यूनिक्स HOWTO के लिए डी। व्हीलर के सिक्योर प्रोग्रामिंग में सामान्य सुरक्षा विचार दिए गए हैं - सिक्योर सॉफ्टवेयर बनानासिस्टेम ने अधिकांश को सरल बनाने का वादा किया है (और इस तरह गलतियों को कम करने के लिए जो सुरक्षा समस्याओं को जन्म देती है), डेमन मैनुअल देखें


1
सवाल डोनेशन के बारे में नहीं है। आपने SUID बिट (प्रक्रिया को उसके निष्पादन योग्य के स्वामी की अनुमति देते हुए) के साथ भ्रमित कर दिया है setuid(), जो प्रक्रिया को यूआईडी के मनमाने ढंग से बदलने की अनुमति देता है। SUID आमतौर पर अनुमतियों (गैर-निजीकृत -> निजीकृत) की वृद्धि की अनुमति देने का इरादा है , जबकि setuid()केवल विपरीत कर सकते हैं।
गोल्डीलॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.