क्या एक सुपरयुसर प्रक्रिया एक वास्तविक उपयोगकर्ता आईडी और समूह आईडी की प्रक्रिया को बदल सकती है, जो पासवर्ड फ़ाइल में मेल नहीं खाती है?


11

APUE से

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

क्या एक सुपरयुसर प्रक्रिया वास्तविक उपयोगकर्ता आईडी और वास्तविक समूह आईडी की प्रक्रिया को बदल सकती है, ताकि वास्तविक उपयोगकर्ता आईडी और वास्तविक समूह आईडी के बीच का संबंध पासवर्ड फ़ाइल में मेल न खाए? उदाहरण के लिए, यदि उपयोगकर्ता Timसमूह का सदस्य नहीं है oceanप्रति पासवर्ड फ़ाइल, एक सुपर उपयोगकर्ता प्रक्रिया वास्तविक यूजर आईडी और एक प्रक्रिया की वास्तविक समूह आईडी होने के लिए बदल सकते हैं Timऔर oceanक्रमश:?


5
यहां एक महत्वपूर्ण स्पष्टीकरण: सुपरसुसर विशेषाधिकारों के साथ चलने वाली एक प्रक्रिया में अपने स्वयं के यूआईडी और जीआईडी को बदलने की क्षमता है , न कि किसी अन्य प्रक्रिया की।
filbranden


उपयोगकर्ता जानकारी डेटाबेस विशुद्ध रूप से उपयोगकर्ताभूमि है। कर्नेल केवल यूआईडी और जीआईडी ​​के बारे में परवाह करता है, उपयोगकर्ता या समूह डेटाबेस के बारे में नहीं।
12 :02 德里克

जवाबों:


15

हां, एक सुपरसुसर प्रक्रिया अपनी वास्तविक उपयोगकर्ता आईडी और वास्तविक समूह आईडी को किसी भी मूल्य में बदल सकती है, जिसकी वह इच्छा रखती है। मूल्यों में /etc/passwdऔर /etc/shadowकिन मूल्यों के लिए विन्यास होना चाहिए, लेकिन संभव मूल्यों की सीमा नहीं है।

# 1 संपादित करें

इसका अर्थ है जैसे प्रोग्राम loginफाइलों से मूल्यों को पढ़ेंगे, इसलिए फाइलें कॉन्फ़िगरेशन फाइलें या इनपुट फाइलें हैं। वे इस बात पर विवश नहीं हैं कि कोई कार्यक्रम क्या कर सकता है। एक सुपरयुसर प्रक्रिया कर्नेल के लिए किसी भी मान को पारित कर सकती है, और कर्नेल किसी भी फाइल की जांच नहीं करेगा।

एक कार्यक्रम बुला सकता है

setgid (54321);
setuid (12345);

और यह काम करेगा, भले ही किसी भी फ़ाइल में आईडी का उल्लेख न किया गया हो।


9

पासवर्ड फ़ाइल और समूह फ़ाइल नहीं पढ़ी जाती है, वे केवल लॉगिन प्रक्रिया द्वारा पढ़ी जाती हैं, वास्तविक उपयोगकर्ता आईडी और वास्तविक समूह आईडी सेट करने के लिए।

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

CAP_SETUID क्षमता वाली कोई भी प्रक्रिया इन ID को सेट कर सकती है, रूट में यह क्षमता है।

यूनिक्स में सुरक्षा मॉडल, कर्नेल में लागू किया गया हिस्सा है, और इस प्रक्रिया में लागू किया गया भाग जो उन्नत क्षमताओं (जैसे रूट) के साथ चलता है।


ध्यान दें कि /etc/passwdऔर /etc/groupइसके द्वारा भी पढ़ा जाता है ls, psऔर किसी भी अन्य प्रोग्राम को उपयोगकर्ता / समूह के नाम को / उपयोगकर्ता आईडी / समूह आईडी से अनुवाद करने की आवश्यकता है। (वे एक पुस्तकालय के माध्यम से ऐसा कर सकते हैं, इन विवरणों को संग्रहीत करने के वैकल्पिक तरीकों के बारे में जानते हैं।)


1
वे ( /etc/passwd, /etc/groups) भी प्रक्रियाओं जो या उपयोगकर्ता प्रक्रिया आंतरिक सांख्यिक आईडी, जैसे के बजाय नाम दिखाना चाहते द्वारा पढ़ा जाता है psऔर ls
जोनास श्फर

3

अन्य बातों के अलावा, /etc/passwdउपयोगकर्ता का नाम उपयोगकर्ता के यूआईडी में अनुवाद करना है । यदि आपको परवाह नहीं है कि बॉब का यूआईडी क्या है, तो आपको उस फ़ाइल की आवश्यकता नहीं है। यदि आप केवल यूआईडी / जीआईडी ​​को एक मनमाना बदलना चाहते हैं, तो संबंधित syscalls का उपयोग करें:

int setuid(uid_t uid);
int setgid(gid_t gid);

ध्यान दें कि एक विशेषाधिकार प्राप्त प्रक्रिया CAP_SETUIDऔर CAP_SETGID क्षमताओं के साथ (जो एक रूट प्रक्रिया आमतौर पर होती है) केवल अपने स्वयं के यूआईडी और जीआईडी ​​को बदल सकती है, न कि किसी अन्य चल रही प्रक्रिया की।

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