mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-30730: Prevent environment variables injection in subprocess on Windows. (#2325)
Prevent passing other invalid environment variables and command arguments.
This commit is contained in:
parent
d352d68977
commit
d174d24a5d
5 changed files with 72 additions and 9 deletions
|
@ -655,6 +655,46 @@ class ProcessTestCase(BaseTestCase):
|
|||
if not is_env_var_to_ignore(k)]
|
||||
self.assertEqual(child_env_names, [])
|
||||
|
||||
def test_invalid_cmd(self):
|
||||
# null character in the command name
|
||||
cmd = sys.executable + '\0'
|
||||
with self.assertRaises(ValueError):
|
||||
subprocess.Popen([cmd, "-c", "pass"])
|
||||
|
||||
# null character in the command argument
|
||||
with self.assertRaises(ValueError):
|
||||
subprocess.Popen([sys.executable, "-c", "pass#\0"])
|
||||
|
||||
def test_invalid_env(self):
|
||||
# null character in the enviroment variable name
|
||||
newenv = os.environ.copy()
|
||||
newenv["FRUIT\0VEGETABLE"] = "cabbage"
|
||||
with self.assertRaises(ValueError):
|
||||
subprocess.Popen([sys.executable, "-c", "pass"], env=newenv)
|
||||
|
||||
# null character in the enviroment variable value
|
||||
newenv = os.environ.copy()
|
||||
newenv["FRUIT"] = "orange\0VEGETABLE=cabbage"
|
||||
with self.assertRaises(ValueError):
|
||||
subprocess.Popen([sys.executable, "-c", "pass"], env=newenv)
|
||||
|
||||
# equal character in the enviroment variable name
|
||||
newenv = os.environ.copy()
|
||||
newenv["FRUIT=ORANGE"] = "lemon"
|
||||
with self.assertRaises(ValueError):
|
||||
subprocess.Popen([sys.executable, "-c", "pass"], env=newenv)
|
||||
|
||||
# equal character in the enviroment variable value
|
||||
newenv = os.environ.copy()
|
||||
newenv["FRUIT"] = "orange=lemon"
|
||||
with subprocess.Popen([sys.executable, "-c",
|
||||
'import sys, os;'
|
||||
'sys.stdout.write(os.getenv("FRUIT"))'],
|
||||
stdout=subprocess.PIPE,
|
||||
env=newenv) as p:
|
||||
stdout, stderr = p.communicate()
|
||||
self.assertEqual(stdout, b"orange=lemon")
|
||||
|
||||
def test_communicate_stdin(self):
|
||||
p = subprocess.Popen([sys.executable, "-c",
|
||||
'import sys;'
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue