我正在阅读: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));
但真正的问题是如何防范此类漏洞?
最佳答案
您可以使用O_NOFOLLOW
标志。如果路径的basename
是符号链接(symbolic link),则会导致open
失败。这将解决所描述的攻击。</p>
要覆盖目录路径上的链接,您可以检查 frealpath(fd, ...)
是否符合您的预期。
防止进程覆盖 /etc/passwd
的另一种方法是以非 root 身份运行它,这样它就没有权限。或者,您可以使用 chroot(或更一般地说,容器)来防止主机系统的 /etc/passwd
对进程可见。
更一般地说,文件系统 TOCTOU 目前在 Linux 上无法解析。您需要文件系统或系统调用级别的事务支持 - 这是缺乏的。
关于c++ - 防止检查时间到使用时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69432326/