【问题标题】:Protecting against Time-of-check to time-of-use?防止检查时间到使用时间?
【发布时间】:2021-11-24 15:54:30
【问题描述】:

我正在阅读:https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use

他们证明这段代码有问题,我完全理解为什么会这样:

if (access("file", W_OK) != 0) {
    exit(1);
}
// Attacker: symlink("/etc/passwd", "file");
fd = open("file", O_WRONLY);
// Actually writing over /etc/passwd
write(fd, buffer, sizeof(buffer));

但真正的问题是如何防范此类攻击?

【问题讨论】:

    标签: c++ linux file unix race-condition


    【解决方案1】:

    您可以使用O_NOFOLLOW 标志。如果路径的basename 是符号链接,它将导致open 失败。这将解决所描述的攻击。

    要覆盖目录路径中的链接,您可以检查 frealpath(fd, ...) 是否符合您的预期。

    防止进程覆盖/etc/passwd 的另一种方法是以非root 身份运行它,这样它就没有权限。或者,您可以使用 chroot - 或更一般地说,一个容器 - 来防止主机系统的 /etc/passwd 对进程可见。

    更一般地说,文件系统 TOCTOU 目前在 Linux 上是无法解决的。您将需要文件系统或系统调用级别的事务支持——这是缺乏的。

    【讨论】:

    • 我不完全确定(也没有测试过),但我认为可以通过使用O_PATHopen 标志来缓解其中的一些问题,可能通过@987654329 打开文件@检查fstat后。或者可能将其与name_to_handle_atopen_by_handle_at 一起使用(尽管这需要特定的使用能力)。
    • "如果路径的basename是符号链接会导致打开失败。"符号链接文件在其内容中有目的地,那么这将如何工作?任何例子
    • @Dan 如果文件是符号链接,那么打开就会失败。这就是 O_NOFOLLOW 所做的。
    • @eerorika 但这总是有效吗?硬链接呢?也许有一些我不知道的东西可以做类似于符号链接的事情......
    【解决方案2】:

    没有万无一失的解决方案。

    还要注意Rice's theorem。这可能是相关的。

    但是您可以采用系统范围的约定(并记录下来),即每个访问给定文件的程序都使用锁定设施,例如 flock(2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2014-04-27
      • 2017-05-05
      • 2011-03-05
      • 1970-01-01
      • 2020-05-18
      • 2011-03-12
      • 1970-01-01
      相关资源
      最近更新 更多