【发布时间】:2020-11-24 11:44:15
【问题描述】:
在我的应用程序中,我试图检查路径是否在特定目录中。例如,我希望我的应用程序的某些部分不能访问路径 /x/y/z 中的文件。我不能使用传统的文件权限,因为应用程序的其他部分应该能够访问这些文件。
一些互联网资源建议使用realpath 来首先规范化路径,即解析.. 的所有符号链接和实例(例如1、2)。
但是,似乎不可能在没有竞争条件 (TOCTOU) 的情况下执行路径解析,然后是 open。
char *resolved = realpath("/my/potentially/dangerous/path.txt", NULL);
// someone changes any part of the path to a symlink to something else <--- race condition
if (check_path(resolved)) {
// <--- race condition
int fd = open(resolved, O_RDONLY);
}
我是否忽略了某些东西,或者 POSIX(和 Linux)是否没有提供任何方法来在没有竞争条件的情况下执行此类操作?
【问题讨论】:
-
您的应用程序的这些孤立部分真的应该能够访问某个目录下的任何除了所有内容吗?你能不能把你的应用程序分成两个进程,将其中一个进程chroot到例如一个临时目录,然后在该目录下挂载它应该能够访问的所有内容?
-
您要防范什么?这似乎是classic XY problem。你有一些未知的问题,你已经决定如何解决它,你问的是解决方案,而不是你的实际问题。
-
这是一种进程内隔离(类似于vahldiek.github.io/project/erim),其中应用程序的某些部分是受信任的,而其他部分则不是。所以前提是只有一个进程。