根据access()无法写目录,用户仍然可以在其中创建文件

时间:2018-10-10 21:33:19

标签: c libc rlwrap

我收到了bug report 那让我挠头。在我的程序中,我测试了 目录的可写性(即用户的主目录 默认情况下),然后readline收集历史记录并将其写入程序出口处的该目录中的文件中。

这是有问题的代码:

if (access(dirname, W_OK) != 0)
  complain("cannot create %s in %s", filename, dirname, errno);
else {
  use_readline_for_stuff();
  write_history("%s/%s", dirname, filename);
  exit(0);
}

(当然,这是伪C。实际代码是here

用户(我们叫她USER)报告收到一条错误消息“无法在其中创建xxx / home / USER:权限被拒绝”,在使用USER@host > touch /home/USER/xxx手动创建文件后消失。

我希望一个不可写的主目录会导致各种 问题,但用户甚至可以简单地touch在该目录中的文件。

该程序未运行suid,USER拥有自己的主目录(并且 显然可以在其中创建文件)。我的程序显然是唯一的 显示此类问题的程序。它已经被广泛使用 多年来,这是第一次报告此错误

access (2)的Linux联机帮助页上说

  

如果发现目录可写,则可能意味着   可以在目录中创建文件

为什么可能?为什么(何时)不总是 (除了竞争情况,例如有人在access()调用之后立即更改权限,完整的inode表或达到用户限制),所有这些似乎都没有就是这里的问题-尤其是因为access()调用失败,并且touch xxx成功。

0 个答案:

没有答案