web-dev-qa-db-ja.com

ルートに「許可が拒否されました」を与えるシンボリックリンク...

シンボリックリンクの作成を自動化する簡単なスクリプトを作成しました。

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

十分に単純です。今日の日付を取得して、シンボリックリンクを作成します。理想的には、深夜0時以降に-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」が非常によく説明されているわけではありません)、同じ問題が発生します。

11
Xkeeper

/ tmpには通常スティッキービットが設定されているため、protected_symlinksが原因で/ tmp/todayへのアクセスが拒否されます。この保護を無効にするには、

sysctl -w fs.protected_symlinks=0

protected_symlinks

長年のセキュリティ問題のクラスは、シンボリックリンクベースのTime-of-Check-Time-of-Useレースであり、/ tmpのような誰でも書き込み可能なディレクトリで最も一般的に見られます。この欠陥を悪用する一般的な方法は、特定のシンボリックリンクをたどるときに特権の境界を越えることです(つまり、ルートプロセスは別のユーザーに属するシンボリックリンクをたどります)。何百年にもわたる数百の例の不完全なリストについては、以下を参照してください: http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=/tmp

「0」に設定すると、シンボリックリンクの追従動作に制限はありません。

「1」に設定すると、シンボリックリンクは、スティッキーな誰でも書き込み可能なディレクトリの外にある場合、シンボリックリンクとフォロワーのuidが一致する場合、またはディレクトリ所有者がシンボリックリンクの所有者と一致する場合にのみフォローできます。

この保護は、Openwallとgrsecurityの制限に基づいています。

詳細については、 this を確認してください。

12
wenzul