mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-13 04:53:01 +00:00
fix env when using setuid
avoids subprocess identifying as root
This commit is contained in:
@@ -50,7 +50,7 @@ class Spawner(LoggingConfigurable):
|
|||||||
pass
|
pass
|
||||||
if new:
|
if new:
|
||||||
self.cmd.append('--debug')
|
self.cmd.append('--debug')
|
||||||
|
|
||||||
env_prefix = Unicode('JPY_')
|
env_prefix = Unicode('JPY_')
|
||||||
def _env_key(self, d, key, value):
|
def _env_key(self, d, key, value):
|
||||||
d['%s%s' % (self.env_prefix, key)] = value
|
d['%s%s' % (self.env_prefix, key)] = value
|
||||||
@@ -58,7 +58,9 @@ class Spawner(LoggingConfigurable):
|
|||||||
env = Dict()
|
env = Dict()
|
||||||
def _env_default(self):
|
def _env_default(self):
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
self._env_key(env, 'COOKIE_SECRET', self.user.server.cookie_secret)
|
for key in ['HOME', 'USER', 'USERNAME', 'LOGNAME', 'LNAME']:
|
||||||
|
env.pop(key, None)
|
||||||
|
self._env_key(env, 'COOKIE_SECRET', self.user.server.cookie_secret.decode('ascii'))
|
||||||
self._env_key(env, 'API_TOKEN', self.api_token)
|
self._env_key(env, 'API_TOKEN', self.api_token)
|
||||||
return env
|
return env
|
||||||
|
|
||||||
@@ -142,15 +144,15 @@ def set_user_setuid(username):
|
|||||||
home = user.pw_dir
|
home = user.pw_dir
|
||||||
|
|
||||||
def preexec():
|
def preexec():
|
||||||
# start in the user's home dir
|
|
||||||
os.chdir(home)
|
|
||||||
|
|
||||||
# don't forward signals
|
# don't forward signals
|
||||||
os.setpgrp()
|
os.setpgrp()
|
||||||
|
|
||||||
# set the user and group
|
# set the user and group
|
||||||
os.setgid(gid)
|
os.setgid(gid)
|
||||||
os.setuid(uid)
|
os.setuid(uid)
|
||||||
|
|
||||||
|
# start in the user's home dir
|
||||||
|
os.chdir(home)
|
||||||
|
|
||||||
return preexec
|
return preexec
|
||||||
|
|
||||||
@@ -222,13 +224,18 @@ class LocalProcessSpawner(Spawner):
|
|||||||
"""Start the process"""
|
"""Start the process"""
|
||||||
self.user.server.port = random_port()
|
self.user.server.port = random_port()
|
||||||
cmd = []
|
cmd = []
|
||||||
|
env = self.env
|
||||||
if self.set_user == 'sudo':
|
if self.set_user == 'sudo':
|
||||||
cmd = self.sudo_cmd(self.user)
|
cmd = self.sudo_cmd(self.user)
|
||||||
|
elif self.set_user == 'setuid':
|
||||||
|
env['USER'] = self.user.name
|
||||||
|
env['HOME'] = pwd.getpwnam(self.user.name).pw_dir
|
||||||
|
|
||||||
cmd.extend(self.cmd)
|
cmd.extend(self.cmd)
|
||||||
cmd.extend(self.get_args())
|
cmd.extend(self.get_args())
|
||||||
|
|
||||||
self.log.info("Spawning %r", cmd)
|
self.log.info("Spawning %r", cmd)
|
||||||
self.proc = Popen(cmd, env=self.env,
|
self.proc = Popen(cmd, env=env,
|
||||||
preexec_fn=self.make_preexec_fn(self.user.name),
|
preexec_fn=self.make_preexec_fn(self.user.name),
|
||||||
)
|
)
|
||||||
self.pid = self.proc.pid
|
self.pid = self.proc.pid
|
||||||
|
Reference in New Issue
Block a user