2014-10-21 71 views
9

我写了一个简单的脚本来自动创建一个符号链接。给予“权限被拒绝”的符号链接...到根

#!/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 /tmp# cd today 
bash: cd: today: Permission denied 

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

+0

请注意,如果我使用root创建链接本身(所有其他用户都可以访问它),它的工作方式会非常好,但这并不能解释为什么它在* other *用户创建时不起作用。 – Xkeeper 2014-10-21 21:08:19

+0

什么意思'#!/ pseudo'? – hek2mgl 2014-10-21 21:13:57

+0

好吧,很奇怪。我尝试在'/ var/www /'中的某个临时文件夹中以相同的方式创建一个链接,并且它按预期工作,没有许可错误。世界上是什么? – Xkeeper 2014-10-21 21:31:29

回答

11

由于/ tmp通常设置了粘滞位,因此对/ tmp/today的访问被拒绝,因为protected_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中的限制。

有关详细信息,请检查this

+0

这很有道理,并解释了为什么它在其他目录中工作......还解释了为什么创建一个链接作为根作品因为root也拥有'/ tmp')。 – Xkeeper 2014-10-21 23:35:22