2011-01-14 7 views
5

का उपयोग करके विशेषाधिकार छोड़ते समय "संचालन की अनुमति नहीं है" os.setuid()/gid() का उपयोग करने वाले यह सरल प्रोग्राम विफल क्यों होते हैं? अजगर में लिखा है लेकिन मुझे लगता है कि एक भाषा रिश्तेदार समस्या नहीं है (अंत में कर रहे हैं सभी एक ही POSIX सिस्टम कॉल):setuid() फ़ंक्शन

$ sudo python provgid.py 
0 0 0 0 1000 1000 
Traceback (most recent call last): 
    File "provgid.py", line 15, in <module> 
    os.setgid(orig_gid) 
OSError: [Errno 1] Operation not permitted 

त्रुटि क्या है:

import os, pwd 

if os.getenv("SUDO_UID") and os.getenv("SUDO_GID"): 
    orig_uid=int(os.getenv("SUDO_UID")) 
    orig_gid=int(os.getenv("SUDO_GID")) 
else: 
    pw = pwd.getpwnam("nobody") 
    orig_uid = pw.pw_uid 
    orig_gid = pw.pw_gid 

print os.getuid(), os.getgid(), os.geteuid(), os.getegid(), orig_uid, orig_gid 

os.setgid(orig_gid) 
os.setuid(orig_uid) 

यह इस अपवाद रिटर्न ?

उत्तर

2

मैं इस पुस्तकालय

http://pypi.python.org/pypi/privilege/1.0

कि सुरक्षित रूप से किसी अन्य उपयोगकर्ता को जड़ से विशेषाधिकार ड्रॉप का उपयोग कर ठीक कर दी है।

19

केवल CAP_SETGID क्षमता वाले सुपरसियर या प्रक्रियाओं को जीआईडी ​​सेट करने की अनुमति है। setuid() कॉल के बाद, प्रभावी यूआईडी 0 और नहीं है, इसलिए आपको setgid() पर कॉल करने की अनुमति नहीं है। दो कॉलों को पुन: व्यवस्थित करने का प्रयास करें।

+0

यदि मैं दो कॉल setgid() और setuid() को स्वैप करता हूं, तो उसी संदेश को प्रिंट करता है। – Emilio

+1

@Emilio: मैं इस व्यवहार को पुन: उत्पन्न नहीं कर सकता। 'Sudo' के माध्यम से रूट बनने के बाद' निश्चित रूप से 'setgid()' को कॉल करते समय यह मेरे लिए काम करता है। 'Setuid()' को पहली बार कॉल करते समय, मुझे वही त्रुटि मिलती है जो आपको मिलती है। –

+0

कुछ एपर्मर कॉन्फ़िगरेशन हो सकता है? एक बार मैं इसके कारण एक पायथन लिपि से 'tcpdump' निष्पादित नहीं कर सका (और मैं रूट था)। – Emilio

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^