3

我目前正在使用沙盒 PyPy 编写 Python 沙盒。基本上,沙箱通过提供一个“控制器”来工作,它将系统库调用映射到指定的函数。遵循在codepeak中找到的说明(通过设置过程)后,我意识到默认控制器不包括替换os.fstat(),因此当我调用时崩溃open()。具体来说,includedpypy/translator/sandbox/sandlib.py不包含do_ll_os__ll_os_fstat.

到目前为止,我已将其实现为:

def do_ll_os__ll_os_fstat(self, fd):
    return os.fstat(fd)

这似乎工作正常。这安全吗?这会在沙箱中创建一个洞吗?

4

2 回答 2

4

fstat 调用可以揭示您可能希望或可能不想保密的某些信息。除其他事项外:

  • 两个文件描述符是否在同一个文件系统上
  • 底层文件系统的块大小
  • 文件所有者的数字 UID/GID
  • 文件的修改/访问时间

但是,它不会修改任何东西,所以如果您不介意这种(相对较小的)信息泄漏,没问题。您还可以更改某些结果以屏蔽您想要隐藏的信息(例如,将所有者 UID/GID 设置为 0)

于 2011-07-07T15:38:05.257 回答
3

bdonlan 的回答很好,但是既然这里有赏金,那到底是什么:-)

fstat通过阅读struct stat 的 POSIX 规范,您可以准确地了解所提供的信息。

这绝对是一个“只读”操作。通常,Unix 文件描述符只提供对它们所引用的单个对象的访问。例如,引用目录的(可读)文件描述符将允许您列出目录中的文件,但不允许您访问目录中的文件;为此,您需要open()该文件,该文件将执行权限检查。

请注意,fstat可以在目录或套接字等非文件上调用。但是,在这里,它只会提供您在其中看到的信息,struct stat并且不会修改任何内容。(对于套接字,大多数字段将毫无意义。)

于 2011-07-09T05:04:41.617 回答