什么是模拟对系统O_NOFOLLOW没有这个标志的好办法?(What is a good way t

2019-10-22 08:07发布

我想安全地能够模拟openO_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOWO_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW上不支持系统O_NOFOLLOW 。 我可以在某种程度上实现什么,我要求有:

struct stat lst;
if (lstat(filename, &lst) != -1 && S_ISLNK(lst.st_mode)) {
    errno = ELOOP;
    return -1;
}

mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW, mode);

但后来我介绍一个竞争条件和可能的安全问题。

我想过,也许,只有用户能够编写,有点像创建一个虚拟文件touch荷兰国际集团filename ,做lstat检查,然后使用chmod我写完后(更正文件模式位),但我可能是俯瞰主要的东西(例如,如果在文件filename存在,不是一个普通的文件,或者已经是一个符号链接)。

你怎么看?

Answer 1:

你的建议仍然具有竞争条件:

  • 马洛里创建他要你跟随链接;
  • open()与链接O_CREAT ;
  • 马洛里替换常规文件的链接;
  • 你做你的lstat()测试,通过(不是链接);
  • 马洛里再次替换该链接的常规文件。

你可以解决这个问题的非O_TRUNC通过调用情况fstat()在打开的文件描述符以及lstat()的道路上,并确保.st_dev.st_ino成员是一样的。

但是,如果你使用这不起作用O_TRUNC -由您发现欺骗的时候,为时已晚-马洛里已经引起你截断你的重要文件之一。

我认为,传统的方式来消除孔没有O_NOFOLLOW支持:

  • 创建模式一个临时目录700 。 误差(或重试)如果mkdir()由于失败现有的目录;
  • 创建临时目录中的新文件;
  • 使用rename()临时文件原子移动到目标名称;
  • 删除临时目录。


文章来源: What is a good way to simulate O_NOFOLLOW on systems without this flag?