वे प्रक्रियाएं जो विशेषाधिकारों के माध्यम से डी-एस्केलेट करती हैं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. अक्सर सर्वर के लिए एसओपी है कौन सा है, और मुझे लगता है कि एक तरीके के रूप मैंने पाया इस के आसपास होना चाहिए एक रिपोर्ट किसी की अपाचे के साथ यह कर - अपाचे ऑडियो समूह में जोड़ा गया है और जाहिरा तौर पर तो ध्वनि प्रणाली का उपयोग कर सकते हैं। बेशक, यह संभावना एक कांटे में होती है और मूल प्रक्रिया नहीं होती है, लेकिन वास्तव में मामला मेरे संदर्भ में एक ही है (यह सेट्युड कॉल के बाद होने वाली एक बच्चा प्रक्रिया है)।
setgid(54)
इसके बजाय उपयोग करते हैं setgid(73)
(जैसे कि /etc/groups
, समूह के bar
पास 54 है), क्या यह काम करता है?
setuid()
इसे करने के बाद फिर से नहीं कर सकते ... लेकिन, हम्म् ... मुझे लगता है कि आप के साथ कर सकते हैं seteuid()
...
setuid()
/setgid()
चारों ओर कहता है।