基本上哪些 python 的函数会触发 bash(并且可能会受到 shellshock 的影响),哪些不会?
我通过在一些脚本中看到这个popen()
函数来提出这个问题。
我的问题与 Python 2 和 3 有关。
基本上哪些 python 的函数会触发 bash(并且可能会受到 shellshock 的影响),哪些不会?
我通过在一些脚本中看到这个popen()
函数来提出这个问题。
我的问题与 Python 2 和 3 有关。
在某些时候调用的任何程序bash
都会受到影响。特别是,如果系统具有asos.system
,则该函数很容易受到攻击,因此任何调用它(或其他等效项)的程序也很容易受到攻击。bash
/bin/sh
这些popen
函数可能容易受到攻击,具体取决于传递的参数。从文档中引用:
此外,对于这些变体中的每一个,在 Unix 上,
cmd
可能是一个序列,在这种情况下,参数将直接传递给程序而无需 shell 干预(如os.spawnv()
)。如果cmd
是一个字符串,它将被传递给外壳(与 一样os.system()
)。
据我了解,这意味着调用如下:
os.popenx(['executable', 'some', 'arguments'])
是安全的,因为没有调用任何 shell,而以下形式的命令:
os.popenx('executable some argument')
易受攻击,因为 shell 将用于将字符串解释为命令行。
另请注意,自 python2.6 以来,所有 popen
函数均已弃用,从那时起应该避免使用。该subprocess
模块为启动子进程提供了一个更好的接口,默认情况下它是安全的。如果您不传递shell=True
参数,您的程序将不会启动子shell,因此不会受到 shellshock 的影响。
为了安全使用subprocess
,您应该尽可能避免使用该shell=True
参数(即使在发现 shellshock 之前也是如此,并且无论如何都已被充分记录为安全隐患)。
特别是,如果您想简单地启动可执行文件,请使用subprocess.call
:
subprocess.call(['executable name', 'arg1', '--opt1', 'opt-arg', ...])
如果您不想手动编写字符串列表,则可以依赖该shlex
模块:
subprocess.call(shlex.split('executable-name arg1 "quoted arguments are correctly handled" etc'))
如果要检索命令的输出,请使用check_output
而不是call
.
如果您想运行类似的命令管道,cmd1 | cmd2 | cmd3
仍然可以避免启动 shell:
cmd1 = subprocess.Popen(cmd1_command_line, stdout=subprocess.PIPE)
cmd2 = subprocess.Popen(cmd2_command_line, stdin=cmd1.stdout, stdout=subprocess.PIPE)
cmd3 = subprocess.Popen(cmd3_command_line, stdin=cmd2.stdout, stdout=subprocess.PIPE)
使用shell=True
仅在绝对必要的,而在这种情况下考虑明确的环境中使用的传递到外壳env
的说法。
是的,popen 受 ShellShock 影响。但是,我没有提供给您的完整列表 - 任何由调用 /bin/bash 支持的内容(例如调用 /bin/sh 链接到 /bin/bash - 这是在下面的引用中假设的) 是脆弱的。
如果使用 PHP、Python、C++ 或 Java 编写的一系列 Web 应用程序调用诸如 popen() 或 system() 之类的函数,它们可能会受到攻击,因为这些函数又由调用 /bin/sh -c 提供支持,Zalewski笔记。
http://www.itnews.com.au/News/396256,further-flaws-render-shellshock-patch-ineffective.aspx
我希望这可以为您的问题提供充分的临时答复。