2014-10-21 79 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