Call setgroups() before setuid() and setgid().
Fixes bug 989569. This patch ensures that the list of groups is completely reset when dropping privileges. Change-Id: I049f75e66e08a4a6361504b013bc68c4c38ef093
This commit is contained in:
parent
80a3cb556d
commit
e90424e88b
@ -465,6 +465,8 @@ def drop_privileges(user):
|
|||||||
:param user: User name to change privileges to
|
:param user: User name to change privileges to
|
||||||
"""
|
"""
|
||||||
user = pwd.getpwnam(user)
|
user = pwd.getpwnam(user)
|
||||||
|
if os.geteuid() == 0:
|
||||||
|
os.setgroups([])
|
||||||
os.setgid(user[3])
|
os.setgid(user[3])
|
||||||
os.setuid(user[2])
|
os.setuid(user[2])
|
||||||
try:
|
try:
|
||||||
|
@ -55,7 +55,7 @@ class MockOs():
|
|||||||
def pass_func(self, *args, **kwargs):
|
def pass_func(self, *args, **kwargs):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
chdir = setsid = setgid = setuid = umask = pass_func
|
setgroups = chdir = setsid = setgid = setuid = umask = pass_func
|
||||||
|
|
||||||
def called_func(self, name, *args, **kwargs):
|
def called_func(self, name, *args, **kwargs):
|
||||||
self.called_funcs[name] = True
|
self.called_funcs[name] = True
|
||||||
@ -67,6 +67,10 @@ class MockOs():
|
|||||||
def dup2(self, source, target):
|
def dup2(self, source, target):
|
||||||
self.closed_fds.append(target)
|
self.closed_fds.append(target)
|
||||||
|
|
||||||
|
def geteuid(self):
|
||||||
|
'''Pretend we are running as root.'''
|
||||||
|
return 0
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
# I only over-ride portions of the os module
|
# I only over-ride portions of the os module
|
||||||
try:
|
try:
|
||||||
@ -570,7 +574,8 @@ log_name = %(yarr)s'''
|
|||||||
def test_drop_privileges(self):
|
def test_drop_privileges(self):
|
||||||
user = getuser()
|
user = getuser()
|
||||||
# over-ride os with mock
|
# over-ride os with mock
|
||||||
required_func_calls = ('setgid', 'setuid', 'setsid', 'chdir', 'umask')
|
required_func_calls = ('setgroups', 'setgid', 'setuid', 'setsid',
|
||||||
|
'chdir', 'umask')
|
||||||
utils.os = MockOs(called_funcs=required_func_calls)
|
utils.os = MockOs(called_funcs=required_func_calls)
|
||||||
# exercise the code
|
# exercise the code
|
||||||
utils.drop_privileges(user)
|
utils.drop_privileges(user)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user