可以使用竞争条件绕过 Samba 安全设置“宽链接”吗?

可以使用竞争条件绕过 Samba 安全设置“宽链接”吗?

Apache 有选项FollowSymLinksSymLinksIfOwnerMatch.然而,它们“不应被视为安全限制,因为符号链接测试受到竞争条件的影响,这使得它可以被规避。”与 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

相关内容