Skip to content

Commit

Permalink
Improve security of get_runtime_dir(strict=False)
Browse files Browse the repository at this point in the history
Fixes fd.o bug #73878.
  • Loading branch information
takluyver committed Jan 23, 2014
1 parent fc61714 commit bd999c1
Showing 1 changed file with 23 additions and 8 deletions.
31 changes: 23 additions & 8 deletions xdg/BaseDirectory.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
Note: see the rox.Options module for a higher-level API for managing options.
"""

import os
import os, stat

_home = os.path.expanduser('~')
xdg_data_home = os.environ.get('XDG_DATA_HOME') or \
Expand Down Expand Up @@ -131,15 +131,30 @@ def get_runtime_dir(strict=True):

import getpass
fallback = '/tmp/pyxdg-runtime-dir-fallback-' + getpass.getuser()
create = False

try:
os.mkdir(fallback, 0o700)
# This must be a real directory, not a symlink, so attackers can't
# point it elsewhere. So we use lstat to check it.
st = os.lstat(fallback)
except OSError as e:
import errno
if e.errno == errno.EEXIST:
# Already exists - set 700 permissions again.
import stat
os.chmod(fallback, stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR)
else: # pragma: no cover
if e.errno == errno.ENOENT:
create = True
else:
raise

else:
# The fallback must be a directory
if not stat.S_ISDIR(st.st_mode):
os.unlink(fallback)
create = True
# Must be owned by the user and not accessible by anyone else
elif (st.st_uid != os.getuid()) \
or (st.st_mode & (stat.S_IRWXG | stat.S_IRWXO)):
os.rmdir(fallback)
create = True

if create:
os.mkdir(fallback, 0o700)

return fallback

0 comments on commit bd999c1

Please sign in to comment.