Fix security risks about shell=True 21/50021/2
authorAlex Yang <yangyang1@zte.com.cn>
Thu, 4 Jan 2018 08:40:02 +0000 (16:40 +0800)
committerAlex Yang <yangyang1@zte.com.cn>
Thu, 4 Jan 2018 09:21:38 +0000 (17:21 +0800)
Change-Id: I2db012e2b6a4325c42d5422901dea52a5ab7f664
Signed-off-by: Alex Yang <yangyang1@zte.com.cn>
deploy/utils.py
tests/unit/test_utils.py

index 55fbc53..d0e6735 100644 (file)
@@ -124,10 +124,9 @@ def ipmi_reboot_node(host, user, passwd, boot_source=None):
 
 
 def run_shell(cmd, check=False):
-    process = subprocess.Popen(cmd,
+    process = subprocess.Popen(cmd.split(),
                                stdout=subprocess.PIPE,
-                               stderr=subprocess.PIPE,
-                               shell=True)
+                               stderr=subprocess.PIPE)
     while process.poll() is None:
         LD(process.stdout.readline().strip())
 
index e3b9dff..4998a44 100644 (file)
@@ -183,19 +183,16 @@ def test_ipmi_reboot_node(mock_getstatusoutput, mock_err_exit,
 
 
 @pytest.mark.parametrize('cmd, check, expect', [
-    ('cd /home', False, 0),
-    ('cd /home', True, 0),
+    ('ls /home', False, 0),
+    ('ls /home', True, 0),
     ('test_command', False, 127),
     ('test_command', True, 127)])
-@mock.patch('deploy.utils.err_exit')
-def test_run_shell(mock_err_exit, cmd, check, expect):
-    ret = run_shell(cmd, check=check)
-    if check:
-        if cmd == 'cd /home':
-            mock_err_exit.assert_not_called()
-        elif cmd == 'test_command':
-            mock_err_exit.assert_called_once()
-    assert ret == expect
+def test_run_shell(cmd, check, expect):
+    try:
+        ret = run_shell(cmd, check=check)
+        assert ret == expect
+    except OSError:
+        assert cmd == 'test_command'
 
 
 @pytest.mark.parametrize('scenario', [