【发布时间】:2016-05-31 17:42:10
【问题描述】:
我有 python 脚本,里面有代码。
...
...
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True)
output, error = p.communicate()
...
...
当我运行bandit 时,它会报错。
>> Issue: [B602:subprocess_popen_with_shell_equals_true] subprocess call with shell=True identified, security issue.
Severity: High Confidence: High
Location: mypackage/myfile.py:123
123 stderr=subprocess.PIPE,
124 shell=True)
125 output, error = p.communicate()
然后我用谷歌搜索了一下,发现我必须清理我的输入,并使用 shlex.split 和 shlex.quote 清理它。
我将代码更改为。
...
...
p = subprocess.Popen(shlex.split(shlex.quote(cmd)),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True)
output, error = p.communicate()
...
...
但我还是遇到同样的错误,运行bandit -r mypackage/myfile.py时有什么办法可以消除这个错误
【问题讨论】:
-
bandit无法确定命令参数是否经过充分清理;它只能检测到您使用Popen的方式可能 是一个安全问题。你最好离开shell=False,自己准备cmd,以供exec直接使用。 -
分析器无法判断您正在运行的命令是否是您想要运行的命令。根据您的操作,对解释器进行沙箱处理(例如使用codejail)可能是合适的或必要的。这涉及输入清理和严格控制的操作系统权限的组合。
-
@chepner,
exec表示,subprocess.exec? -
exec表示实际用于执行命令的任何底层系统调用。使用带有shell=False的列表更安全,因为没有任何东西可以解释参数;字符串按原样传递。 -
使用
shell=True是否安全取决于cmd的来源(您是否使用用户输入来构造它?)。在这里打电话shlex.quote()、shlex.split()是没有意义和错误的。
标签: python shell subprocess openstack popen