Root Priv Can't Be Dropped In Python Even After Seteuid. A Bug?
Solution 1:
Manipulating process credentials on Unix systems is tricky. I highly recommend gaining a thorough understanding of how the Real, Effective, and Saved-Set user ids are interrelated. It's very easy to screw up "dropping privileges".
As to your specific observations... I'm wondering if there's a simple cause you may have overlooked. Your code is preforming a inconsistent tests and you've neglected to specify the exact file permissions on your /etc/sudoers
and /etc/group-
files. Your could would be expected to behave exactly as you describe if /etc/sudoers
has permissions mode=440, uid=root, gid=root (which are the default permissions on my system) and if /etc/group-
has mode=400.
You're not modifying the process's GID so if /etc/sudoers
is group-readable, that would explain why it's always readable. fork()
does not modify process credentials. However, it could appear to do so in your example code since you're checking different files in the parent and child. If /etc/group-
does not have group read permissions where /etc/sudoers
does, that would explain the apparent problem.
If all you're trying to do is "drop privileges", use the following code:
os.setgid( NEW_GID )
os.setuid( NEW_UID )
Generally speaking, you'll only want to manipulate the effective user id if your process needs to toggle it's root permissions on and off over the life of the process. If you just need to do some setup operations with root permissions but will no longer require them after those setup operations are complete, just use the code above to irrevokably drop them.
Oh, and a useful debugging utility for process credential manipulation on Linux is to print the output of /proc/self/status
, the Uid and Gid lines of this file display the real, effective, saved-set, and file ids held by the current process (in that order). The Python APIs can be used to retrieve the same information but you can consider the contents of this file as "truth data" and avoid any potential complications from Python's cross-platform APIs.
Post a Comment for "Root Priv Can't Be Dropped In Python Even After Seteuid. A Bug?"