c++ - 防止检查时间到使用时间?

标签 c++ linux file unix race-condition

我正在阅读: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/

相关文章:

c - 阻塞 recv() 与 fcntl()

algorithm - Intel hex 文件中任意大小的填充模式

GLUT游戏中的C++ LNK2019错误

c++ - 来自不同类型的模板类复制构造函数 : should it follow the Rule of Five?

c++ - 任何基于 libclang 的 C/C++ 重构工具? (甚至最简单的 "toy example")

c++ - 常数乘法的奇怪值

python - 有没有办法同时使用 fabric run() 和 sudo() ?

python - cd 到目录的 Bash 脚本?

java - 需要帮助读取 <> 之间的单词并保存到数组

file - 使用golang将字节数组转换回文件