fstat() 是安全的(沙箱)操作吗?

3 投票
2 回答
658 浏览
提问于 2025-04-16 20:49

我现在正在用沙盒版的PyPy写一个Python沙盒。简单来说,这个沙盒通过提供一个“控制器”来工作,这个控制器会把系统库的调用映射到一个指定的函数上。按照codespeak上找到的说明(这些说明指导了设置过程),我发现默认的控制器并没有替代os.fstat()的功能,所以当我调用open()时就崩溃了。具体来说,包含的pypy/translator/sandbox/sandlib.py文件里没有do_ll_os__ll_os_fstat的定义。

到目前为止,我已经实现了如下内容:

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

看起来运行得不错。这这样做安全吗?会不会在沙盒里留下漏洞?

2 个回答

3

bdonlan的回答很好,但既然这里有悬赏,那就随便说说吧 :-)

你可以通过查看POSIX规范中的struct stat,自己了解fstat提供了哪些信息。

这绝对是一个“只读”的操作。一般来说,Unix的文件描述符只允许访问它所指向的单个对象。例如,一个指向目录的(可读)文件描述符可以让你列出目录中的文件,但它不能让你直接访问目录里的文件;要访问文件,你需要用open()来打开它,这样系统会检查你是否有权限。

要注意的是,fstat也可以用于非文件的对象,比如目录或套接字。不过,它仍然只会提供你在struct stat中看到的信息,并不会修改任何东西。(对于套接字来说,大部分字段是没有意义的。)

4

fstat这个调用可以显示一些信息,这些信息你可能想保密,也可能不在乎。具体来说,它能告诉你:

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

不过,它不会修改任何东西,所以如果你不在乎这些(相对小的)信息泄露,那就没问题。你也可以改变一些结果来隐藏你想保密的信息(比如把文件拥有者的UID/GID设置为0)。

撰写回答