Apache 有选项FollowSymLinks
和SymLinksIfOwnerMatch
.然而,它们“不应被视为安全限制,因为符号链接测试受到竞争条件的影响,这使得它可以被规避。”与 Samba 比较:
Samba 有一个选项称为wide links
:
注意:启用 UNIX 扩展时打开此参数将允许 UNIX 客户端在共享上创建符号链接,该符号链接可以指向共享定义导出的受限路径之外的文件或目录。这可能会导致访问共享之外的区域。由于此问题,如果该
unix extensions
选项打开,则该参数将自动禁用(在日志文件中显示一条消息)。
allow insecure wide links
如果您希望更改两个参数之间的耦合,请参阅该参数。
Samba 选项可以通过竞争条件绕过吗?
如果不是,Samba 如何能够防止竞争状况?例如,可以使用什么操作顺序来防止竞争条件?
答案1
肯定是曾是易受伤害的。看CVE-2017-2619。
这修补因为这个错误包含一个新函数,称为open_dir_safely()
.它用于chdir()
输入包含要打开的文件的目录。
我想这意味着您可以使用getcwd()
, 来检查您是否仍在 Samba 共享目录中。至少这在 Linux 上可以很好地工作,因为它对getcwd()
.我还没有确认 Samba 之后到底做了什么chdir()
。
如果您的进程有多个线程,这不太好,因为chdir()
会影响整个进程:-)。 Linux 特定程序可以改为使用open()
该O_PATH
标志,然后readlink()
在/proc/self/fd/
.
上面可以提供有关包含该文件的目录的保证。为确保文件当您将名称传递给 时,名称不会解析为链接open()
,您可以使用该O_NOFOLLOW
标志。如果它是符号链接,open()
将返回ELOOP
.然后您可以readlink()
自己处理文件并解析符号链接。这将涉及从头开始重复该过程:-)。
如果您必须重复该过程“太多”次,那么您可能会返回失败(ELOOP
再次)。 (如果您必须重试太多次,因为有人在扮演愚蠢的乞丐并在open(... O_NOFOLLOW)
和之间反复更改文件,情况也是如此readlink()
)。
在非 Linux 操作系统上,您可能没有非常高效的getcwd()
.如果有O_PATH
,那么您可以getcwd()
通过迭代来避免每一个路径段,使用O_PATH
+O_NOFOLLOW
并手动解析链接。
将来,这个问题可能会通过一些特定的标志来解决,例如AT_PATH_BENEATH 或 O_BENEATH。