This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: os.defpath too permissive
Type: Stage: resolved
Components: Library (Lib) Versions: Python 3.6, Python 3.4, Python 3.5, Python 2.7
process
Status: closed Resolution: duplicate
Dependencies: Superseder: On Unix, shutil.which() and subprocess no longer look for the executable in the current directory if PATH environment variable is not set
View: 35755
Assigned To: Nosy List: dhduvall, jbeck, jwilk, martin.panter, nitishch, swalker
Priority: normal Keywords: patch

Created on 2016-02-22 22:50 by jbeck, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
2.7-defpath.patch jbeck, 2016-02-22 22:50
Messages (3)
msg260703 - (view) Author: John Beck (jbeck) Date: 2016-02-22 22:50
A bug has been filed against Solaris' internal version of Python, which is
largely the same (including in this case) as the base version we get from
python.org.  The bug is that os.defpath starts with ':' and thus any Python
script run with a null PATH environment variable will use the current
working directory as its first entry.  This is generally considered to
be bad practice, and especially dangerous for anyone running with root
privileges on a Unix box.  So we intend to change Solaris' version of
Python to elide this, i.e., to apply the attached patch to our 2.7 version
and comparable patches to our 3.4 and 3.5 versions

As a precaution, I queried the security list before filing this bug, asking:

* Is this intentional?  (Seems like it but I couldn't find any documentation
  to confirm.)
* If so, why?  (Feel free to point me to any docs I missed.)
* If it is intentional, and we were to change our version anyway, do you know
  of any gotchas we should look out for?  There were no regressions when I
  ran the Python test suite.

and got the following reply:

---
From: Guido van Rossum <guido@python.org>
Date: Sat, 20 Feb 2016 09:29:11 -0800
Subject: Re: [PSRT] os.defpath too permissive

Wow. That looks like something really old. I think you can just file
an issue with a patch for this at bugs.python.org. I agree that it
should be fixed. I don't think there are many users that would be
vulnerable, nor do I think that much code would break; the only use in
the stdlib has os.environ.get("PATH", os.defpath) so in all practical
cases it would get the user's $PATH variable (which is presumably
safe) anyway.
---

So I am now filing this bug as suggested.
msg260717 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2016-02-23 09:50
Digging through the history, it has been this way since at least revision d5b67d2ec7ee (1994).

Removing the colon is definitely a good idea. Maybe this might be a more proper way to get the default PATH:

>>> os.confstr("CS_PATH")
'/bin:/usr/bin'
msg307816 - (view) Author: Jakub Wilk (jwilk) Date: 2017-12-07 16:37
Linux man page for execvp(3)
<http://man7.org/linux/man-pages/man3/execvp.3.html> says:

> The default search path (used when the environment does not contain
> the variable PATH) shows some variation across systems.  It generally
> includes /bin and /usr/bin (in that order) and may also include the
> current working directory.  On some other systems, the current
> working is included after /bin and /usr/bin, as an anti-Trojan-horse
> measure.  The glibc implementation long followed the traditional
> default where the current working directory is included at the start
> of the search path.  However, some code refactoring during the
> development of glibc 2.24 caused the current working directory to be
> dropped altogether from the default search path.  This accidental
> behavior change is considered mildly beneficial, and won't be
> reverted.

So while having cwd is os.defpath has some historical justification,
now that glibc dropped it from its default PATH, it would be prudent for
Python to follow the suit.
History
Date User Action Args
2022-04-11 14:58:27adminsetgithub: 70602
2019-01-17 23:16:04eryksunsetstatus: open -> closed
superseder: On Unix, shutil.which() and subprocess no longer look for the executable in the current directory if PATH environment variable is not set
resolution: duplicate
stage: resolved
2017-12-08 18:56:47gvanrossumsetnosy: - gvanrossum
2017-12-08 18:55:53nitishchsetnosy: + nitishch
2017-12-07 16:37:29jwilksetnosy: + jwilk
messages: + msg307816
2016-02-24 02:16:33swalkersetnosy: + swalker
2016-02-23 09:50:38martin.pantersetnosy: + martin.panter
messages: + msg260717
2016-02-22 22:57:47gvanrossumsetnosy: + gvanrossum
2016-02-22 22:55:47dhduvallsetnosy: + dhduvall
2016-02-22 22:50:17jbeckcreate