符号链接给“权限被拒绝”…为根

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

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

够简单; 得到今天的date,并作出符号链接。 最好在午夜之后用-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 /tmp# cd today bash: cd: today: Permission denied 

为什么这是我完全丧失的。 我也试着用ln -s -n -f创build链接(不是说“ --no-dereferencing ”很好解释),但同样的问题出现。

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

 sysctl -w fs.protected_symlinks=0 

protected_symlinks :

一个长期存在的安全问题是基于符号链接的检查时间使用比赛,这种比赛在世界上可读的目录/ tmp中最常见。 利用这个缺陷的常见方法是在遵循给定的符号链接(即,根进程遵循属于另一个用户的符号链接)时跨越特权边界。 有关这些年来数百个示例的可能不完整列表,请参阅: http : //cve.mitre.org/cgi-bin/cvekey.cgi?keyword=/tmp

当设置为“0”时,符号链接的下面的行为是不受限制的。

当设置为“1”时,符号链接只能在粘性世界可写目录之外,或者符号链接和跟随者的uid匹配,或者目录所有者与符号链接的所有者相匹配时被允许跟随。

这种保护是基于Openwall和grsecurity中的限制。

进一步的细节检查这一点 。