$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
,只允许所有者遍历它。