python的popen(和类似)函数是否受Shellshock影响?

信息安全 炮击 Python
2021-08-18 18:27:54

基本上哪些 python 的函数会触发 bash(并且可能会受到 shellshock 的影响),哪些不会?

我通过在一些脚本中看到这个popen()函数来提出这个问题。

我的问题与 Python 2 和 3 有关。

2个回答

在某些时候调用的任何程序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

我希望这可以为您的问题提供充分的临时答复。