将“权限被拒绝”的符号链接...给根

Posted

技术标签:

【中文标题】将“权限被拒绝”的符号链接...给根【英文标题】:Symlink giving "Permission denied"... to root 【发布时间】:2014-12-17 05:56:43 【问题描述】:

我编写了一个简单的脚本来自动创建符号链接。

#!/pseudo
today = "/tmp/" + date("Y-m-d")
exec("ln -sf " + today + " /tmp/today")

足够简单;获取今天的日期并进行符号链接。理想情况下在午夜之后使用 -f 运行,因此它只是就地更新它。

这很好用! ...为我的用户。

xkeeper /tmp$ ls -ltr
drwxrwxrwx  xkeeper   xkeeper   2014-10-21
lrwxrwxrwx  xkeeper   xkeeper   today -> /tmp/2014-10-21/

xkeeper /tmp$ cd today
xkeeper /tmp/today$ cd ..

请注意,它工作正常,所有权限都是世界可读的,一切看起来都很好。

但是如果其他人想使用这个链接(我们会说,root,但任何其他用户都有这个问题),就会发生非常奇怪的事情:

root /tmp# cd today
bash: cd: today: Permission denied

我完全不知道为什么会这样。我也尝试使用ln -s -n -f 创建链接(不是“--no-dereferencing”解释得很好),但出现了同样的问题。

【问题讨论】:

请注意,如果我使用 root 自己创建链接(所有其他用户都可以访问它),它工作得非常好,但这并不能真正解释为什么如果由 其他用户。 #!/pseudo 是什么意思? 好吧,很奇怪。我尝试在/var/www/ 的某个临时文件夹中以相同的方式创建一个链接,它按预期工作,没有权限错误。到底是什么。 @wenzul ...什么?这有参考吗?这是我第一次听到这样的事情,而谷歌搜索却一无所获。它也违背了根在 40 年的 Unix 和一般计算中的传统角色...... @andlabs 好的,我的意思是 /tmp 的这种差异行为,但可能使用了错误的词... 【参考方案1】:

由于 /tmp 通常设置了粘滞位,因此对 /tmp/today 的访问会因protected_symlinks 而被拒绝。 您可以通过设置禁用此保护

sysctl -w fs.protected_symlinks=0

protected_symlinks:

长期存在的一类安全问题是基于符号链接的 time-of-check-time-of-use 竞赛,最常见于 world-writable /tmp 等目录。利用该漏洞的常用方法 是在遵循给定符号链接时跨越特权边界(即 root 进程遵循属于另一个用户的符号链接)。对于一个可能 多年来数百个示例的不完整列表,请参阅: http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=/tmp

当设置为“0”时,符号链接跟随行为不受限制。

当设置为“1”时,符号链接只允许在外面时被遵循 一个粘性的世界可写目录,或者当符号链接的 uid 和 追随者匹配,或者当目录所有者与符号链接的所有者匹配时。

此保护基于 Openwall 和 grsecurity 中的限制。

更多详情请查看this。

【讨论】:

这很有道理,并解释了为什么它可以在其他目录中工作...还解释了为什么以 root 身份创建链接有效(因为 root 还拥有 /tmp)。 很好的答案,这让我省了很多苦头。谢谢!

以上是关于将“权限被拒绝”的符号链接...给根的主要内容,如果未能解决你的问题,请参考以下文章

创建符号链接时权限被拒绝

“npm -g yarn”给出“权限被拒绝,符号链接......”但正确的权限确实存在[重复]

在 777 我的整个应用程序之后“无法打开流:权限被拒绝”

在终端中安装 Sublime Text 的命令行工具“subl”,权限被拒绝?

在终端中安装 Sublime Text 的命令行工具“subl”,权限被拒绝?

markdown “无法取消链接,权限被拒绝”错误