对于目录文件描述符 dfd,我可以防止像 openat(dfd, "..", ...) 那样向上遍历吗?

对于目录文件描述符 dfd,我可以防止像 openat(dfd, "..", ...) 那样向上遍历吗?

$service我有一个有目录的用户/srv/$service/subdir/srv/$service模式为 0700,即只能通过 访问$service。该用户可以使用以下命令打开目录文件描述符…/subdir或其下面的任何目录:

int fd = open("…/subdir", O_RDONLY | O_CLOEXEC | O_DIRECTORY, 0);

使用 Unix 域套接字,我可以与使用另一个有效用户 ID 运行的另一个进程共享该文件描述符,否则该进程将无法访问该文件夹。到目前为止一切都很好。

但:另一个进程能够调用在的主目录中openat(fd, "../somefile", …)打开。我必须相信其他进程不会这样做。somefile$service

如何我可以防止这种情况发生吗?我是否在第一次调用时错过了一些open()会阻止目录遍历的标志?是否可以使用一些fcntl(fd, …)调用来做到这一点?或者还有其他方法吗?

答案1

但是:另一个过程[以不同用户身份运行]能够调用打开 的主目录openat(fd, "../somefile", …)中的某个文件。$service

不,不是。为此,它应该对fd其父目录具有执行权限,但父目录模式是0700,只允许所有者遍历它。

相关内容