diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2013-06-21 23:11:41 -0400 |
---|---|---|
committer | Jason R. Coombs <jaraco@jaraco.com> | 2013-06-21 23:11:41 -0400 |
commit | be8320718ce02583374df5312502490f0bd7e8a7 (patch) | |
tree | 207b3a93bc65a2f2873db5f744267f7c3c30d26c /pkg_resources.py | |
parent | f3dce599fca8023d441decd8c60896c44151b803 (diff) | |
download | external_python_setuptools-be8320718ce02583374df5312502490f0bd7e8a7.tar.gz external_python_setuptools-be8320718ce02583374df5312502490f0bd7e8a7.tar.bz2 external_python_setuptools-be8320718ce02583374df5312502490f0bd7e8a7.zip |
Issue a UserWarning when the egg cache directory is likely to be vulnerable to security issues per #375.
--HG--
branch : distribute
Diffstat (limited to 'pkg_resources.py')
-rw-r--r-- | pkg_resources.py | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/pkg_resources.py b/pkg_resources.py index f8de449e..50e4ce9b 100644 --- a/pkg_resources.py +++ b/pkg_resources.py @@ -14,6 +14,8 @@ method. """ import sys, os, zipimport, time, re, imp, types +import warnings +import stat from urlparse import urlparse, urlunparse try: @@ -987,6 +989,7 @@ variable to point to an accessible directory. extract, as it tracks the generated names for possible cleanup later. """ extract_path = self.extraction_path or get_default_cache() + self._warn_unsafe_extraction(extract_path) target_path = os.path.join(extract_path, archive_name+'-tmp', *names) try: _bypass_ensure_directory(target_path) @@ -996,6 +999,28 @@ variable to point to an accessible directory. self.cached_files[target_path] = 1 return target_path + @staticmethod + def warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH: + msg = ("%s is writable by others and vulnerable to attack when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path) + warnings.warn(msg, UserWarning) |