fstat() 是安全的(沙箱)操作吗?
我现在正在用沙盒版的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)。